3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer
6 * This file is part of FFmpeg.
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.
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.
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
24 * @file libavcodec/rv10.c
30 #include "mpegvideo.h"
35 #define DC_VLC_BITS 14 //FIXME find a better solution
37 static const uint16_t rv_lum_code[256] =
39 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
40 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
41 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
42 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
43 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
44 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
45 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
46 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
47 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
48 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
49 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
50 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
51 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
52 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
53 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
54 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
55 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
56 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
57 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
58 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
59 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
60 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
61 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
62 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
63 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
64 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
65 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
66 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
67 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
68 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
69 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
70 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
73 static const uint8_t rv_lum_bits[256] =
75 14, 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, 12, 12, 12, 12, 12, 12, 12,
83 12, 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, 10, 10, 10, 10, 10, 10, 10,
87 10, 8, 8, 8, 8, 8, 8, 8,
88 8, 8, 8, 8, 8, 8, 8, 8,
89 8, 7, 7, 7, 7, 7, 7, 7,
90 7, 6, 6, 6, 6, 5, 5, 4,
91 2, 4, 5, 5, 6, 6, 6, 6,
92 7, 7, 7, 7, 7, 7, 7, 7,
93 8, 8, 8, 8, 8, 8, 8, 8,
94 8, 8, 8, 8, 8, 8, 8, 8,
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 10, 10, 10, 10, 10, 10, 10, 10,
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 12, 12, 12, 12, 12, 12, 12, 12,
109 static const uint16_t rv_chrom_code[256] =
111 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
112 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
113 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
114 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
115 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
116 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
117 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
118 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
119 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
120 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
121 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
122 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
123 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
124 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
125 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
126 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
127 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
128 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
129 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
130 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
131 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
132 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
133 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
134 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
135 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
136 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
137 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
138 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
139 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
140 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
141 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
142 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
145 static const uint8_t rv_chrom_bits[256] =
147 16, 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, 14, 14, 14, 14, 14, 14, 14,
155 14, 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, 12, 12, 12, 12, 12, 12, 12,
159 12, 10, 10, 10, 10, 10, 10, 10,
160 10, 10, 10, 10, 10, 10, 10, 10,
161 10, 8, 8, 8, 8, 8, 8, 8,
162 8, 6, 6, 6, 6, 4, 4, 3,
163 2, 3, 4, 4, 6, 6, 6, 6,
164 8, 8, 8, 8, 8, 8, 8, 8,
165 10, 10, 10, 10, 10, 10, 10, 10,
166 10, 10, 10, 10, 10, 10, 10, 10,
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 12, 12, 12, 12, 12, 12, 12, 12,
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 14, 14, 14, 14, 14, 14, 14, 14,
181 static VLC rv_dc_lum, rv_dc_chrom;
183 int rv_decode_dc(MpegEncContext *s, int n)
188 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
190 /* XXX: I don't understand why they use LONGER codes than
191 necessary. The following code would be completely useless
192 if they had thought about it !!! */
193 code = get_bits(&s->gb, 7);
195 code = (int8_t)(get_bits(&s->gb, 7) + 1);
196 } else if (code == 0x7d) {
197 code = -128 + get_bits(&s->gb, 7);
198 } else if (code == 0x7e) {
199 if (get_bits1(&s->gb) == 0)
200 code = (int8_t)(get_bits(&s->gb, 8) + 1);
202 code = (int8_t)(get_bits(&s->gb, 8));
203 } else if (code == 0x7f) {
204 skip_bits(&s->gb, 11);
211 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
214 code = get_bits(&s->gb, 9);
216 code = (int8_t)(get_bits(&s->gb, 7) + 1);
217 } else if (code == 0x1fd) {
218 code = -128 + get_bits(&s->gb, 7);
219 } else if (code == 0x1fe) {
220 skip_bits(&s->gb, 9);
223 av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n");
233 /* read RV 1.0 compatible frame header */
234 static int rv10_decode_picture_header(MpegEncContext *s)
236 int mb_count, pb_frame, marker, unk, mb_xy;
238 marker = get_bits1(&s->gb);
240 if (get_bits1(&s->gb))
241 s->pict_type = FF_P_TYPE;
243 s->pict_type = FF_I_TYPE;
244 if(!marker) av_log(s->avctx, AV_LOG_ERROR, "marker missing\n");
245 pb_frame = get_bits1(&s->gb);
247 dprintf(s->avctx, "pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
250 av_log(s->avctx, AV_LOG_ERROR, "pb frame not supported\n");
254 s->qscale = get_bits(&s->gb, 5);
256 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
260 if (s->pict_type == FF_I_TYPE) {
261 if (s->rv10_version == 3) {
262 /* specific MPEG like DC coding not used */
263 s->last_dc[0] = get_bits(&s->gb, 8);
264 s->last_dc[1] = get_bits(&s->gb, 8);
265 s->last_dc[2] = get_bits(&s->gb, 8);
266 dprintf(s->avctx, "DC:%d %d %d\n", s->last_dc[0],
267 s->last_dc[1], s->last_dc[2]);
270 /* if multiple packets per frame are sent, the position at which
271 to display the macroblocks is coded here */
273 mb_xy= s->mb_x + s->mb_y*s->mb_width;
274 if(show_bits(&s->gb, 12)==0 || (mb_xy && mb_xy < s->mb_num)){
275 s->mb_x = get_bits(&s->gb, 6); /* mb_x */
276 s->mb_y = get_bits(&s->gb, 6); /* mb_y */
277 mb_count = get_bits(&s->gb, 12);
281 mb_count = s->mb_width * s->mb_height;
283 unk= get_bits(&s->gb, 3); /* ignored */
285 s->unrestricted_mv = 1;
290 static int rv20_decode_picture_header(MpegEncContext *s)
295 GetBitContext gb= s->gb;
297 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&gb));
298 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
300 av_log(s->avctx, AV_LOG_DEBUG, "\n");
303 av_log(s->avctx, AV_LOG_DEBUG, "%3dx%03d/%02Xx%02X ", s->width, s->height, s->width/4, s->height/4);
304 for(i=0; i<s->avctx->extradata_size; i++){
305 av_log(s->avctx, AV_LOG_DEBUG, "%02X ", ((uint8_t*)s->avctx->extradata)[i]);
306 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
308 av_log(s->avctx, AV_LOG_DEBUG, "\n");
311 if(s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){
312 if (get_bits(&s->gb, 3)){
313 av_log(s->avctx, AV_LOG_ERROR, "unknown triplet set\n");
318 i= get_bits(&s->gb, 2);
320 case 0: s->pict_type= FF_I_TYPE; break;
321 case 1: s->pict_type= FF_I_TYPE; break; //hmm ...
322 case 2: s->pict_type= FF_P_TYPE; break;
323 case 3: s->pict_type= FF_B_TYPE; break;
325 av_log(s->avctx, AV_LOG_ERROR, "unknown frame type\n");
329 if(s->last_picture_ptr==NULL && s->pict_type==FF_B_TYPE){
330 av_log(s->avctx, AV_LOG_ERROR, "early B pix\n");
334 if (get_bits1(&s->gb)){
335 av_log(s->avctx, AV_LOG_ERROR, "unknown bit set\n");
339 s->qscale = get_bits(&s->gb, 5);
341 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
344 if(s->avctx->sub_id == 0x30203002){
345 if (get_bits1(&s->gb)){
346 av_log(s->avctx, AV_LOG_ERROR, "unknown bit2 set\n");
351 if(s->avctx->has_b_frames){
353 int v= s->avctx->extradata_size >= 4 ? 7&((uint8_t*)s->avctx->extradata)[1] : 0;
355 if (get_bits1(&s->gb)){
356 av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n");
358 seq= get_bits(&s->gb, 13)<<2;
360 f= get_bits(&s->gb, av_log2(v)+1);
363 new_w= 4*((uint8_t*)s->avctx->extradata)[6+2*f];
364 new_h= 4*((uint8_t*)s->avctx->extradata)[7+2*f];
366 new_w= s->orig_width ;
367 new_h= s->orig_height;
369 if(new_w != s->width || new_h != s->height){
370 av_log(s->avctx, AV_LOG_DEBUG, "attempting to change resolution to %dx%d\n", new_w, new_h);
371 if (avcodec_check_dimensions(s->avctx, new_w, new_h) < 0)
374 avcodec_set_dimensions(s->avctx, new_w, new_h);
377 if (MPV_common_init(s) < 0)
381 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
382 av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, v);
385 seq= get_bits(&s->gb, 8)*128;
388 // if(s->avctx->sub_id <= 0x20201002){ //0x20201002 definitely needs this
389 mb_pos= ff_h263_decode_mba(s);
391 mb_pos= get_bits(&s->gb, av_log2(s->mb_num-1)+1);
392 s->mb_x= mb_pos % s->mb_width;
393 s->mb_y= mb_pos / s->mb_width;
395 //av_log(s->avctx, AV_LOG_DEBUG, "%d\n", seq);
396 seq |= s->time &~0x7FFF;
397 if(seq - s->time > 0x4000) seq -= 0x8000;
398 if(seq - s->time < -0x4000) seq += 0x8000;
400 if(s->pict_type!=FF_B_TYPE){
402 s->pp_time= s->time - s->last_non_b_time;
403 s->last_non_b_time= s->time;
406 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
407 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
408 av_log(s->avctx, AV_LOG_DEBUG, "messed up order, possible from seeking? skipping current b frame\n");
409 return FRAME_SKIPPED;
411 ff_mpeg4_init_direct_mv(s);
414 // printf("%d %d %d %d %d\n", seq, (int)s->time, (int)s->last_non_b_time, s->pp_time, s->pb_time);
415 /*for(i=0; i<32; i++){
416 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
418 av_log(s->avctx, AV_LOG_DEBUG, "\n");*/
419 s->no_rounding= get_bits1(&s->gb);
422 s->unrestricted_mv = 1;
423 s->h263_aic= s->pict_type == FF_I_TYPE;
424 // s->alt_inter_vlc=1;
428 if(!s->avctx->lowres)
431 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
432 av_log(s->avctx, AV_LOG_INFO, "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n",
433 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding);
436 assert(s->pict_type != FF_B_TYPE || !s->low_delay);
438 return s->mb_width*s->mb_height - mb_pos;
441 static av_cold int rv10_decode_init(AVCodecContext *avctx)
443 MpegEncContext *s = avctx->priv_data;
446 if (avctx->extradata_size < 8) {
447 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
451 MPV_decode_defaults(s);
454 s->out_format = FMT_H263;
455 s->codec_id= avctx->codec_id;
457 s->orig_width = s->width = avctx->coded_width;
458 s->orig_height= s->height = avctx->coded_height;
460 s->h263_long_vectors= ((uint8_t*)avctx->extradata)[3] & 1;
461 avctx->sub_id= AV_RB32((uint8_t*)avctx->extradata + 4);
463 if (avctx->sub_id == 0x10000000) {
466 } else if (avctx->sub_id == 0x10001000) {
469 } else if (avctx->sub_id == 0x10002000) {
473 } else if (avctx->sub_id == 0x10003000) {
476 } else if (avctx->sub_id == 0x10003001) {
479 } else if ( avctx->sub_id == 0x20001000
480 || (avctx->sub_id >= 0x20100000 && avctx->sub_id < 0x201a0000)) {
482 } else if ( avctx->sub_id == 0x30202002
483 || avctx->sub_id == 0x30203002
484 || (avctx->sub_id >= 0x20200002 && avctx->sub_id < 0x20300000)) {
486 s->avctx->has_b_frames=1;
488 av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id);
490 if(avctx->debug & FF_DEBUG_PICT_INFO){
491 av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1);
494 avctx->pix_fmt = PIX_FMT_YUV420P;
496 if (MPV_common_init(s) < 0)
499 h263_decode_init_vlc(s);
503 INIT_VLC_STATIC(&rv_dc_lum, DC_VLC_BITS, 256,
505 rv_lum_code, 2, 2, 16384);
506 INIT_VLC_STATIC(&rv_dc_chrom, DC_VLC_BITS, 256,
508 rv_chrom_code, 2, 2, 16388);
515 static av_cold int rv10_decode_end(AVCodecContext *avctx)
517 MpegEncContext *s = avctx->priv_data;
523 static int rv10_decode_packet(AVCodecContext *avctx,
524 const uint8_t *buf, int buf_size, int buf_size2)
526 MpegEncContext *s = avctx->priv_data;
527 int mb_count, mb_pos, left, start_mb_x;
529 init_get_bits(&s->gb, buf, buf_size*8);
530 if(s->codec_id ==CODEC_ID_RV10)
531 mb_count = rv10_decode_picture_header(s);
533 mb_count = rv20_decode_picture_header(s);
535 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
539 if (s->mb_x >= s->mb_width ||
540 s->mb_y >= s->mb_height) {
541 av_log(s->avctx, AV_LOG_ERROR, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
544 mb_pos = s->mb_y * s->mb_width + s->mb_x;
545 left = s->mb_width * s->mb_height - mb_pos;
546 if (mb_count > left) {
547 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n");
551 if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) {
552 if(s->current_picture_ptr){ //FIXME write parser so we always have complete frames?
555 s->mb_x= s->mb_y = s->resync_mb_x = s->resync_mb_y= 0;
557 if(MPV_frame_start(s, avctx) < 0)
559 ff_er_frame_start(s);
562 dprintf(avctx, "qscale=%d\n", s->qscale);
564 /* default quantization values */
565 if(s->codec_id== CODEC_ID_RV10){
566 if(s->mb_y==0) s->first_slice_line=1;
568 s->first_slice_line=1;
569 s->resync_mb_x= s->mb_x;
572 s->resync_mb_y= s->mb_y;
575 s->c_dc_scale_table= ff_aic_dc_scale_table;
578 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
581 if(s->modified_quant)
582 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
584 ff_set_qscale(s, s->qscale);
586 s->rv10_first_dc_coded[0] = 0;
587 s->rv10_first_dc_coded[1] = 0;
588 s->rv10_first_dc_coded[2] = 0;
592 s->block_wrap[3]= s->b8_stride;
594 s->block_wrap[5]= s->mb_stride;
595 ff_init_block_index(s);
596 /* decode each macroblock */
598 for(s->mb_num_left= mb_count; s->mb_num_left>0; s->mb_num_left--) {
600 ff_update_block_index(s);
601 dprintf(avctx, "**mb x=%d y=%d\n", s->mb_x, s->mb_y);
603 s->mv_dir = MV_DIR_FORWARD;
604 s->mv_type = MV_TYPE_16X16;
605 ret=ff_h263_decode_mb(s, s->block);
607 if (ret != SLICE_ERROR && s->gb.size_in_bits < get_bits_count(&s->gb) && 8*buf_size2 >= get_bits_count(&s->gb)){
608 av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n", s->gb.size_in_bits, 8*buf_size2);
609 s->gb.size_in_bits= 8*buf_size2;
613 if (ret == SLICE_ERROR || s->gb.size_in_bits < get_bits_count(&s->gb)) {
614 av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
617 if(s->pict_type != FF_B_TYPE)
618 ff_h263_update_motion_val(s);
619 MPV_decode_mb(s, s->block);
621 ff_h263_loop_filter(s);
623 if (++s->mb_x == s->mb_width) {
626 ff_init_block_index(s);
628 if(s->mb_x == s->resync_mb_x)
629 s->first_slice_line=0;
630 if(ret == SLICE_END) break;
633 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);
635 return s->gb.size_in_bits;
638 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
640 if(avctx->slice_count) return avctx->slice_offset[n];
641 else return AV_RL32(buf + n*8);
644 static int rv10_decode_frame(AVCodecContext *avctx,
645 void *data, int *data_size,
648 const uint8_t *buf = avpkt->data;
649 int buf_size = avpkt->size;
650 MpegEncContext *s = avctx->priv_data;
652 AVFrame *pict = data;
654 const uint8_t *slices_hdr = NULL;
656 dprintf(avctx, "*****frame %d size=%d\n", avctx->frame_number, buf_size);
658 /* no supplementary picture */
663 if(!avctx->slice_count){
664 slice_count = (*buf++) + 1;
665 slices_hdr = buf + 4;
666 buf += 8 * slice_count;
668 slice_count = avctx->slice_count;
670 for(i=0; i<slice_count; i++){
671 int offset= get_slice_offset(avctx, slices_hdr, i);
674 if(i+1 == slice_count)
675 size= buf_size - offset;
677 size= get_slice_offset(avctx, slices_hdr, i+1) - offset;
679 if(i+2 >= slice_count)
680 size2= buf_size - offset;
682 size2= get_slice_offset(avctx, slices_hdr, i+2) - offset;
684 if(rv10_decode_packet(avctx, buf+offset, size, size2) > 8*size)
688 if(s->current_picture_ptr != NULL && s->mb_y>=s->mb_height){
692 if (s->pict_type == FF_B_TYPE || s->low_delay) {
693 *pict= *(AVFrame*)s->current_picture_ptr;
694 } else if (s->last_picture_ptr != NULL) {
695 *pict= *(AVFrame*)s->last_picture_ptr;
698 if(s->last_picture_ptr || s->low_delay){
699 *data_size = sizeof(AVFrame);
700 ff_print_debug_info(s, pict);
702 s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...)
708 AVCodec rv10_decoder = {
712 sizeof(MpegEncContext),
718 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
719 .pix_fmts= ff_pixfmt_list_420,
722 AVCodec rv20_decoder = {
726 sizeof(MpegEncContext),
731 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
732 .flush= ff_mpeg_flush,
733 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
734 .pix_fmts= ff_pixfmt_list_420,