extract from the subid the options
[libav.git] / libavcodec / rv10.c
CommitLineData
de6d9b64
FB
1/*
2 * RV10 codec
ff4ec49e 3 * Copyright (c) 2000,2001 Fabrice Bellard.
8f2ab833 4 * Copyright (c) 2002-2004 Michael Niedermayer
de6d9b64 5 *
ff4ec49e
FB
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
de6d9b64 10 *
ff4ec49e 11 * This library is distributed in the hope that it will be useful,
de6d9b64 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ff4ec49e
FB
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
de6d9b64 15 *
ff4ec49e
FB
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
de6d9b64 19 */
983e3246
MN
20
21/**
22 * @file rv10.c
23 * RV10 codec.
24 */
25
de6d9b64 26#include "avcodec.h"
6000abfa 27#include "dsputil.h"
de6d9b64
FB
28#include "mpegvideo.h"
29
30//#define DEBUG
31
68bd11f5 32#define DC_VLC_BITS 14 //FIXME find a better solution
a3494679 33
0c1a9eda 34static const uint16_t rv_lum_code[256] =
de6d9b64
FB
35{
36 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
37 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
38 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
39 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
40 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
41 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
42 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
43 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
44 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
45 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
46 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
47 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
48 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
49 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
50 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
51 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
52 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
53 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
54 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
55 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
56 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
57 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
58 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
59 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
60 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
61 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
62 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
63 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
64 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
65 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
66 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
67 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
68};
69
0c1a9eda 70static const uint8_t rv_lum_bits[256] =
de6d9b64
FB
71{
72 14, 12, 12, 12, 12, 12, 12, 12,
73 12, 12, 12, 12, 12, 12, 12, 12,
74 12, 12, 12, 12, 12, 12, 12, 12,
75 12, 12, 12, 12, 12, 12, 12, 12,
76 12, 12, 12, 12, 12, 12, 12, 12,
77 12, 12, 12, 12, 12, 12, 12, 12,
78 12, 12, 12, 12, 12, 12, 12, 12,
79 12, 12, 12, 12, 12, 12, 12, 12,
80 12, 10, 10, 10, 10, 10, 10, 10,
81 10, 10, 10, 10, 10, 10, 10, 10,
82 10, 10, 10, 10, 10, 10, 10, 10,
83 10, 10, 10, 10, 10, 10, 10, 10,
84 10, 8, 8, 8, 8, 8, 8, 8,
85 8, 8, 8, 8, 8, 8, 8, 8,
86 8, 7, 7, 7, 7, 7, 7, 7,
87 7, 6, 6, 6, 6, 5, 5, 4,
88 2, 4, 5, 5, 6, 6, 6, 6,
89 7, 7, 7, 7, 7, 7, 7, 7,
90 8, 8, 8, 8, 8, 8, 8, 8,
91 8, 8, 8, 8, 8, 8, 8, 8,
92 10, 10, 10, 10, 10, 10, 10, 10,
93 10, 10, 10, 10, 10, 10, 10, 10,
94 10, 10, 10, 10, 10, 10, 10, 10,
95 10, 10, 10, 10, 10, 10, 10, 10,
96 12, 12, 12, 12, 12, 12, 12, 12,
97 12, 12, 12, 12, 12, 12, 12, 12,
98 12, 12, 12, 12, 12, 12, 12, 12,
99 12, 12, 12, 12, 12, 12, 12, 12,
100 12, 12, 12, 12, 12, 12, 12, 12,
101 12, 12, 12, 12, 12, 12, 12, 12,
102 12, 12, 12, 12, 12, 12, 12, 12,
103 12, 12, 12, 12, 12, 12, 12, 12,
104};
105
0c1a9eda 106static const uint16_t rv_chrom_code[256] =
de6d9b64
FB
107{
108 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
109 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
110 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
111 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
112 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
113 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
114 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
115 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
116 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
117 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
118 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
119 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
120 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
121 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
122 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
123 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
124 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
125 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
126 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
127 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
128 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
129 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
130 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
131 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
132 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
133 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
134 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
135 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
136 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
137 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
138 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
139 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
140};
141
0c1a9eda 142static const uint8_t rv_chrom_bits[256] =
de6d9b64
FB
143{
144 16, 14, 14, 14, 14, 14, 14, 14,
145 14, 14, 14, 14, 14, 14, 14, 14,
146 14, 14, 14, 14, 14, 14, 14, 14,
147 14, 14, 14, 14, 14, 14, 14, 14,
148 14, 14, 14, 14, 14, 14, 14, 14,
149 14, 14, 14, 14, 14, 14, 14, 14,
150 14, 14, 14, 14, 14, 14, 14, 14,
151 14, 14, 14, 14, 14, 14, 14, 14,
152 14, 12, 12, 12, 12, 12, 12, 12,
153 12, 12, 12, 12, 12, 12, 12, 12,
154 12, 12, 12, 12, 12, 12, 12, 12,
155 12, 12, 12, 12, 12, 12, 12, 12,
156 12, 10, 10, 10, 10, 10, 10, 10,
157 10, 10, 10, 10, 10, 10, 10, 10,
158 10, 8, 8, 8, 8, 8, 8, 8,
159 8, 6, 6, 6, 6, 4, 4, 3,
160 2, 3, 4, 4, 6, 6, 6, 6,
161 8, 8, 8, 8, 8, 8, 8, 8,
162 10, 10, 10, 10, 10, 10, 10, 10,
163 10, 10, 10, 10, 10, 10, 10, 10,
164 12, 12, 12, 12, 12, 12, 12, 12,
165 12, 12, 12, 12, 12, 12, 12, 12,
166 12, 12, 12, 12, 12, 12, 12, 12,
167 12, 12, 12, 12, 12, 12, 12, 12,
168 14, 14, 14, 14, 14, 14, 14, 14,
169 14, 14, 14, 14, 14, 14, 14, 14,
170 14, 14, 14, 14, 14, 14, 14, 14,
171 14, 14, 14, 14, 14, 14, 14, 14,
172 14, 14, 14, 14, 14, 14, 14, 14,
173 14, 14, 14, 14, 14, 14, 14, 14,
174 14, 14, 14, 14, 14, 14, 14, 14,
175 14, 14, 14, 14, 14, 14, 14, 14,
176};
177
178static VLC rv_dc_lum, rv_dc_chrom;
179
180int rv_decode_dc(MpegEncContext *s, int n)
181{
182 int code;
183
184 if (n < 4) {
a3494679 185 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
de6d9b64
FB
186 if (code < 0) {
187 /* XXX: I don't understand why they use LONGER codes than
188 necessary. The following code would be completely useless
189 if they had thought about it !!! */
190 code = get_bits(&s->gb, 7);
191 if (code == 0x7c) {
0c1a9eda 192 code = (int8_t)(get_bits(&s->gb, 7) + 1);
de6d9b64
FB
193 } else if (code == 0x7d) {
194 code = -128 + get_bits(&s->gb, 7);
195 } else if (code == 0x7e) {
196 if (get_bits(&s->gb, 1) == 0)
0c1a9eda 197 code = (int8_t)(get_bits(&s->gb, 8) + 1);
de6d9b64 198 else
0c1a9eda 199 code = (int8_t)(get_bits(&s->gb, 8));
de6d9b64
FB
200 } else if (code == 0x7f) {
201 get_bits(&s->gb, 11);
202 code = 1;
203 }
204 } else {
205 code -= 128;
206 }
207 } else {
a3494679 208 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
de6d9b64
FB
209 /* same remark */
210 if (code < 0) {
211 code = get_bits(&s->gb, 9);
212 if (code == 0x1fc) {
0c1a9eda 213 code = (int8_t)(get_bits(&s->gb, 7) + 1);
de6d9b64
FB
214 } else if (code == 0x1fd) {
215 code = -128 + get_bits(&s->gb, 7);
216 } else if (code == 0x1fe) {
217 get_bits(&s->gb, 9);
218 code = 1;
219 } else {
9b879566 220 av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n");
de6d9b64
FB
221 return 0xffff;
222 }
223 } else {
224 code -= 128;
225 }
226 }
227 return -code;
228}
229
7604246d
WH
230#ifdef CONFIG_ENCODERS
231
de6d9b64
FB
232/* write RV 1.0 compatible frame header */
233void rv10_encode_picture_header(MpegEncContext *s, int picture_number)
234{
4c2bc159 235 int full_frame= 0;
0b61920a 236
de6d9b64 237 align_put_bits(&s->pb);
0b61920a 238
de6d9b64
FB
239 put_bits(&s->pb, 1, 1); /* marker */
240
241 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
242
243 put_bits(&s->pb, 1, 0); /* not PB frame */
244
245 put_bits(&s->pb, 5, s->qscale);
246
247 if (s->pict_type == I_TYPE) {
248 /* specific MPEG like DC coding not used */
249 }
250 /* if multiple packets per frame are sent, the position at which
251 to display the macro blocks is coded here */
0b61920a
MN
252 if(!full_frame){
253 put_bits(&s->pb, 6, 0); /* mb_x */
254 put_bits(&s->pb, 6, 0); /* mb_y */
255 put_bits(&s->pb, 12, s->mb_width * s->mb_height);
256 }
de6d9b64
FB
257
258 put_bits(&s->pb, 3, 0); /* ignored */
259}
260
d0271e8a
MN
261void rv20_encode_picture_header(MpegEncContext *s, int picture_number){
262 put_bits(&s->pb, 2, s->pict_type); //I 0 vs. 1 ?
263 put_bits(&s->pb, 1, 0); /* unknown bit */
264 put_bits(&s->pb, 5, s->qscale);
265
266 put_bits(&s->pb, 8, picture_number&0xFF); //FIXME wrong, but correct is not known
267 s->mb_x= s->mb_y= 0;
268 ff_h263_encode_mba(s);
269
270 put_bits(&s->pb, 1, s->no_rounding);
271
272 assert(s->f_code == 1);
273 assert(s->unrestricted_mv == 1);
274// assert(s->h263_aic== (s->pict_type == I_TYPE));
275 assert(s->alt_inter_vlc == 0);
276 assert(s->umvplus == 0);
277 assert(s->modified_quant==1);
278 assert(s->loop_filter==1);
279
280 s->h263_aic= s->pict_type == I_TYPE;
281 if(s->h263_aic){
282 s->y_dc_scale_table=
283 s->c_dc_scale_table= ff_aic_dc_scale_table;
284 }else{
285 s->y_dc_scale_table=
286 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
287 }
288}
289
88730be6 290#if 0 /* unused, remove? */
de6d9b64
FB
291static int get_num(GetBitContext *gb)
292{
293 int n, n1;
294
295 n = get_bits(gb, 16);
296 if (n >= 0x4000) {
297 return n - 0x4000;
298 } else {
299 n1 = get_bits(gb, 16);
300 return (n << 16) | n1;
301 }
302}
88730be6 303#endif
de6d9b64 304
7604246d
WH
305#endif //CONFIG_ENCODERS
306
de6d9b64
FB
307/* read RV 1.0 compatible frame header */
308static int rv10_decode_picture_header(MpegEncContext *s)
309{
18ade954 310 int mb_count, pb_frame, marker, unk, mb_xy;
de6d9b64 311
144f0625 312//printf("ff:%d\n", full_frame);
de6d9b64
FB
313 marker = get_bits(&s->gb, 1);
314
315 if (get_bits(&s->gb, 1))
316 s->pict_type = P_TYPE;
317 else
318 s->pict_type = I_TYPE;
144f0625 319//printf("h:%X ver:%d\n",h,s->rv10_version);
9b879566 320 if(!marker) av_log(s->avctx, AV_LOG_ERROR, "marker missing\n");
de6d9b64
FB
321 pb_frame = get_bits(&s->gb, 1);
322
323#ifdef DEBUG
324 printf("pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
325#endif
326
68bd11f5 327 if (pb_frame){
9b879566 328 av_log(s->avctx, AV_LOG_ERROR, "pb frame not supported\n");
de6d9b64 329 return -1;
68bd11f5 330 }
de6d9b64
FB
331
332 s->qscale = get_bits(&s->gb, 5);
ee3b2be6 333 if(s->qscale==0){
9b879566 334 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
ee3b2be6
MN
335 return -1;
336 }
de6d9b64
FB
337
338 if (s->pict_type == I_TYPE) {
339 if (s->rv10_version == 3) {
340 /* specific MPEG like DC coding not used */
341 s->last_dc[0] = get_bits(&s->gb, 8);
342 s->last_dc[1] = get_bits(&s->gb, 8);
343 s->last_dc[2] = get_bits(&s->gb, 8);
344#ifdef DEBUG
345 printf("DC:%d %d %d\n",
346 s->last_dc[0],
347 s->last_dc[1],
348 s->last_dc[2]);
349#endif
350 }
351 }
352 /* if multiple packets per frame are sent, the position at which
353 to display the macro blocks is coded here */
18ade954
MN
354
355 mb_xy= s->mb_x + s->mb_y*s->mb_width;
356 if(show_bits(&s->gb, 12)==0 || (mb_xy && mb_xy < s->mb_num)){
de6d9b64
FB
357 s->mb_x = get_bits(&s->gb, 6); /* mb_x */
358 s->mb_y = get_bits(&s->gb, 6); /* mb_y */
359 mb_count = get_bits(&s->gb, 12);
360 } else {
361 s->mb_x = 0;
362 s->mb_y = 0;
363 mb_count = s->mb_width * s->mb_height;
364 }
68bd11f5
MN
365 unk= get_bits(&s->gb, 3); /* ignored */
366//printf("%d\n", unk);
de6d9b64
FB
367 s->f_code = 1;
368 s->unrestricted_mv = 1;
255b3ac2 369
de6d9b64
FB
370 return mb_count;
371}
372
68b94c35
MN
373static int rv20_decode_picture_header(MpegEncContext *s)
374{
473c7582 375 int seq, mb_pos, i;
b40cd4e0 376
35ef76b5
MN
377#if 0
378 GetBitContext gb= s->gb;
379 for(i=0; i<64; i++){
380 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&gb));
381 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
382 }
383 av_log(s->avctx, AV_LOG_DEBUG, "\n");
384#endif
423962dc
MN
385#if 0
386 for(i=0; i<s->avctx->extradata_size; i++){
387 av_log(s->avctx, AV_LOG_DEBUG, "%2X ", ((uint8_t*)s->avctx->extradata)[i]);
388 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
389 }
390 av_log(s->avctx, AV_LOG_DEBUG, "\n");
391#endif
35ef76b5 392
b40cd4e0
MN
393 if(s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){
394 if (get_bits(&s->gb, 3)){
395 av_log(s->avctx, AV_LOG_ERROR, "unknown triplet set\n");
396 return -1;
397 }
398 }
473c7582
MN
399
400 i= get_bits(&s->gb, 2);
401 switch(i){
402 case 0: s->pict_type= I_TYPE; break;
248a1aa5 403 case 1: s->pict_type= I_TYPE; break; //hmm ...
473c7582
MN
404 case 2: s->pict_type= P_TYPE; break;
405 case 3: s->pict_type= B_TYPE; break;
406 default:
407 av_log(s->avctx, AV_LOG_ERROR, "unknown frame type\n");
408 return -1;
409 }
410
fddae1c3
MN
411 if(s->last_picture_ptr==NULL && s->pict_type==B_TYPE){
412 av_log(s->avctx, AV_LOG_ERROR, "early B pix\n");
413 return -1;
414 }
415
473c7582
MN
416 if (get_bits(&s->gb, 1)){
417 av_log(s->avctx, AV_LOG_ERROR, "unknown bit set\n");
68b94c35
MN
418 return -1;
419 }
420
421 s->qscale = get_bits(&s->gb, 5);
422 if(s->qscale==0){
423 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
424 return -1;
425 }
b40cd4e0
MN
426 if(s->avctx->sub_id == 0x30203002){
427 if (get_bits(&s->gb, 1)){
428 av_log(s->avctx, AV_LOG_ERROR, "unknown bit2 set\n");
429 return -1;
430 }
431 }
432
ac49f3ef 433 if(s->avctx->has_b_frames){
74679f5c
MN
434 int f=9;
435 int v= s->avctx->extradata_size >= 4 ? ((uint8_t*)s->avctx->extradata)[1] : 0;
bc17df09 436
b40cd4e0 437 if (get_bits(&s->gb, 1)){
bc17df09 438 av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n");
bed1707c 439// return -1;
b40cd4e0 440 }
423962dc 441 seq= get_bits(&s->gb, 14)<<1;
74679f5c 442
9786bd4d
MN
443 if(v)
444 f= get_bits(&s->gb, av_log2(v));
445
bc17df09 446 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
f6d51123 447 av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, v);
9993064e 448 }
9786bd4d
MN
449 }else{
450 seq= get_bits(&s->gb, 8)*128;
451 }
423962dc 452
9786bd4d
MN
453// if(s->avctx->sub_id <= 0x20201002){ //0x20201002 definitely needs this
454 mb_pos= ff_h263_decode_mba(s);
455/* }else{
423962dc
MN
456 mb_pos= get_bits(&s->gb, av_log2(s->mb_num-1)+1);
457 s->mb_x= mb_pos % s->mb_width;
458 s->mb_y= mb_pos / s->mb_width;
9786bd4d 459 }*/
a3c22fbc 460//av_log(s->avctx, AV_LOG_DEBUG, "%d\n", seq);
b40cd4e0
MN
461 seq |= s->time &~0x7FFF;
462 if(seq - s->time > 0x4000) seq -= 0x8000;
463 if(seq - s->time < -0x4000) seq += 0x8000;
464 if(seq != s->time){
465 if(s->pict_type!=B_TYPE){
466 s->time= seq;
467 s->pp_time= s->time - s->last_non_b_time;
468 s->last_non_b_time= s->time;
469 }else{
470 s->time= seq;
471 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
472 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
160d679c
MM
473 av_log(s->avctx, AV_LOG_DEBUG, "messed up order, possible from seeking? skipping current b frame\n");
474 return FRAME_SKIPPED;
b40cd4e0
MN
475 }
476 }
477 }
478// printf("%d %d %d %d %d\n", seq, (int)s->time, (int)s->last_non_b_time, s->pp_time, s->pb_time);
a3c22fbc
MN
479/*for(i=0; i<32; i++){
480 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
481}
482av_log(s->avctx, AV_LOG_DEBUG, "\n");*/
68b94c35
MN
483 s->no_rounding= get_bits1(&s->gb);
484
485 s->f_code = 1;
486 s->unrestricted_mv = 1;
487 s->h263_aic= s->pict_type == I_TYPE;
488// s->alt_inter_vlc=1;
489// s->obmc=1;
490// s->umvplus=1;
332f9ac4
MN
491 s->modified_quant=1;
492 s->loop_filter=1;
68b94c35
MN
493
494 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
473c7582 495 av_log(s->avctx, AV_LOG_INFO, "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n",
68b94c35
MN
496 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding);
497 }
498
b40cd4e0 499 assert(s->pict_type != B_TYPE || !s->low_delay);
473c7582 500
68b94c35
MN
501 return s->mb_width*s->mb_height - mb_pos;
502}
503
de6d9b64
FB
504static int rv10_decode_init(AVCodecContext *avctx)
505{
506 MpegEncContext *s = avctx->priv_data;
7604246d 507 static int done=0;
de6d9b64 508
3edcacde
MN
509 MPV_decode_defaults(s);
510
9db99069 511 s->avctx= avctx;
de6d9b64 512 s->out_format = FMT_H263;
40a12840 513 s->codec_id= avctx->codec_id;
de6d9b64
FB
514
515 s->width = avctx->width;
516 s->height = avctx->height;
517
144f0625
MN
518 switch(avctx->sub_id){
519 case 0x10000000:
520 s->rv10_version= 0;
521 s->h263_long_vectors=0;
b40cd4e0 522 s->low_delay=1;
144f0625 523 break;
8a36717a
MN
524 case 0x10002000:
525 s->rv10_version= 3;
526 s->h263_long_vectors=1;
527 s->low_delay=1;
528 s->obmc=1;
529 break;
144f0625
MN
530 case 0x10003000:
531 s->rv10_version= 3;
532 s->h263_long_vectors=1;
b40cd4e0 533 s->low_delay=1;
144f0625
MN
534 break;
535 case 0x10003001:
536 s->rv10_version= 3;
537 s->h263_long_vectors=0;
b40cd4e0 538 s->low_delay=1;
144f0625 539 break;
f9e0f2a2
MC
540 case 0x20001000: /* real rv20 decoder fail on this id */
541 /*case 0x20100001:
ac49f3ef 542 case 0x20101001:
f9e0f2a2
MC
543 case 0x20103001:*/
544 case 0x20100000 ... 0x2019ffff:
ac49f3ef
MN
545 s->low_delay=1;
546 break;
f9e0f2a2 547 /*case 0x20200002:
a3c22fbc 548 case 0x20201002:
f9e0f2a2
MC
549 case 0x20203002:*/
550 case 0x20200002 ... 0x202fffff:
ac49f3ef
MN
551 case 0x30202002:
552 case 0x30203002:
553 s->low_delay=0;
554 s->avctx->has_b_frames=1;
555 break;
144f0625 556 default:
9b879566 557 av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id);
255b3ac2 558 }
423962dc
MN
559
560 if(avctx->debug & FF_DEBUG_PICT_INFO){
561 av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1);
562 }
563
de6d9b64
FB
564 if (MPV_common_init(s) < 0)
565 return -1;
566
567 h263_decode_init_vlc(s);
568
569 /* init rv vlc */
570 if (!done) {
a3494679 571 init_vlc(&rv_dc_lum, DC_VLC_BITS, 256,
de6d9b64 572 rv_lum_bits, 1, 1,
073c2593 573 rv_lum_code, 2, 2, 1);
a3494679 574 init_vlc(&rv_dc_chrom, DC_VLC_BITS, 256,
de6d9b64 575 rv_chrom_bits, 1, 1,
073c2593 576 rv_chrom_code, 2, 2, 1);
de6d9b64
FB
577 done = 1;
578 }
ebc51331
JS
579
580 avctx->pix_fmt = PIX_FMT_YUV420P;
de6d9b64
FB
581
582 return 0;
583}
584
585static int rv10_decode_end(AVCodecContext *avctx)
586{
587 MpegEncContext *s = avctx->priv_data;
588
589 MPV_common_end(s);
590 return 0;
591}
592
144f0625 593static int rv10_decode_packet(AVCodecContext *avctx,
0c1a9eda 594 uint8_t *buf, int buf_size)
de6d9b64
FB
595{
596 MpegEncContext *s = avctx->priv_data;
4df8ca9d 597 int mb_count, mb_pos, left;
de6d9b64 598
68f593b4 599 init_get_bits(&s->gb, buf, buf_size*8);
68b94c35
MN
600 if(s->codec_id ==CODEC_ID_RV10)
601 mb_count = rv10_decode_picture_header(s);
602 else
603 mb_count = rv20_decode_picture_header(s);
de6d9b64 604 if (mb_count < 0) {
9b879566 605 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
de6d9b64
FB
606 return -1;
607 }
608
609 if (s->mb_x >= s->mb_width ||
610 s->mb_y >= s->mb_height) {
9b879566 611 av_log(s->avctx, AV_LOG_ERROR, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
de6d9b64
FB
612 return -1;
613 }
614 mb_pos = s->mb_y * s->mb_width + s->mb_x;
615 left = s->mb_width * s->mb_height - mb_pos;
616 if (mb_count > left) {
9b879566 617 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n");
de6d9b64
FB
618 return -1;
619 }
68b94c35 620//if(s->pict_type == P_TYPE) return 0;
de6d9b64 621
bed1707c 622 if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) {
d6db1c9c
MN
623 if(MPV_frame_start(s, avctx) < 0)
624 return -1;
de6d9b64
FB
625 }
626
627#ifdef DEBUG
628 printf("qscale=%d\n", s->qscale);
629#endif
630
631 /* default quantization values */
68b94c35
MN
632 if(s->codec_id== CODEC_ID_RV10){
633 if(s->mb_y==0) s->first_slice_line=1;
634 }else{
635 s->first_slice_line=1;
636 s->resync_mb_x= s->mb_x;
637 s->resync_mb_y= s->mb_y;
638 }
639 if(s->h263_aic){
640 s->y_dc_scale_table=
641 s->c_dc_scale_table= ff_aic_dc_scale_table;
642 }else{
643 s->y_dc_scale_table=
644 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
645 }
332f9ac4
MN
646
647 if(s->modified_quant)
648 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
649
554daa24 650 ff_set_qscale(s, s->qscale);
332f9ac4 651
de6d9b64
FB
652 s->rv10_first_dc_coded[0] = 0;
653 s->rv10_first_dc_coded[1] = 0;
654 s->rv10_first_dc_coded[2] = 0;
8e784825 655//printf("%d %X %X\n", s->pict_type, s->current_picture.motion_val[0], s->current_picture.motion_val[1]);
ab00685a
MN
656 s->block_wrap[0]=
657 s->block_wrap[1]=
658 s->block_wrap[2]=
137c8468 659 s->block_wrap[3]= s->b8_stride;
ab00685a 660 s->block_wrap[4]=
137c8468 661 s->block_wrap[5]= s->mb_stride;
4d2858de 662 ff_init_block_index(s);
de6d9b64 663 /* decode each macroblock */
8a36717a
MN
664
665 for(s->mb_num_left= mb_count; s->mb_num_left>0; s->mb_num_left--) {
68b94c35 666 int ret;
4d2858de 667 ff_update_block_index(s);
de6d9b64
FB
668#ifdef DEBUG
669 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
670#endif
8a36717a 671
eb4b3dd3 672 s->dsp.clear_blocks(s->block[0]);
de6d9b64
FB
673 s->mv_dir = MV_DIR_FORWARD;
674 s->mv_type = MV_TYPE_16X16;
68b94c35
MN
675 ret=ff_h263_decode_mb(s, s->block);
676
677 if (ret == SLICE_ERROR) {
9b879566 678 av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
de6d9b64
FB
679 return -1;
680 }
8e784825
MN
681 if(s->pict_type != B_TYPE)
682 ff_h263_update_motion_val(s);
4d2858de 683 MPV_decode_mb(s, s->block);
332f9ac4
MN
684 if(s->loop_filter)
685 ff_h263_loop_filter(s);
686
de6d9b64
FB
687 if (++s->mb_x == s->mb_width) {
688 s->mb_x = 0;
689 s->mb_y++;
4d2858de 690 ff_init_block_index(s);
de6d9b64 691 }
68b94c35
MN
692 if(s->mb_x == s->resync_mb_x)
693 s->first_slice_line=0;
694 if(ret == SLICE_END) break;
de6d9b64
FB
695 }
696
144f0625
MN
697 return buf_size;
698}
699
700static int rv10_decode_frame(AVCodecContext *avctx,
701 void *data, int *data_size,
0c1a9eda 702 uint8_t *buf, int buf_size)
144f0625
MN
703{
704 MpegEncContext *s = avctx->priv_data;
705 int i;
492cd3a9 706 AVFrame *pict = data;
144f0625
MN
707
708#ifdef DEBUG
709 printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
710#endif
711
712 /* no supplementary picture */
713 if (buf_size == 0) {
144f0625
MN
714 return 0;
715 }
8e784825 716
144f0625
MN
717 if(avctx->slice_count){
718 for(i=0; i<avctx->slice_count; i++){
719 int offset= avctx->slice_offset[i];
720 int size;
721
722 if(i+1 == avctx->slice_count)
723 size= buf_size - offset;
724 else
725 size= avctx->slice_offset[i+1] - offset;
726
727 if( rv10_decode_packet(avctx, buf+offset, size) < 0 )
728 return -1;
729 }
730 }else{
731 if( rv10_decode_packet(avctx, buf, buf_size) < 0 )
732 return -1;
733 }
8135f8df 734
144f0625 735 if(s->mb_y>=s->mb_height){
de6d9b64 736 MPV_frame_end(s);
144f0625 737
b40cd4e0
MN
738 if(s->pict_type==B_TYPE || s->low_delay){
739 *pict= *(AVFrame*)&s->current_picture;
0c9bbaec 740 ff_print_debug_info(s, pict);
b40cd4e0
MN
741 } else {
742 *pict= *(AVFrame*)&s->last_picture;
0c9bbaec 743 ff_print_debug_info(s, pict);
b40cd4e0 744 }
9993064e
MN
745 if(s->last_picture_ptr || s->low_delay)
746 *data_size = sizeof(AVFrame);
de6d9b64 747 }
144f0625 748
de6d9b64
FB
749 return buf_size;
750}
751
752AVCodec rv10_decoder = {
753 "rv10",
754 CODEC_TYPE_VIDEO,
755 CODEC_ID_RV10,
756 sizeof(MpegEncContext),
757 rv10_decode_init,
758 NULL,
759 rv10_decode_end,
760 rv10_decode_frame,
3cf33c37 761 CODEC_CAP_DR1
de6d9b64 762};
68b94c35
MN
763
764AVCodec rv20_decoder = {
765 "rv20",
766 CODEC_TYPE_VIDEO,
767 CODEC_ID_RV20,
768 sizeof(MpegEncContext),
769 rv10_decode_init,
770 NULL,
771 rv10_decode_end,
772 rv10_decode_frame,
934982c4 773 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
bc17df09 774 .flush= ff_mpeg_flush,
68b94c35 775};
b40cd4e0 776