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