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
30 #include "libavutil/imgutils.h"
31 #include "libavutil/thread.h"
34 #include "error_resilience.h"
39 #include "mpegutils.h"
40 #include "mpegvideo.h"
41 #include "mpeg4video.h"
42 #include "mpegvideodata.h"
45 #define RV_GET_MAJOR_VER(x) ((x) >> 28)
46 #define RV_GET_MINOR_VER(x) (((x) >> 20) & 0xFF)
47 #define RV_GET_MICRO_VER(x) (((x) >> 12) & 0xFF)
49 #define DC_VLC_BITS 14 // FIXME find a better solution
51 typedef struct RVDecContext {
54 int orig_width, orig_height;
57 static const uint16_t rv_lum_code[256] = {
58 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
59 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
60 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
61 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
62 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
63 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
64 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
65 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
66 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
67 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
68 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
69 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
70 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
71 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
72 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
73 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
74 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
75 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
76 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
77 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
78 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
79 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
80 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
81 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
82 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
83 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
84 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
85 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
86 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
87 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
88 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
89 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
92 static const uint8_t rv_lum_bits[256] = {
93 14, 12, 12, 12, 12, 12, 12, 12,
94 12, 12, 12, 12, 12, 12, 12, 12,
95 12, 12, 12, 12, 12, 12, 12, 12,
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, 10, 10, 10, 10, 10, 10, 10,
102 10, 10, 10, 10, 10, 10, 10, 10,
103 10, 10, 10, 10, 10, 10, 10, 10,
104 10, 10, 10, 10, 10, 10, 10, 10,
105 10, 8, 8, 8, 8, 8, 8, 8,
106 8, 8, 8, 8, 8, 8, 8, 8,
107 8, 7, 7, 7, 7, 7, 7, 7,
108 7, 6, 6, 6, 6, 5, 5, 4,
109 2, 4, 5, 5, 6, 6, 6, 6,
110 7, 7, 7, 7, 7, 7, 7, 7,
111 8, 8, 8, 8, 8, 8, 8, 8,
112 8, 8, 8, 8, 8, 8, 8, 8,
113 10, 10, 10, 10, 10, 10, 10, 10,
114 10, 10, 10, 10, 10, 10, 10, 10,
115 10, 10, 10, 10, 10, 10, 10, 10,
116 10, 10, 10, 10, 10, 10, 10, 10,
117 12, 12, 12, 12, 12, 12, 12, 12,
118 12, 12, 12, 12, 12, 12, 12, 12,
119 12, 12, 12, 12, 12, 12, 12, 12,
120 12, 12, 12, 12, 12, 12, 12, 12,
121 12, 12, 12, 12, 12, 12, 12, 12,
122 12, 12, 12, 12, 12, 12, 12, 12,
123 12, 12, 12, 12, 12, 12, 12, 12,
124 12, 12, 12, 12, 12, 12, 12, 12,
127 static const uint16_t rv_chrom_code[256] = {
128 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
129 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
130 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
131 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
132 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
133 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
134 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
135 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
136 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
137 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
138 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
139 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
140 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
141 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
142 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
143 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
144 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
145 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
146 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
147 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
148 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
149 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
150 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
151 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
152 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
153 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
154 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
155 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
156 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
157 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
158 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
159 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
162 static const uint8_t rv_chrom_bits[256] = {
163 16, 14, 14, 14, 14, 14, 14, 14,
164 14, 14, 14, 14, 14, 14, 14, 14,
165 14, 14, 14, 14, 14, 14, 14, 14,
166 14, 14, 14, 14, 14, 14, 14, 14,
167 14, 14, 14, 14, 14, 14, 14, 14,
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, 12, 12, 12, 12, 12, 12, 12,
172 12, 12, 12, 12, 12, 12, 12, 12,
173 12, 12, 12, 12, 12, 12, 12, 12,
174 12, 12, 12, 12, 12, 12, 12, 12,
175 12, 10, 10, 10, 10, 10, 10, 10,
176 10, 10, 10, 10, 10, 10, 10, 10,
177 10, 8, 8, 8, 8, 8, 8, 8,
178 8, 6, 6, 6, 6, 4, 4, 3,
179 2, 3, 4, 4, 6, 6, 6, 6,
180 8, 8, 8, 8, 8, 8, 8, 8,
181 10, 10, 10, 10, 10, 10, 10, 10,
182 10, 10, 10, 10, 10, 10, 10, 10,
183 12, 12, 12, 12, 12, 12, 12, 12,
184 12, 12, 12, 12, 12, 12, 12, 12,
185 12, 12, 12, 12, 12, 12, 12, 12,
186 12, 12, 12, 12, 12, 12, 12, 12,
187 14, 14, 14, 14, 14, 14, 14, 14,
188 14, 14, 14, 14, 14, 14, 14, 14,
189 14, 14, 14, 14, 14, 14, 14, 14,
190 14, 14, 14, 14, 14, 14, 14, 14,
191 14, 14, 14, 14, 14, 14, 14, 14,
192 14, 14, 14, 14, 14, 14, 14, 14,
193 14, 14, 14, 14, 14, 14, 14, 14,
194 14, 14, 14, 14, 14, 14, 14, 14,
197 static VLC rv_dc_lum, rv_dc_chrom;
199 int ff_rv_decode_dc(MpegEncContext *s, int n)
204 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
206 /* XXX: I don't understand why they use LONGER codes than
207 * necessary. The following code would be completely useless
208 * if they had thought about it !!! */
209 code = get_bits(&s->gb, 7);
211 code = (int8_t) (get_bits(&s->gb, 7) + 1);
212 } else if (code == 0x7d) {
213 code = -128 + get_bits(&s->gb, 7);
214 } else if (code == 0x7e) {
215 if (get_bits1(&s->gb) == 0)
216 code = (int8_t) (get_bits(&s->gb, 8) + 1);
218 code = (int8_t) (get_bits(&s->gb, 8));
219 } else if (code == 0x7f) {
220 skip_bits(&s->gb, 11);
227 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
230 code = get_bits(&s->gb, 9);
232 code = (int8_t) (get_bits(&s->gb, 7) + 1);
233 } else if (code == 0x1fd) {
234 code = -128 + get_bits(&s->gb, 7);
235 } else if (code == 0x1fe) {
236 skip_bits(&s->gb, 9);
239 av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n");
249 /* read RV 1.0 compatible frame header */
250 static int rv10_decode_picture_header(MpegEncContext *s)
252 int mb_count, pb_frame, marker, mb_xy;
254 marker = get_bits1(&s->gb);
256 if (get_bits1(&s->gb))
257 s->pict_type = AV_PICTURE_TYPE_P;
259 s->pict_type = AV_PICTURE_TYPE_I;
262 av_log(s->avctx, AV_LOG_ERROR, "marker missing\n");
264 pb_frame = get_bits1(&s->gb);
266 ff_dlog(s->avctx, "pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
269 avpriv_request_sample(s->avctx, "PB-frame");
270 return AVERROR_PATCHWELCOME;
273 s->qscale = get_bits(&s->gb, 5);
274 if (s->qscale == 0) {
275 av_log(s->avctx, AV_LOG_ERROR, "Invalid qscale value: 0\n");
276 return AVERROR_INVALIDDATA;
279 if (s->pict_type == AV_PICTURE_TYPE_I) {
280 if (s->rv10_version == 3) {
281 /* specific MPEG like DC coding not used */
282 s->last_dc[0] = get_bits(&s->gb, 8);
283 s->last_dc[1] = get_bits(&s->gb, 8);
284 s->last_dc[2] = get_bits(&s->gb, 8);
285 ff_dlog(s->avctx, "DC:%d %d %d\n", s->last_dc[0],
286 s->last_dc[1], s->last_dc[2]);
289 /* if multiple packets per frame are sent, the position at which
290 * to display the macroblocks is coded here */
292 mb_xy = s->mb_x + s->mb_y * s->mb_width;
293 if (show_bits(&s->gb, 12) == 0 || (mb_xy && mb_xy < s->mb_num)) {
294 s->mb_x = get_bits(&s->gb, 6); /* mb_x */
295 s->mb_y = get_bits(&s->gb, 6); /* mb_y */
296 mb_count = get_bits(&s->gb, 12);
300 mb_count = s->mb_width * s->mb_height;
302 skip_bits(&s->gb, 3); /* ignored */
304 s->unrestricted_mv = 1;
309 static int rv20_decode_picture_header(RVDecContext *rv)
311 MpegEncContext *s = &rv->m;
312 int seq, mb_pos, i, ret;
315 i = get_bits(&s->gb, 2);
318 s->pict_type = AV_PICTURE_TYPE_I;
321 s->pict_type = AV_PICTURE_TYPE_I;
324 s->pict_type = AV_PICTURE_TYPE_P;
327 s->pict_type = AV_PICTURE_TYPE_B;
330 av_log(s->avctx, AV_LOG_ERROR, "unknown frame type\n");
331 return AVERROR_INVALIDDATA;
334 if (s->low_delay && s->pict_type == AV_PICTURE_TYPE_B) {
335 av_log(s->avctx, AV_LOG_ERROR, "low delay B\n");
338 if (!s->last_picture_ptr && s->pict_type == AV_PICTURE_TYPE_B) {
339 av_log(s->avctx, AV_LOG_ERROR, "early B-frame\n");
340 return AVERROR_INVALIDDATA;
343 if (get_bits1(&s->gb)) {
344 av_log(s->avctx, AV_LOG_ERROR, "reserved bit set\n");
345 return AVERROR_INVALIDDATA;
348 s->qscale = get_bits(&s->gb, 5);
349 if (s->qscale == 0) {
350 av_log(s->avctx, AV_LOG_ERROR, "Invalid qscale value: 0\n");
351 return AVERROR_INVALIDDATA;
354 if (RV_GET_MINOR_VER(rv->sub_id) >= 2)
355 s->loop_filter = get_bits1(&s->gb) && !s->avctx->lowres;
357 if (RV_GET_MINOR_VER(rv->sub_id) <= 1)
358 seq = get_bits(&s->gb, 8) << 7;
360 seq = get_bits(&s->gb, 13) << 2;
362 rpr_max = s->avctx->extradata[1] & 7;
365 int rpr_bits = av_log2(rpr_max) + 1;
367 f = get_bits(&s->gb, rpr_bits);
370 if (s->avctx->extradata_size < 8 + 2 * f) {
371 av_log(s->avctx, AV_LOG_ERROR, "Extradata too small.\n");
372 return AVERROR_INVALIDDATA;
375 new_w = 4 * ((uint8_t *) s->avctx->extradata)[6 + 2 * f];
376 new_h = 4 * ((uint8_t *) s->avctx->extradata)[7 + 2 * f];
378 new_w = rv->orig_width;
379 new_h = rv->orig_height;
381 if (new_w != s->width || new_h != s->height) {
382 AVRational old_aspect = s->avctx->sample_aspect_ratio;
383 av_log(s->avctx, AV_LOG_DEBUG,
384 "attempting to change resolution to %dx%d\n", new_w, new_h);
385 if (av_image_check_size(new_w, new_h, 0, s->avctx) < 0)
386 return AVERROR_INVALIDDATA;
387 ff_mpv_common_end(s);
389 // attempt to keep aspect during typical resolution switches
391 old_aspect = (AVRational){1, 1};
392 if (2 * (int64_t)new_w * s->height == (int64_t)new_h * s->width)
393 s->avctx->sample_aspect_ratio = av_mul_q(old_aspect, (AVRational){2, 1});
394 if ((int64_t)new_w * s->height == 2 * (int64_t)new_h * s->width)
395 s->avctx->sample_aspect_ratio = av_mul_q(old_aspect, (AVRational){1, 2});
397 ret = ff_set_dimensions(s->avctx, new_w, new_h);
403 if ((ret = ff_mpv_common_init(s)) < 0)
407 if (s->avctx->debug & FF_DEBUG_PICT_INFO) {
408 av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d/%d\n", f, rpr_bits, rpr_max);
411 if (av_image_check_size(s->width, s->height, 0, s->avctx) < 0)
412 return AVERROR_INVALIDDATA;
414 mb_pos = ff_h263_decode_mba(s);
416 seq |= s->time & ~0x7FFF;
417 if (seq - s->time > 0x4000)
419 if (seq - s->time < -0x4000)
422 if (seq != s->time) {
423 if (s->pict_type != AV_PICTURE_TYPE_B) {
425 s->pp_time = s->time - s->last_non_b_time;
426 s->last_non_b_time = s->time;
429 s->pb_time = s->pp_time - (s->last_non_b_time - s->time);
432 if (s->pict_type == AV_PICTURE_TYPE_B) {
433 if (s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0) {
434 av_log(s->avctx, AV_LOG_DEBUG,
435 "messed up order, possible from seeking? skipping current B-frame\n");
436 #define ERROR_SKIP_FRAME -123
437 return ERROR_SKIP_FRAME;
439 ff_mpeg4_init_direct_mv(s);
442 s->no_rounding = get_bits1(&s->gb);
444 if (RV_GET_MINOR_VER(rv->sub_id) <= 1 && s->pict_type == AV_PICTURE_TYPE_B)
445 // binary decoder reads 3+2 bits here but they don't seem to be used
446 skip_bits(&s->gb, 5);
449 s->unrestricted_mv = 1;
450 s->h263_aic = s->pict_type == AV_PICTURE_TYPE_I;
451 s->modified_quant = 1;
452 if (!s->avctx->lowres)
455 if (s->avctx->debug & FF_DEBUG_PICT_INFO) {
456 av_log(s->avctx, AV_LOG_INFO,
457 "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n",
458 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale,
462 av_assert0(s->pict_type != AV_PICTURE_TYPE_B || !s->low_delay);
464 return s->mb_width * s->mb_height - mb_pos;
467 static av_cold void rv10_init_static(void)
469 INIT_VLC_STATIC(&rv_dc_lum, DC_VLC_BITS, 256,
471 rv_lum_code, 2, 2, 16384);
472 INIT_VLC_STATIC(&rv_dc_chrom, DC_VLC_BITS, 256,
474 rv_chrom_code, 2, 2, 16388);
475 ff_h263_decode_init_vlc();
478 static av_cold int rv10_decode_init(AVCodecContext *avctx)
480 static AVOnce init_static_once = AV_ONCE_INIT;
481 RVDecContext *rv = avctx->priv_data;
482 MpegEncContext *s = &rv->m;
483 int major_ver, minor_ver, micro_ver, ret;
485 if (avctx->extradata_size < 8) {
486 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
487 return AVERROR_INVALIDDATA;
489 if ((ret = av_image_check_size(avctx->coded_width,
490 avctx->coded_height, 0, avctx)) < 0)
493 ff_mpv_decode_defaults(s);
494 ff_mpv_decode_init(s, avctx);
496 s->out_format = FMT_H263;
499 s->width = avctx->coded_width;
501 s->height = avctx->coded_height;
503 s->h263_long_vectors = ((uint8_t *) avctx->extradata)[3] & 1;
504 rv->sub_id = AV_RB32((uint8_t *) avctx->extradata + 4);
506 major_ver = RV_GET_MAJOR_VER(rv->sub_id);
507 minor_ver = RV_GET_MINOR_VER(rv->sub_id);
508 micro_ver = RV_GET_MICRO_VER(rv->sub_id);
513 s->rv10_version = micro_ver ? 3 : 1;
514 s->obmc = micro_ver == 2;
517 if (minor_ver >= 2) {
519 s->avctx->has_b_frames = 1;
523 av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", rv->sub_id);
524 avpriv_request_sample(avctx, "RV1/2 version");
525 return AVERROR_PATCHWELCOME;
528 if (avctx->debug & FF_DEBUG_PICT_INFO) {
529 av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%"PRIX32"\n", rv->sub_id,
530 ((uint32_t *) avctx->extradata)[0]);
533 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
536 if ((ret = ff_mpv_common_init(s)) < 0)
539 ff_h263dsp_init(&s->h263dsp);
541 /* init static VLCs */
542 ff_thread_once(&init_static_once, rv10_init_static);
547 static av_cold int rv10_decode_end(AVCodecContext *avctx)
549 MpegEncContext *s = avctx->priv_data;
551 ff_mpv_common_end(s);
555 static int rv10_decode_packet(AVCodecContext *avctx, const uint8_t *buf,
556 int buf_size, int buf_size2, int whole_size)
558 RVDecContext *rv = avctx->priv_data;
559 MpegEncContext *s = &rv->m;
560 int mb_count, mb_pos, left, start_mb_x, active_bits_size, ret;
562 active_bits_size = buf_size * 8;
563 init_get_bits(&s->gb, buf, FFMAX(buf_size, buf_size2) * 8);
564 if (s->codec_id == AV_CODEC_ID_RV10)
565 mb_count = rv10_decode_picture_header(s);
567 mb_count = rv20_decode_picture_header(rv);
569 if (mb_count != ERROR_SKIP_FRAME)
570 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
571 return AVERROR_INVALIDDATA;
574 if (s->mb_x >= s->mb_width ||
575 s->mb_y >= s->mb_height) {
576 av_log(s->avctx, AV_LOG_ERROR, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
577 return AVERROR_INVALIDDATA;
579 mb_pos = s->mb_y * s->mb_width + s->mb_x;
580 left = s->mb_width * s->mb_height - mb_pos;
581 if (mb_count > left) {
582 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n");
583 return AVERROR_INVALIDDATA;
586 if (whole_size < s->mb_width * s->mb_height / 8)
587 return AVERROR_INVALIDDATA;
589 if ((s->mb_x == 0 && s->mb_y == 0) || !s->current_picture_ptr) {
590 // FIXME write parser so we always have complete frames?
591 if (s->current_picture_ptr) {
592 ff_er_frame_end(&s->er);
594 s->mb_x = s->mb_y = s->resync_mb_x = s->resync_mb_y = 0;
596 if ((ret = ff_mpv_frame_start(s, avctx)) < 0)
598 ff_mpeg_er_frame_start(s);
600 if (s->current_picture_ptr->f->pict_type != s->pict_type) {
601 av_log(s->avctx, AV_LOG_ERROR, "Slice type mismatch\n");
602 return AVERROR_INVALIDDATA;
607 ff_dlog(avctx, "qscale=%d\n", s->qscale);
609 /* default quantization values */
610 if (s->codec_id == AV_CODEC_ID_RV10) {
612 s->first_slice_line = 1;
614 s->first_slice_line = 1;
615 s->resync_mb_x = s->mb_x;
617 start_mb_x = s->mb_x;
618 s->resync_mb_y = s->mb_y;
620 s->y_dc_scale_table =
621 s->c_dc_scale_table = ff_aic_dc_scale_table;
623 s->y_dc_scale_table =
624 s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
627 if (s->modified_quant)
628 s->chroma_qscale_table = ff_h263_chroma_qscale_table;
630 ff_set_qscale(s, s->qscale);
632 s->rv10_first_dc_coded[0] = 0;
633 s->rv10_first_dc_coded[1] = 0;
634 s->rv10_first_dc_coded[2] = 0;
638 s->block_wrap[3] = s->b8_stride;
640 s->block_wrap[5] = s->mb_stride;
641 ff_init_block_index(s);
643 /* decode each macroblock */
644 for (s->mb_num_left = mb_count; s->mb_num_left > 0; s->mb_num_left--) {
646 ff_update_block_index(s);
647 ff_tlog(avctx, "**mb x=%d y=%d\n", s->mb_x, s->mb_y);
649 s->mv_dir = MV_DIR_FORWARD;
650 s->mv_type = MV_TYPE_16X16;
651 ret = ff_h263_decode_mb(s, s->block);
653 // Repeat the slice end check from ff_h263_decode_mb with our active
655 if (ret != SLICE_ERROR && active_bits_size >= get_bits_count(&s->gb)) {
656 int v = show_bits(&s->gb, 16);
658 if (get_bits_count(&s->gb) + 16 > active_bits_size)
659 v >>= get_bits_count(&s->gb) + 16 - active_bits_size;
664 if (ret != SLICE_ERROR && active_bits_size < get_bits_count(&s->gb) &&
665 8 * buf_size2 >= get_bits_count(&s->gb)) {
666 active_bits_size = buf_size2 * 8;
667 av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n",
668 8 * buf_size, active_bits_size);
672 if (ret == SLICE_ERROR || active_bits_size < get_bits_count(&s->gb)) {
673 av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x,
675 return AVERROR_INVALIDDATA;
677 if (s->pict_type != AV_PICTURE_TYPE_B)
678 ff_h263_update_motion_val(s);
679 ff_mpv_reconstruct_mb(s, s->block);
681 ff_h263_loop_filter(s);
683 if (++s->mb_x == s->mb_width) {
686 ff_init_block_index(s);
688 if (s->mb_x == s->resync_mb_x)
689 s->first_slice_line = 0;
690 if (ret == SLICE_END)
694 ff_er_add_slice(&s->er, start_mb_x, s->resync_mb_y, s->mb_x - 1, s->mb_y,
697 return active_bits_size;
700 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
702 if (avctx->slice_count)
703 return avctx->slice_offset[n];
705 return AV_RL32(buf + n * 8);
708 static int rv10_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
711 const uint8_t *buf = avpkt->data;
712 int buf_size = avpkt->size;
713 MpegEncContext *s = avctx->priv_data;
714 AVFrame *pict = data;
717 const uint8_t *slices_hdr = NULL;
719 ff_dlog(avctx, "*****frame %d size=%d\n", avctx->frame_number, buf_size);
721 /* no supplementary picture */
726 if (!avctx->slice_count) {
727 slice_count = (*buf++) + 1;
730 if (!slice_count || buf_size <= 8 * slice_count) {
731 av_log(avctx, AV_LOG_ERROR, "Invalid slice count: %d.\n",
733 return AVERROR_INVALIDDATA;
736 slices_hdr = buf + 4;
737 buf += 8 * slice_count;
738 buf_size -= 8 * slice_count;
740 slice_count = avctx->slice_count;
742 for (i = 0; i < slice_count; i++) {
743 unsigned offset = get_slice_offset(avctx, slices_hdr, i);
746 if (offset >= buf_size)
747 return AVERROR_INVALIDDATA;
749 if (i + 1 == slice_count)
750 size = buf_size - offset;
752 size = get_slice_offset(avctx, slices_hdr, i + 1) - offset;
754 if (i + 2 >= slice_count)
755 size2 = buf_size - offset;
757 size2 = get_slice_offset(avctx, slices_hdr, i + 2) - offset;
759 if (size <= 0 || size2 <= 0 ||
760 offset + FFMAX(size, size2) > buf_size)
761 return AVERROR_INVALIDDATA;
763 if ((ret = rv10_decode_packet(avctx, buf + offset, size, size2, buf_size)) < 0)
770 if (s->current_picture_ptr && s->mb_y >= s->mb_height) {
771 ff_er_frame_end(&s->er);
774 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
775 if ((ret = av_frame_ref(pict, s->current_picture_ptr->f)) < 0)
777 ff_print_debug_info(s, s->current_picture_ptr, pict);
778 ff_mpv_export_qp_table(s, pict, s->current_picture_ptr, FF_QSCALE_TYPE_MPEG1);
779 } else if (s->last_picture_ptr) {
780 if ((ret = av_frame_ref(pict, s->last_picture_ptr->f)) < 0)
782 ff_print_debug_info(s, s->last_picture_ptr, pict);
783 ff_mpv_export_qp_table(s, pict,s->last_picture_ptr, FF_QSCALE_TYPE_MPEG1);
786 if (s->last_picture_ptr || s->low_delay) {
790 // so we can detect if frame_end was not called (find some nicer solution...)
791 s->current_picture_ptr = NULL;
797 AVCodec ff_rv10_decoder = {
799 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
800 .type = AVMEDIA_TYPE_VIDEO,
801 .id = AV_CODEC_ID_RV10,
802 .priv_data_size = sizeof(RVDecContext),
803 .init = rv10_decode_init,
804 .close = rv10_decode_end,
805 .decode = rv10_decode_frame,
806 .capabilities = AV_CODEC_CAP_DR1,
807 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
809 .pix_fmts = (const enum AVPixelFormat[]) {
815 AVCodec ff_rv20_decoder = {
817 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
818 .type = AVMEDIA_TYPE_VIDEO,
819 .id = AV_CODEC_ID_RV20,
820 .priv_data_size = sizeof(RVDecContext),
821 .init = rv10_decode_init,
822 .close = rv10_decode_end,
823 .decode = rv10_decode_frame,
824 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
825 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
826 .flush = ff_mpeg_flush,
828 .pix_fmts = (const enum AVPixelFormat[]) {