FFmpeg  4.4.4
rv10.c
Go to the documentation of this file.
1 /*
2  * RV10/RV20 decoder
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
25  * RV10/RV20 decoder
26  */
27 
28 #include <inttypes.h>
29 
30 #include "libavutil/imgutils.h"
31 #include "libavutil/thread.h"
32 
33 #include "avcodec.h"
34 #include "error_resilience.h"
35 #include "h263.h"
36 #include "h263data.h"
37 #include "internal.h"
38 #include "mpeg_er.h"
39 #include "mpegutils.h"
40 #include "mpegvideo.h"
41 #include "mpeg4video.h"
42 #include "mpegvideodata.h"
43 #include "rv10.h"
44 
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)
48 
49 #define MAX_VLC_ENTRIES 1023 // Note: Does not include the skip entries.
50 #define DC_VLC_BITS 9
51 
52 typedef struct RVDecContext {
54  int sub_id;
56 } RVDecContext;
57 
58 /* (run, length) encoded value for the symbols table. The actual symbols
59  * are run..run - length (mod 256).
60  * The last two entries in the following table apply to luma only.
61  * The skip values are not included in this list. */
62 static const uint8_t rv_sym_run_len[][2] = {
63  { 0, 0 }, { 1, 0 }, { 255, 0 }, { 3, 1 }, { 254, 1 },
64  { 7, 3 }, { 252, 3 }, { 15, 7 }, { 248, 7 }, { 31, 15 },
65  { 240, 15 }, { 63, 31 }, { 224, 31 }, { 127, 63 }, { 192, 63 },
66  { 255, 127 }, { 128, 127 }, { 127, 255 }, { 128, 255 },
67 };
68 
69 /* entry[i] of the following tables gives
70  * the number of VLC codes of length i + 2. */
71 static const uint16_t rv_lum_len_count[15] = {
72  1, 0, 2, 4, 8, 16, 32, 0, 64, 0, 128, 0, 256, 0, 512,
73 };
74 
75 static const uint16_t rv_chrom_len_count[15] = {
76  1, 2, 4, 0, 8, 0, 16, 0, 32, 0, 64, 0, 128, 0, 256,
77 };
78 
80 
82 {
83  int code;
84 
85  if (n < 4) {
87  } else {
89  if (code < 0) {
90  av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n");
91  return -1;
92  }
93  }
94  return code;
95 }
96 
97 /* read RV 1.0 compatible frame header */
99 {
100  int mb_count, pb_frame, marker, mb_xy;
101 
102  marker = get_bits1(&s->gb);
103 
104  if (get_bits1(&s->gb))
105  s->pict_type = AV_PICTURE_TYPE_P;
106  else
107  s->pict_type = AV_PICTURE_TYPE_I;
108 
109  if (!marker)
110  av_log(s->avctx, AV_LOG_ERROR, "marker missing\n");
111 
112  pb_frame = get_bits1(&s->gb);
113 
114  ff_dlog(s->avctx, "pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
115 
116  if (pb_frame) {
117  avpriv_request_sample(s->avctx, "PB-frame");
118  return AVERROR_PATCHWELCOME;
119  }
120 
121  s->qscale = get_bits(&s->gb, 5);
122  if (s->qscale == 0) {
123  av_log(s->avctx, AV_LOG_ERROR, "Invalid qscale value: 0\n");
124  return AVERROR_INVALIDDATA;
125  }
126 
127  if (s->pict_type == AV_PICTURE_TYPE_I) {
128  if (s->rv10_version == 3) {
129  /* specific MPEG like DC coding not used */
130  s->last_dc[0] = get_bits(&s->gb, 8);
131  s->last_dc[1] = get_bits(&s->gb, 8);
132  s->last_dc[2] = get_bits(&s->gb, 8);
133  ff_dlog(s->avctx, "DC:%d %d %d\n", s->last_dc[0],
134  s->last_dc[1], s->last_dc[2]);
135  }
136  }
137  /* if multiple packets per frame are sent, the position at which
138  * to display the macroblocks is coded here */
139 
140  mb_xy = s->mb_x + s->mb_y * s->mb_width;
141  if (show_bits(&s->gb, 12) == 0 || (mb_xy && mb_xy < s->mb_num)) {
142  s->mb_x = get_bits(&s->gb, 6); /* mb_x */
143  s->mb_y = get_bits(&s->gb, 6); /* mb_y */
144  mb_count = get_bits(&s->gb, 12);
145  } else {
146  s->mb_x = 0;
147  s->mb_y = 0;
148  mb_count = s->mb_width * s->mb_height;
149  }
150  skip_bits(&s->gb, 3); /* ignored */
151  s->f_code = 1;
152  s->unrestricted_mv = 1;
153 
154  return mb_count;
155 }
156 
157 static int rv20_decode_picture_header(RVDecContext *rv, int whole_size)
158 {
159  MpegEncContext *s = &rv->m;
160  int seq, mb_pos, i, ret;
161  int rpr_max;
162 
163  i = get_bits(&s->gb, 2);
164  switch (i) {
165  case 0:
166  s->pict_type = AV_PICTURE_TYPE_I;
167  break;
168  case 1:
169  s->pict_type = AV_PICTURE_TYPE_I;
170  break; // hmm ...
171  case 2:
172  s->pict_type = AV_PICTURE_TYPE_P;
173  break;
174  case 3:
175  s->pict_type = AV_PICTURE_TYPE_B;
176  break;
177  default:
178  av_log(s->avctx, AV_LOG_ERROR, "unknown frame type\n");
179  return AVERROR_INVALIDDATA;
180  }
181 
182  if (s->low_delay && s->pict_type == AV_PICTURE_TYPE_B) {
183  av_log(s->avctx, AV_LOG_ERROR, "low delay B\n");
184  return -1;
185  }
186  if (!s->last_picture_ptr && s->pict_type == AV_PICTURE_TYPE_B) {
187  av_log(s->avctx, AV_LOG_ERROR, "early B-frame\n");
188  return AVERROR_INVALIDDATA;
189  }
190 
191  if (get_bits1(&s->gb)) {
192  av_log(s->avctx, AV_LOG_ERROR, "reserved bit set\n");
193  return AVERROR_INVALIDDATA;
194  }
195 
196  s->qscale = get_bits(&s->gb, 5);
197  if (s->qscale == 0) {
198  av_log(s->avctx, AV_LOG_ERROR, "Invalid qscale value: 0\n");
199  return AVERROR_INVALIDDATA;
200  }
201 
202  if (RV_GET_MINOR_VER(rv->sub_id) >= 2)
203  s->loop_filter = get_bits1(&s->gb) && !s->avctx->lowres;
204 
205  if (RV_GET_MINOR_VER(rv->sub_id) <= 1)
206  seq = get_bits(&s->gb, 8) << 7;
207  else
208  seq = get_bits(&s->gb, 13) << 2;
209 
210  rpr_max = s->avctx->extradata[1] & 7;
211  if (rpr_max) {
212  int f, new_w, new_h;
213  int rpr_bits = av_log2(rpr_max) + 1;
214 
215  f = get_bits(&s->gb, rpr_bits);
216 
217  if (f) {
218  if (s->avctx->extradata_size < 8 + 2 * f) {
219  av_log(s->avctx, AV_LOG_ERROR, "Extradata too small.\n");
220  return AVERROR_INVALIDDATA;
221  }
222 
223  new_w = 4 * ((uint8_t *) s->avctx->extradata)[6 + 2 * f];
224  new_h = 4 * ((uint8_t *) s->avctx->extradata)[7 + 2 * f];
225  } else {
226  new_w = rv->orig_width;
227  new_h = rv->orig_height;
228  }
229  if (new_w != s->width || new_h != s->height || !s->context_initialized) {
230  AVRational old_aspect = s->avctx->sample_aspect_ratio;
231  av_log(s->avctx, AV_LOG_DEBUG,
232  "attempting to change resolution to %dx%d\n", new_w, new_h);
233  if (av_image_check_size(new_w, new_h, 0, s->avctx) < 0)
234  return AVERROR_INVALIDDATA;
235 
236  if (whole_size < (new_w + 15)/16 * ((new_h + 15)/16) / 8)
237  return AVERROR_INVALIDDATA;
238 
240 
241  // attempt to keep aspect during typical resolution switches
242  if (!old_aspect.num)
243  old_aspect = (AVRational){1, 1};
244  if (2 * (int64_t)new_w * s->height == (int64_t)new_h * s->width)
245  s->avctx->sample_aspect_ratio = av_mul_q(old_aspect, (AVRational){2, 1});
246  if ((int64_t)new_w * s->height == 2 * (int64_t)new_h * s->width)
247  s->avctx->sample_aspect_ratio = av_mul_q(old_aspect, (AVRational){1, 2});
248 
249  ret = ff_set_dimensions(s->avctx, new_w, new_h);
250  if (ret < 0)
251  return ret;
252 
253  s->width = new_w;
254  s->height = new_h;
255  if ((ret = ff_mpv_common_init(s)) < 0)
256  return ret;
257  }
258 
259  if (s->avctx->debug & FF_DEBUG_PICT_INFO) {
260  av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d/%d\n", f, rpr_bits, rpr_max);
261  }
262  }
263  if (av_image_check_size(s->width, s->height, 0, s->avctx) < 0)
264  return AVERROR_INVALIDDATA;
265 
266  mb_pos = ff_h263_decode_mba(s);
267 
268  seq |= s->time & ~0x7FFF;
269  if (seq - s->time > 0x4000)
270  seq -= 0x8000;
271  if (seq - s->time < -0x4000)
272  seq += 0x8000;
273 
274  if (seq != s->time) {
275  if (s->pict_type != AV_PICTURE_TYPE_B) {
276  s->time = seq;
277  s->pp_time = s->time - s->last_non_b_time;
278  s->last_non_b_time = s->time;
279  } else {
280  s->time = seq;
281  s->pb_time = s->pp_time - (s->last_non_b_time - s->time);
282  }
283  }
284  if (s->pict_type == AV_PICTURE_TYPE_B) {
285  if (s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0) {
286  av_log(s->avctx, AV_LOG_DEBUG,
287  "messed up order, possible from seeking? skipping current B-frame\n");
288 #define ERROR_SKIP_FRAME -123
289  return ERROR_SKIP_FRAME;
290  }
292  }
293 
294  s->no_rounding = get_bits1(&s->gb);
295 
296  if (RV_GET_MINOR_VER(rv->sub_id) <= 1 && s->pict_type == AV_PICTURE_TYPE_B)
297  // binary decoder reads 3+2 bits here but they don't seem to be used
298  skip_bits(&s->gb, 5);
299 
300  s->f_code = 1;
301  s->unrestricted_mv = 1;
302  s->h263_aic = s->pict_type == AV_PICTURE_TYPE_I;
303  s->modified_quant = 1;
304  if (!s->avctx->lowres)
305  s->loop_filter = 1;
306 
307  if (s->avctx->debug & FF_DEBUG_PICT_INFO) {
308  av_log(s->avctx, AV_LOG_INFO,
309  "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n",
310  seq, s->mb_x, s->mb_y, s->pict_type, s->qscale,
311  s->no_rounding);
312  }
313 
314  av_assert0(s->pict_type != AV_PICTURE_TYPE_B || !s->low_delay);
315 
316  return s->mb_width * s->mb_height - mb_pos;
317 }
318 
319 static av_cold void rv10_build_vlc(VLC *vlc, const uint16_t len_count[15],
320  const uint8_t sym_rl[][2], int sym_rl_elems)
321 {
322  uint16_t syms[MAX_VLC_ENTRIES];
323  uint8_t lens[MAX_VLC_ENTRIES];
324  unsigned nb_syms = 0, nb_lens = 0;
325 
326  for (unsigned i = 0; i < sym_rl_elems; i++) {
327  unsigned cur_sym = sym_rl[i][0];
328  for (unsigned tmp = nb_syms + sym_rl[i][1]; nb_syms <= tmp; nb_syms++)
329  syms[nb_syms] = 0xFF & cur_sym--;
330  }
331 
332  for (unsigned i = 0; i < 15; i++)
333  for (unsigned tmp = nb_lens + len_count[i]; nb_lens < tmp; nb_lens++)
334  lens[nb_lens] = i + 2;
335  av_assert1(nb_lens == nb_syms);
336  ff_init_vlc_from_lengths(vlc, DC_VLC_BITS, nb_lens, lens, 1,
337  syms, 2, 2, 0, INIT_VLC_STATIC_OVERLONG, NULL);
338 }
339 
340 static av_cold void rv10_init_static(void)
341 {
342  static VLC_TYPE table[1472 + 992][2];
343 
345  rv_dc_lum.table_allocated = 1472;
348  for (int i = 0; i < 1 << (DC_VLC_BITS - 7 /* Length of skip prefix */); i++) {
349  /* All codes beginning with 0x7F have the same length and value.
350  * Modifying the table directly saves us the useless subtables. */
351  rv_dc_lum.table[(0x7F << (DC_VLC_BITS - 7)) + i][0] = 255;
352  rv_dc_lum.table[(0x7F << (DC_VLC_BITS - 7)) + i][1] = 18;
353  }
354  rv_dc_chrom.table = &table[1472];
358  for (int i = 0; i < 1 << (DC_VLC_BITS - 9 /* Length of skip prefix */); i++) {
359  /* Same as above. */
360  rv_dc_chrom.table[(0x1FE << (DC_VLC_BITS - 9)) + i][0] = 255;
361  rv_dc_chrom.table[(0x1FE << (DC_VLC_BITS - 9)) + i][1] = 18;
362  }
364 }
365 
367 {
368  static AVOnce init_static_once = AV_ONCE_INIT;
369  RVDecContext *rv = avctx->priv_data;
370  MpegEncContext *s = &rv->m;
371  int major_ver, minor_ver, micro_ver, ret;
372 
373  if (avctx->extradata_size < 8) {
374  av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
375  return AVERROR_INVALIDDATA;
376  }
377  if ((ret = av_image_check_size(avctx->coded_width,
378  avctx->coded_height, 0, avctx)) < 0)
379  return ret;
380 
381  ff_mpv_decode_init(s, avctx);
382 
383  s->out_format = FMT_H263;
384 
385  rv->orig_width =
386  s->width = avctx->coded_width;
387  rv->orig_height =
388  s->height = avctx->coded_height;
389 
390  s->h263_long_vectors = ((uint8_t *) avctx->extradata)[3] & 1;
391  rv->sub_id = AV_RB32((uint8_t *) avctx->extradata + 4);
392 
393  major_ver = RV_GET_MAJOR_VER(rv->sub_id);
394  minor_ver = RV_GET_MINOR_VER(rv->sub_id);
395  micro_ver = RV_GET_MICRO_VER(rv->sub_id);
396 
397  s->low_delay = 1;
398  switch (major_ver) {
399  case 1:
400  s->rv10_version = micro_ver ? 3 : 1;
401  s->obmc = micro_ver == 2;
402  break;
403  case 2:
404  if (minor_ver >= 2) {
405  s->low_delay = 0;
406  s->avctx->has_b_frames = 1;
407  }
408  break;
409  default:
410  av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", rv->sub_id);
411  avpriv_request_sample(avctx, "RV1/2 version");
412  return AVERROR_PATCHWELCOME;
413  }
414 
415  if (avctx->debug & FF_DEBUG_PICT_INFO) {
416  av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%"PRIX32"\n", rv->sub_id,
417  ((uint32_t *) avctx->extradata)[0]);
418  }
419 
420  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
421 
423  if ((ret = ff_mpv_common_init(s)) < 0)
424  return ret;
425 
426  ff_h263dsp_init(&s->h263dsp);
427 
428  /* init static VLCs */
429  ff_thread_once(&init_static_once, rv10_init_static);
430 
431  return 0;
432 }
433 
435 {
436  MpegEncContext *s = avctx->priv_data;
437 
439  return 0;
440 }
441 
442 static int rv10_decode_packet(AVCodecContext *avctx, const uint8_t *buf,
443  int buf_size, int buf_size2, int whole_size)
444 {
445  RVDecContext *rv = avctx->priv_data;
446  MpegEncContext *s = &rv->m;
447  int mb_count, mb_pos, left, start_mb_x, active_bits_size, ret;
448 
449  active_bits_size = buf_size * 8;
450  init_get_bits(&s->gb, buf, FFMAX(buf_size, buf_size2) * 8);
451  if (s->codec_id == AV_CODEC_ID_RV10)
452  mb_count = rv10_decode_picture_header(s);
453  else
454  mb_count = rv20_decode_picture_header(rv, whole_size);
455  if (mb_count < 0) {
456  if (mb_count != ERROR_SKIP_FRAME)
457  av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
458  return AVERROR_INVALIDDATA;
459  }
460 
461  if (s->mb_x >= s->mb_width ||
462  s->mb_y >= s->mb_height) {
463  av_log(s->avctx, AV_LOG_ERROR, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
464  return AVERROR_INVALIDDATA;
465  }
466  mb_pos = s->mb_y * s->mb_width + s->mb_x;
467  left = s->mb_width * s->mb_height - mb_pos;
468  if (mb_count > left) {
469  av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n");
470  return AVERROR_INVALIDDATA;
471  }
472 
473  if (whole_size < s->mb_width * s->mb_height / 8)
474  return AVERROR_INVALIDDATA;
475 
476  if ((s->mb_x == 0 && s->mb_y == 0) || !s->current_picture_ptr) {
477  // FIXME write parser so we always have complete frames?
478  if (s->current_picture_ptr) {
479  ff_er_frame_end(&s->er);
481  s->mb_x = s->mb_y = s->resync_mb_x = s->resync_mb_y = 0;
482  }
483  if ((ret = ff_mpv_frame_start(s, avctx)) < 0)
484  return ret;
486  } else {
487  if (s->current_picture_ptr->f->pict_type != s->pict_type) {
488  av_log(s->avctx, AV_LOG_ERROR, "Slice type mismatch\n");
489  return AVERROR_INVALIDDATA;
490  }
491  }
492 
493 
494  ff_dlog(avctx, "qscale=%d\n", s->qscale);
495 
496  /* default quantization values */
497  if (s->codec_id == AV_CODEC_ID_RV10) {
498  if (s->mb_y == 0)
499  s->first_slice_line = 1;
500  } else {
501  s->first_slice_line = 1;
502  s->resync_mb_x = s->mb_x;
503  }
504  start_mb_x = s->mb_x;
505  s->resync_mb_y = s->mb_y;
506  if (s->h263_aic) {
507  s->y_dc_scale_table =
508  s->c_dc_scale_table = ff_aic_dc_scale_table;
509  } else {
510  s->y_dc_scale_table =
511  s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
512  }
513 
514  if (s->modified_quant)
515  s->chroma_qscale_table = ff_h263_chroma_qscale_table;
516 
517  ff_set_qscale(s, s->qscale);
518 
519  s->rv10_first_dc_coded[0] = 0;
520  s->rv10_first_dc_coded[1] = 0;
521  s->rv10_first_dc_coded[2] = 0;
522  s->block_wrap[0] =
523  s->block_wrap[1] =
524  s->block_wrap[2] =
525  s->block_wrap[3] = s->b8_stride;
526  s->block_wrap[4] =
527  s->block_wrap[5] = s->mb_stride;
529 
530  /* decode each macroblock */
531  for (s->mb_num_left = mb_count; s->mb_num_left > 0; s->mb_num_left--) {
532  int ret;
534  ff_tlog(avctx, "**mb x=%d y=%d\n", s->mb_x, s->mb_y);
535 
536  s->mv_dir = MV_DIR_FORWARD;
537  s->mv_type = MV_TYPE_16X16;
538  ret = ff_h263_decode_mb(s, s->block);
539 
540  // Repeat the slice end check from ff_h263_decode_mb with our active
541  // bitstream size
542  if (ret != SLICE_ERROR && active_bits_size >= get_bits_count(&s->gb)) {
543  int v = show_bits(&s->gb, 16);
544 
545  if (get_bits_count(&s->gb) + 16 > active_bits_size)
546  v >>= get_bits_count(&s->gb) + 16 - active_bits_size;
547 
548  if (!v)
549  ret = SLICE_END;
550  }
551  if (ret != SLICE_ERROR && active_bits_size < get_bits_count(&s->gb) &&
552  8 * buf_size2 >= get_bits_count(&s->gb)) {
553  active_bits_size = buf_size2 * 8;
554  av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n",
555  8 * buf_size, active_bits_size);
556  ret = SLICE_OK;
557  }
558 
559  if (ret == SLICE_ERROR || active_bits_size < get_bits_count(&s->gb)) {
560  av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x,
561  s->mb_y);
562  return AVERROR_INVALIDDATA;
563  }
564  if (s->pict_type != AV_PICTURE_TYPE_B)
566  ff_mpv_reconstruct_mb(s, s->block);
567  if (s->loop_filter)
569 
570  if (++s->mb_x == s->mb_width) {
571  s->mb_x = 0;
572  s->mb_y++;
574  }
575  if (s->mb_x == s->resync_mb_x)
576  s->first_slice_line = 0;
577  if (ret == SLICE_END)
578  break;
579  }
580 
581  ff_er_add_slice(&s->er, start_mb_x, s->resync_mb_y, s->mb_x - 1, s->mb_y,
582  ER_MB_END);
583 
584  return active_bits_size;
585 }
586 
587 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
588 {
589  if (avctx->slice_count)
590  return avctx->slice_offset[n];
591  else
592  return AV_RL32(buf + n * 8);
593 }
594 
595 static int rv10_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
596  AVPacket *avpkt)
597 {
598  const uint8_t *buf = avpkt->data;
599  int buf_size = avpkt->size;
600  MpegEncContext *s = avctx->priv_data;
601  AVFrame *pict = data;
602  int i, ret;
603  int slice_count;
604  const uint8_t *slices_hdr = NULL;
605 
606  ff_dlog(avctx, "*****frame %d size=%d\n", avctx->frame_number, buf_size);
607 
608  /* no supplementary picture */
609  if (buf_size == 0) {
610  return 0;
611  }
612 
613  if (!avctx->slice_count) {
614  slice_count = (*buf++) + 1;
615  buf_size--;
616 
617  if (!slice_count || buf_size <= 8 * slice_count) {
618  av_log(avctx, AV_LOG_ERROR, "Invalid slice count: %d.\n",
619  slice_count);
620  return AVERROR_INVALIDDATA;
621  }
622 
623  slices_hdr = buf + 4;
624  buf += 8 * slice_count;
625  buf_size -= 8 * slice_count;
626  } else
627  slice_count = avctx->slice_count;
628 
629  for (i = 0; i < slice_count; i++) {
630  unsigned offset = get_slice_offset(avctx, slices_hdr, i);
631  int size, size2;
632 
633  if (offset >= buf_size)
634  return AVERROR_INVALIDDATA;
635 
636  if (i + 1 == slice_count)
637  size = buf_size - offset;
638  else
639  size = get_slice_offset(avctx, slices_hdr, i + 1) - offset;
640 
641  if (i + 2 >= slice_count)
642  size2 = buf_size - offset;
643  else
644  size2 = get_slice_offset(avctx, slices_hdr, i + 2) - offset;
645 
646  if (size <= 0 || size2 <= 0 ||
647  offset + FFMAX(size, size2) > buf_size)
648  return AVERROR_INVALIDDATA;
649 
650  if ((ret = rv10_decode_packet(avctx, buf + offset, size, size2, buf_size)) < 0)
651  return ret;
652 
653  if (ret > 8 * size)
654  i++;
655  }
656 
657  if (s->current_picture_ptr && s->mb_y >= s->mb_height) {
658  ff_er_frame_end(&s->er);
660 
661  if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
662  if ((ret = av_frame_ref(pict, s->current_picture_ptr->f)) < 0)
663  return ret;
664  ff_print_debug_info(s, s->current_picture_ptr, pict);
665  ff_mpv_export_qp_table(s, pict, s->current_picture_ptr, FF_QSCALE_TYPE_MPEG1);
666  } else if (s->last_picture_ptr) {
667  if ((ret = av_frame_ref(pict, s->last_picture_ptr->f)) < 0)
668  return ret;
669  ff_print_debug_info(s, s->last_picture_ptr, pict);
670  ff_mpv_export_qp_table(s, pict,s->last_picture_ptr, FF_QSCALE_TYPE_MPEG1);
671  }
672 
673  if (s->last_picture_ptr || s->low_delay) {
674  *got_frame = 1;
675  }
676 
677  // so we can detect if frame_end was not called (find some nicer solution...)
678  s->current_picture_ptr = NULL;
679  }
680 
681  return avpkt->size;
682 }
683 
685  .name = "rv10",
686  .long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
687  .type = AVMEDIA_TYPE_VIDEO,
688  .id = AV_CODEC_ID_RV10,
689  .priv_data_size = sizeof(RVDecContext),
691  .close = rv10_decode_end,
693  .capabilities = AV_CODEC_CAP_DR1,
694  .max_lowres = 3,
695  .pix_fmts = (const enum AVPixelFormat[]) {
698  },
699 };
700 
702  .name = "rv20",
703  .long_name = NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
704  .type = AVMEDIA_TYPE_VIDEO,
705  .id = AV_CODEC_ID_RV20,
706  .priv_data_size = sizeof(RVDecContext),
708  .close = rv10_decode_end,
710  .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
711  .flush = ff_mpeg_flush,
712  .max_lowres = 3,
713  .pix_fmts = (const enum AVPixelFormat[]) {
716  },
717 };
static void flush(AVCodecContext *avctx)
#define av_cold
Definition: attributes.h:88
uint8_t
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
Libavcodec external API header.
#define FF_DEBUG_PICT_INFO
Definition: avcodec.h:1624
#define AV_RB32
Definition: intreadwrite.h:130
#define AV_RL32
Definition: intreadwrite.h:146
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
int ff_init_vlc_from_lengths(VLC *vlc_arg, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
Definition: bitstream.c:381
#define s(width, name)
Definition: cbs_vp9.c:257
#define f(width, name)
Definition: cbs_vp9.c:255
#define FFMAX(a, b)
Definition: common.h:103
#define NULL
Definition: coverity.c:32
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
void ff_er_frame_end(ERContext *s)
#define ER_MB_END
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:797
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:659
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:77
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
@ AV_CODEC_ID_RV10
Definition: codec_id.h:54
@ AV_CODEC_ID_RV20
Definition: codec_id.h:55
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:443
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:215
#define AV_LOG_INFO
Standard information.
Definition: log.h:205
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:317
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:275
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition: avutil.h:276
void ff_h263_update_motion_val(MpegEncContext *s)
Definition: h263.c:54
void ff_h263_loop_filter(MpegEncContext *s)
Definition: h263.c:147
int ff_h263_decode_mba(MpegEncContext *s)
Definition: ituh263dec.c:138
void ff_h263_decode_init_vlc(void)
Definition: ituh263dec.c:108
int ff_h263_decode_mb(MpegEncContext *s, int16_t block[6][64])
Definition: ituh263dec.c:696
const uint8_t ff_aic_dc_scale_table[32]
Definition: h263data.c:245
const uint8_t ff_h263_chroma_qscale_table[32]
Definition: h263data.c:260
H.263 tables.
av_cold void ff_h263dsp_init(H263DSPContext *ctx)
Definition: h263dsp.c:117
misc image utilities
int32_t rv
Definition: input.c:405
int i
Definition: input.c:407
#define av_log2
Definition: intmath.h:83
#define ff_tlog(ctx,...)
Definition: internal.h:96
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:84
#define FF_QSCALE_TYPE_MPEG1
Definition: internal.h:102
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
#define AVOnce
Definition: thread.h:172
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:175
#define AV_ONCE_INIT
Definition: thread.h:173
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:309
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
Definition: mpeg4video.c:71
void ff_mpeg_er_frame_start(MpegEncContext *s)
Definition: mpeg_er.c:46
@ FMT_H263
Definition: mpegutils.h:126
int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
generic function called after decoding the header and before a frame is decoded.
Definition: mpegvideo.c:1181
void ff_mpv_common_end(MpegEncContext *s)
Definition: mpegvideo.c:1111
void ff_mpv_frame_end(MpegEncContext *s)
Definition: mpegvideo.c:1405
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
Definition: mpegvideo.c:913
void ff_mpeg_flush(AVCodecContext *avctx)
Definition: mpegvideo.c:2300
int ff_mpv_export_qp_table(MpegEncContext *s, AVFrame *f, Picture *p, int qp_type)
Definition: mpegvideo.c:1420
av_cold void ff_mpv_idct_init(MpegEncContext *s)
Definition: mpegvideo.c:331
void ff_print_debug_info(MpegEncContext *s, Picture *p, AVFrame *pict)
Definition: mpegvideo.c:1413
void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
Definition: mpegvideo.c:2248
void ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx)
Initialize the given MpegEncContext for decoding.
Definition: mpegvideo.c:699
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
Definition: mpegvideo.c:2331
void ff_init_block_index(MpegEncContext *s)
Definition: mpegvideo.c:2267
mpegvideo header.
#define SLICE_END
end marker found
Definition: mpegvideo.h:523
#define MV_DIR_FORWARD
Definition: mpegvideo.h:262
#define SLICE_OK
Definition: mpegvideo.h:521
#define MV_TYPE_16X16
1 vector for the whole mb
Definition: mpegvideo.h:266
#define SLICE_ERROR
Definition: mpegvideo.h:522
static void ff_update_block_index(MpegEncContext *s)
Definition: mpegvideo.h:750
const uint8_t ff_mpeg1_dc_scale_table[128]
Definition: mpegvideodata.c:33
const char data[16]
Definition: mxf.c:142
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
static const uint16_t table[]
Definition: prosumer.c:206
static const uint16_t rv_lum_len_count[15]
Definition: rv10.c:71
#define MAX_VLC_ENTRIES
Definition: rv10.c:49
static av_cold int rv10_decode_end(AVCodecContext *avctx)
Definition: rv10.c:434
#define RV_GET_MINOR_VER(x)
Definition: rv10.c:46
static int rv10_decode_packet(AVCodecContext *avctx, const uint8_t *buf, int buf_size, int buf_size2, int whole_size)
Definition: rv10.c:442
AVCodec ff_rv20_decoder
Definition: rv10.c:701
static int rv20_decode_picture_header(RVDecContext *rv, int whole_size)
Definition: rv10.c:157
static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
Definition: rv10.c:587
static const uint8_t rv_sym_run_len[][2]
Definition: rv10.c:62
static av_cold void rv10_init_static(void)
Definition: rv10.c:340
static av_cold void rv10_build_vlc(VLC *vlc, const uint16_t len_count[15], const uint8_t sym_rl[][2], int sym_rl_elems)
Definition: rv10.c:319
#define RV_GET_MAJOR_VER(x)
Definition: rv10.c:45
AVCodec ff_rv10_decoder
Definition: rv10.c:684
static VLC rv_dc_chrom
Definition: rv10.c:79
static int rv10_decode_picture_header(MpegEncContext *s)
Definition: rv10.c:98
#define ERROR_SKIP_FRAME
#define DC_VLC_BITS
Definition: rv10.c:50
#define RV_GET_MICRO_VER(x)
Definition: rv10.c:47
static int rv10_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: rv10.c:595
static const uint16_t rv_chrom_len_count[15]
Definition: rv10.c:75
static av_cold int rv10_decode_init(AVCodecContext *avctx)
Definition: rv10.c:366
static VLC rv_dc_lum
Definition: rv10.c:79
int ff_rv_decode_dc(MpegEncContext *s, int n)
Definition: rv10.c:81
#define FF_ARRAY_ELEMS(a)
const uint8_t * code
Definition: spdifenc.c:413
main external API structure.
Definition: avcodec.h:536
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:746
int debug
debug
Definition: avcodec.h:1623
int slice_count
slice count
Definition: avcodec.h:890
int frame_number
Frame counter, set by libavcodec.
Definition: avcodec.h:1227
int coded_height
Definition: avcodec.h:724
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:637
int extradata_size
Definition: avcodec.h:638
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:724
int * slice_offset
slice offsets in the frame in bytes
Definition: avcodec.h:906
void * priv_data
Definition: avcodec.h:563
AVCodec.
Definition: codec.h:197
const char * name
Name of the codec implementation.
Definition: codec.h:204
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
This structure stores compressed data.
Definition: packet.h:346
int size
Definition: packet.h:370
uint8_t * data
Definition: packet.h:369
Rational number (pair of numerator and denominator).
Definition: rational.h:58
int num
Numerator.
Definition: rational.h:59
MpegEncContext.
Definition: mpegvideo.h:81
int orig_height
Definition: rv10.c:55
int orig_width
Definition: rv10.c:55
MpegEncContext m
Definition: rv10.c:53
int sub_id
Definition: rv10.c:54
Definition: vlc.h:26
int table_allocated
Definition: vlc.h:29
VLC_TYPE(* table)[2]
code, bits
Definition: vlc.h:28
#define ff_dlog(a,...)
#define avpriv_request_sample(...)
#define av_log(a,...)
static uint8_t tmp[11]
Definition: aes_ctr.c:27
int size
static const uint8_t offset[127][2]
Definition: vf_spp.c:107
#define INIT_VLC_STATIC_OVERLONG
Definition: vlc.h:96
#define VLC_TYPE
Definition: vlc.h:24