FFmpeg
h263dec.c
Go to the documentation of this file.
1 /*
2  * H.263 decoder
3  * Copyright (c) 2001 Fabrice Bellard
4  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
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  * H.263 decoder.
26  */
27 
28 #define UNCHECKED_BITSTREAM_READER 1
29 
30 #include "config_components.h"
31 
32 #include "avcodec.h"
33 #include "codec_internal.h"
34 #include "decode.h"
35 #include "error_resilience.h"
36 #include "flvdec.h"
37 #include "h263.h"
38 #include "h263dec.h"
39 #if FF_API_FLAG_TRUNCATED
40 #include "h263_parser.h"
41 #endif
42 #include "hwconfig.h"
43 #include "mpeg_er.h"
44 #include "mpeg4video.h"
45 #include "mpeg4videodec.h"
46 #include "mpeg4videodefs.h"
47 #if FF_API_FLAG_TRUNCATED
48 #include "mpeg4video_parser.h"
49 #endif
50 #include "mpegutils.h"
51 #include "mpegvideo.h"
52 #include "mpegvideodec.h"
53 #include "msmpeg4dec.h"
54 #include "thread.h"
55 #include "wmv2dec.h"
56 
58 {
59  /* MPEG-4 Studio Profile only, not supported by hardware */
60  if (avctx->bits_per_raw_sample > 8) {
61  av_assert1(((MpegEncContext *)avctx->priv_data)->studio_profile);
62  return avctx->pix_fmt;
63  }
64 
65  if (CONFIG_GRAY && (avctx->flags & AV_CODEC_FLAG_GRAY)) {
68  return AV_PIX_FMT_GRAY8;
69  }
70 
71  return avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
72 }
73 
75 {
76  MpegEncContext *s = avctx->priv_data;
77  int ret;
78 
79  s->out_format = FMT_H263;
80 
81  // set defaults
82  ff_mpv_decode_init(s, avctx);
83 
84  s->quant_precision = 5;
85  s->decode_mb = ff_h263_decode_mb;
86  s->low_delay = 1;
87 
88  /* select sub codec */
89  switch (avctx->codec->id) {
90  case AV_CODEC_ID_H263:
91  case AV_CODEC_ID_H263P:
93  break;
94  case AV_CODEC_ID_MPEG4:
95  break;
97  s->h263_pred = 1;
98  s->msmpeg4_version = 1;
99  break;
101  s->h263_pred = 1;
102  s->msmpeg4_version = 2;
103  break;
105  s->h263_pred = 1;
106  s->msmpeg4_version = 3;
107  break;
108  case AV_CODEC_ID_WMV1:
109  s->h263_pred = 1;
110  s->msmpeg4_version = 4;
111  break;
112  case AV_CODEC_ID_WMV2:
113  s->h263_pred = 1;
114  s->msmpeg4_version = 5;
115  break;
116  case AV_CODEC_ID_H263I:
117  break;
118  case AV_CODEC_ID_FLV1:
119  s->h263_flv = 1;
120  break;
121  default:
122  av_log(avctx, AV_LOG_ERROR, "Unsupported codec %d\n",
123  avctx->codec->id);
124  return AVERROR(ENOSYS);
125  }
126 
127  if (avctx->codec_tag == AV_RL32("L263") || avctx->codec_tag == AV_RL32("S263"))
128  if (avctx->extradata_size == 56 && avctx->extradata[0] == 1)
129  s->ehc_mode = 1;
130 
131  /* for H.263, we allocate the images after having read the header */
132  if (avctx->codec->id != AV_CODEC_ID_H263 &&
133  avctx->codec->id != AV_CODEC_ID_H263P &&
134  avctx->codec->id != AV_CODEC_ID_MPEG4) {
135  avctx->pix_fmt = h263_get_format(avctx);
137  if ((ret = ff_mpv_common_init(s)) < 0)
138  return ret;
139  }
140 
141  ff_h263dsp_init(&s->h263dsp);
143 
144  return 0;
145 }
146 
148 {
149  MpegEncContext *s = avctx->priv_data;
150 
152  return 0;
153 }
154 
155 /**
156  * Return the number of bytes consumed for building the current frame.
157  */
158 static int get_consumed_bytes(MpegEncContext *s, int buf_size)
159 {
160  int pos = (get_bits_count(&s->gb) + 7) >> 3;
161 
162  if (s->divx_packed || s->avctx->hwaccel) {
163  /* We would have to scan through the whole buf to handle the weird
164  * reordering ... */
165  return buf_size;
166 #if FF_API_FLAG_TRUNCATED
167  } else if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) {
168  pos -= s->parse_context.last_index;
169  // padding is not really read so this might be -1
170  if (pos < 0)
171  pos = 0;
172  return pos;
173 #endif
174  } else {
175  // avoid infinite loops (maybe not needed...)
176  if (pos == 0)
177  pos = 1;
178  // oops ;)
179  if (pos + 10 > buf_size)
180  pos = buf_size;
181 
182  return pos;
183  }
184 }
185 
187 {
188  const int part_mask = s->partitioned_frame
189  ? (ER_AC_END | ER_AC_ERROR) : 0x7F;
190  const int mb_size = 16 >> s->avctx->lowres;
191  int ret;
192 
193  s->last_resync_gb = s->gb;
194  s->first_slice_line = 1;
195  s->resync_mb_x = s->mb_x;
196  s->resync_mb_y = s->mb_y;
197 
198  ff_set_qscale(s, s->qscale);
199 
200  if (s->studio_profile) {
201  if ((ret = ff_mpeg4_decode_studio_slice_header(s->avctx->priv_data)) < 0)
202  return ret;
203  }
204 
205  if (s->avctx->hwaccel) {
206  const uint8_t *start = s->gb.buffer + get_bits_count(&s->gb) / 8;
207  ret = s->avctx->hwaccel->decode_slice(s->avctx, start, s->gb.buffer_end - start);
208  // ensure we exit decode loop
209  s->mb_y = s->mb_height;
210  return ret;
211  }
212 
213  if (s->partitioned_frame) {
214  const int qscale = s->qscale;
215 
216  if (CONFIG_MPEG4_DECODER && s->codec_id == AV_CODEC_ID_MPEG4)
217  if ((ret = ff_mpeg4_decode_partitions(s->avctx->priv_data)) < 0)
218  return ret;
219 
220  /* restore variables which were modified */
221  s->first_slice_line = 1;
222  s->mb_x = s->resync_mb_x;
223  s->mb_y = s->resync_mb_y;
224  ff_set_qscale(s, qscale);
225  }
226 
227  for (; s->mb_y < s->mb_height; s->mb_y++) {
228  /* per-row end of slice checks */
229  if (s->msmpeg4_version) {
230  if (s->resync_mb_y + s->slice_height == s->mb_y) {
231  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y,
232  s->mb_x - 1, s->mb_y, ER_MB_END);
233 
234  return 0;
235  }
236  }
237 
238  if (s->msmpeg4_version == 1) {
239  s->last_dc[0] =
240  s->last_dc[1] =
241  s->last_dc[2] = 128;
242  }
243 
245  for (; s->mb_x < s->mb_width; s->mb_x++) {
246  int ret;
247 
248  ff_update_block_index(s, s->avctx->bits_per_raw_sample,
249  s->avctx->lowres, s->chroma_x_shift);
250 
251  if (s->resync_mb_x == s->mb_x && s->resync_mb_y + 1 == s->mb_y)
252  s->first_slice_line = 0;
253 
254  /* DCT & quantize */
255 
256  s->mv_dir = MV_DIR_FORWARD;
257  s->mv_type = MV_TYPE_16X16;
258  ff_dlog(s, "%d %06X\n",
259  get_bits_count(&s->gb), show_bits(&s->gb, 24));
260 
261  ff_tlog(NULL, "Decoding MB at %dx%d\n", s->mb_x, s->mb_y);
262  ret = s->decode_mb(s, s->block);
263 
264  if (s->pict_type != AV_PICTURE_TYPE_B)
266 
267  if (ret < 0) {
268  const int xy = s->mb_x + s->mb_y * s->mb_stride;
269  if (ret == SLICE_END) {
270  ff_mpv_reconstruct_mb(s, s->block);
271  if (s->loop_filter)
273 
274  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y,
275  s->mb_x, s->mb_y, ER_MB_END & part_mask);
276 
277  s->padding_bug_score--;
278 
279  if (++s->mb_x >= s->mb_width) {
280  s->mb_x = 0;
281  ff_mpeg_draw_horiz_band(s, s->mb_y * mb_size, mb_size);
283  s->mb_y++;
284  }
285  return 0;
286  } else if (ret == SLICE_NOEND) {
287  av_log(s->avctx, AV_LOG_ERROR,
288  "Slice mismatch at MB: %d\n", xy);
289  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y,
290  s->mb_x + 1, s->mb_y,
291  ER_MB_END & part_mask);
292  return AVERROR_INVALIDDATA;
293  }
294  av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy);
295  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y,
296  s->mb_x, s->mb_y, ER_MB_ERROR & part_mask);
297 
298  if (s->avctx->err_recognition & AV_EF_IGNORE_ERR)
299  continue;
300  return AVERROR_INVALIDDATA;
301  }
302 
303  ff_mpv_reconstruct_mb(s, s->block);
304  if (s->loop_filter)
306  }
307 
308  ff_mpeg_draw_horiz_band(s, s->mb_y * mb_size, mb_size);
310 
311  s->mb_x = 0;
312  }
313 
314  av_assert1(s->mb_x == 0 && s->mb_y == s->mb_height);
315 
316  // Detect incorrect padding with wrong stuffing codes used by NEC N-02B
317  if (s->codec_id == AV_CODEC_ID_MPEG4 &&
318  (s->workaround_bugs & FF_BUG_AUTODETECT) &&
319  get_bits_left(&s->gb) >= 48 &&
320  show_bits(&s->gb, 24) == 0x4010 &&
321  !s->data_partitioning)
322  s->padding_bug_score += 32;
323 
324  /* try to detect the padding bug */
325  if (s->codec_id == AV_CODEC_ID_MPEG4 &&
326  (s->workaround_bugs & FF_BUG_AUTODETECT) &&
327  get_bits_left(&s->gb) >= 0 &&
328  get_bits_left(&s->gb) < 137 &&
329  !s->data_partitioning) {
330  const int bits_count = get_bits_count(&s->gb);
331  const int bits_left = s->gb.size_in_bits - bits_count;
332 
333  if (bits_left == 0) {
334  s->padding_bug_score += 16;
335  } else if (bits_left != 1) {
336  int v = show_bits(&s->gb, 8);
337  v |= 0x7F >> (7 - (bits_count & 7));
338 
339  if (v == 0x7F && bits_left <= 8)
340  s->padding_bug_score--;
341  else if (v == 0x7F && ((get_bits_count(&s->gb) + 8) & 8) &&
342  bits_left <= 16)
343  s->padding_bug_score += 4;
344  else
345  s->padding_bug_score++;
346  }
347  }
348 
349  if (s->codec_id == AV_CODEC_ID_H263 &&
350  (s->workaround_bugs & FF_BUG_AUTODETECT) &&
351  get_bits_left(&s->gb) >= 8 &&
352  get_bits_left(&s->gb) < 300 &&
353  s->pict_type == AV_PICTURE_TYPE_I &&
354  show_bits(&s->gb, 8) == 0 &&
355  !s->data_partitioning) {
356 
357  s->padding_bug_score += 32;
358  }
359 
360  if (s->codec_id == AV_CODEC_ID_H263 &&
361  (s->workaround_bugs & FF_BUG_AUTODETECT) &&
362  get_bits_left(&s->gb) >= 64 &&
363  AV_RB64(s->gb.buffer_end - 8) == 0xCDCDCDCDFC7F0000) {
364 
365  s->padding_bug_score += 32;
366  }
367 
368  if (s->workaround_bugs & FF_BUG_AUTODETECT) {
369  if (
370  (s->padding_bug_score > -2 && !s->data_partitioning))
371  s->workaround_bugs |= FF_BUG_NO_PADDING;
372  else
373  s->workaround_bugs &= ~FF_BUG_NO_PADDING;
374  }
375 
376  // handle formats which don't have unique end markers
377  if (s->msmpeg4_version || (s->workaround_bugs & FF_BUG_NO_PADDING)) { // FIXME perhaps solve this more cleanly
378  int left = get_bits_left(&s->gb);
379  int max_extra = 7;
380 
381  /* no markers in M$ crap */
382  if (s->msmpeg4_version && s->pict_type == AV_PICTURE_TYPE_I)
383  max_extra += 17;
384 
385  /* buggy padding but the frame should still end approximately at
386  * the bitstream end */
387  if ((s->workaround_bugs & FF_BUG_NO_PADDING) &&
388  (s->avctx->err_recognition & (AV_EF_BUFFER|AV_EF_AGGRESSIVE)))
389  max_extra += 48;
390  else if ((s->workaround_bugs & FF_BUG_NO_PADDING))
391  max_extra += 256 * 256 * 256 * 64;
392 
393  if (left > max_extra)
394  av_log(s->avctx, AV_LOG_ERROR,
395  "discarding %d junk bits at end, next would be %X\n",
396  left, show_bits(&s->gb, 24));
397  else if (left < 0)
398  av_log(s->avctx, AV_LOG_ERROR, "overreading %d bits\n", -left);
399  else
400  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y,
401  s->mb_x - 1, s->mb_y, ER_MB_END);
402 
403  return 0;
404  }
405 
406  av_log(s->avctx, AV_LOG_ERROR,
407  "slice end not reached but screenspace end (%d left %06X, score= %d)\n",
408  get_bits_left(&s->gb), show_bits(&s->gb, 24), s->padding_bug_score);
409 
410  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y,
411  ER_MB_END & part_mask);
412 
413  return AVERROR_INVALIDDATA;
414 }
415 
417  int *got_frame, AVPacket *avpkt)
418 {
419  const uint8_t *buf = avpkt->data;
420  int buf_size = avpkt->size;
421  MpegEncContext *s = avctx->priv_data;
422  int ret;
423  int slice_ret = 0;
424 
425  /* no supplementary picture */
426  if (buf_size == 0) {
427  /* special case for last picture */
428  if (s->low_delay == 0 && s->next_picture_ptr) {
429  if ((ret = av_frame_ref(pict, s->next_picture_ptr->f)) < 0)
430  return ret;
431  s->next_picture_ptr = NULL;
432 
433  *got_frame = 1;
434  }
435 
436  return 0;
437  }
438 
439 #if FF_API_FLAG_TRUNCATED
440  if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) {
441  int next;
442 
443  if (CONFIG_MPEG4_DECODER && s->codec_id == AV_CODEC_ID_MPEG4) {
444  next = ff_mpeg4_find_frame_end(&s->parse_context, buf, buf_size);
445  } else if (CONFIG_H263_DECODER && s->codec_id == AV_CODEC_ID_H263) {
446  next = ff_h263_find_frame_end(&s->parse_context, buf, buf_size);
447  } else if (CONFIG_H263P_DECODER && s->codec_id == AV_CODEC_ID_H263P) {
448  next = ff_h263_find_frame_end(&s->parse_context, buf, buf_size);
449  } else {
450  av_log(s->avctx, AV_LOG_ERROR,
451  "this codec does not support truncated bitstreams\n");
452  return AVERROR(ENOSYS);
453  }
454 
455  if (ff_combine_frame(&s->parse_context, next, (const uint8_t **)&buf,
456  &buf_size) < 0)
457  return buf_size;
458  }
459 #endif
460 
461 retry:
462  if (s->divx_packed && s->bitstream_buffer_size) {
463  int i;
464  for(i=0; i < buf_size-3; i++) {
465  if (buf[i]==0 && buf[i+1]==0 && buf[i+2]==1) {
466  if (buf[i+3]==0xB0) {
467  av_log(s->avctx, AV_LOG_WARNING, "Discarding excessive bitstream in packed xvid\n");
468  s->bitstream_buffer_size = 0;
469  }
470  break;
471  }
472  }
473  }
474 
475  if (s->bitstream_buffer_size && (s->divx_packed || buf_size <= MAX_NVOP_SIZE)) // divx 5.01+/xvid frame reorder
476  ret = init_get_bits8(&s->gb, s->bitstream_buffer,
477  s->bitstream_buffer_size);
478  else
479  ret = init_get_bits8(&s->gb, buf, buf_size);
480 
481  s->bitstream_buffer_size = 0;
482  if (ret < 0)
483  return ret;
484 
485  if (!s->context_initialized)
486  // we need the idct permutation for reading a custom matrix
488 
489  /* let's go :-) */
490  if (CONFIG_WMV2_DECODER && s->msmpeg4_version == 5) {
492  } else if (CONFIG_MSMPEG4DEC && s->msmpeg4_version) {
494  } else if (CONFIG_MPEG4_DECODER && avctx->codec_id == AV_CODEC_ID_MPEG4) {
495  if (s->avctx->extradata_size && !s->extradata_parsed) {
496  GetBitContext gb;
497 
498  if (init_get_bits8(&gb, s->avctx->extradata, s->avctx->extradata_size) >= 0 )
499  ff_mpeg4_decode_picture_header(avctx->priv_data, &gb, 1, 0);
500  s->extradata_parsed = 1;
501  }
502  ret = ff_mpeg4_decode_picture_header(avctx->priv_data, &s->gb, 0, 0);
503  } else if (CONFIG_H263I_DECODER && s->codec_id == AV_CODEC_ID_H263I) {
505  } else if (CONFIG_FLV_DECODER && s->h263_flv) {
507  } else {
509  }
510 
511  if (ret < 0 || ret == FRAME_SKIPPED) {
512  if ( s->width != avctx->coded_width
513  || s->height != avctx->coded_height) {
514  av_log(s->avctx, AV_LOG_WARNING, "Reverting picture dimensions change due to header decoding failure\n");
515  s->width = avctx->coded_width;
516  s->height= avctx->coded_height;
517  }
518  }
519  if (ret == FRAME_SKIPPED)
520  return get_consumed_bytes(s, buf_size);
521 
522  /* skip if the header was thrashed */
523  if (ret < 0) {
524  av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
525  return ret;
526  }
527 
528  if (!s->context_initialized) {
529  avctx->pix_fmt = h263_get_format(avctx);
530  if ((ret = ff_mpv_common_init(s)) < 0)
531  return ret;
532  }
533 
534  avctx->has_b_frames = !s->low_delay;
535 
536  if (CONFIG_MPEG4_DECODER && avctx->codec_id == AV_CODEC_ID_MPEG4) {
537  if (s->pict_type != AV_PICTURE_TYPE_B && s->mb_num/2 > get_bits_left(&s->gb))
538  return AVERROR_INVALIDDATA;
539  if (ff_mpeg4_workaround_bugs(avctx) == 1)
540  goto retry;
541  if (s->studio_profile != (s->idsp.idct == NULL))
543  }
544 
545  /* After H.263 & MPEG-4 header decode we have the height, width,
546  * and other parameters. So then we could init the picture.
547  * FIXME: By the way H.263 decoder is evolving it should have
548  * an H263EncContext */
549  if (s->width != avctx->coded_width ||
550  s->height != avctx->coded_height ||
551  s->context_reinit) {
552  /* H.263 could change picture size any time */
553  s->context_reinit = 0;
554 
555  ret = ff_set_dimensions(avctx, s->width, s->height);
556  if (ret < 0)
557  return ret;
558 
559  ff_set_sar(avctx, avctx->sample_aspect_ratio);
560 
562  return ret;
563 
564  if (avctx->pix_fmt != h263_get_format(avctx)) {
565  av_log(avctx, AV_LOG_ERROR, "format change not supported\n");
566  avctx->pix_fmt = AV_PIX_FMT_NONE;
567  return AVERROR_UNKNOWN;
568  }
569  }
570 
571  if (s->codec_id == AV_CODEC_ID_H263 ||
572  s->codec_id == AV_CODEC_ID_H263P ||
573  s->codec_id == AV_CODEC_ID_H263I)
574  s->gob_index = H263_GOB_HEIGHT(s->height);
575 
576  /* skip B-frames if we don't have reference frames */
577  if (!s->last_picture_ptr &&
578  (s->pict_type == AV_PICTURE_TYPE_B || s->droppable))
579  return get_consumed_bytes(s, buf_size);
580  if ((avctx->skip_frame >= AVDISCARD_NONREF &&
581  s->pict_type == AV_PICTURE_TYPE_B) ||
582  (avctx->skip_frame >= AVDISCARD_NONKEY &&
583  s->pict_type != AV_PICTURE_TYPE_I) ||
584  avctx->skip_frame >= AVDISCARD_ALL)
585  return get_consumed_bytes(s, buf_size);
586 
587  if ((ret = ff_mpv_frame_start(s, avctx)) < 0)
588  return ret;
589 
590  if (!s->divx_packed && !avctx->hwaccel)
591  ff_thread_finish_setup(avctx);
592 
593  if (avctx->hwaccel) {
594  ret = avctx->hwaccel->start_frame(avctx, s->gb.buffer,
595  s->gb.buffer_end - s->gb.buffer);
596  if (ret < 0 )
597  return ret;
598  }
599 
601 
602  /* the second part of the wmv2 header contains the MB skip bits which
603  * are stored in current_picture->mb_type which is not available before
604  * ff_mpv_frame_start() */
605  if (CONFIG_WMV2_DECODER && s->msmpeg4_version == 5) {
607  if (ret < 0)
608  return ret;
609  if (ret == 1)
610  goto frame_end;
611  }
612 
613  /* decode each macroblock */
614  s->mb_x = 0;
615  s->mb_y = 0;
616 
617  slice_ret = decode_slice(s);
618  while (s->mb_y < s->mb_height) {
619  if (s->msmpeg4_version) {
620  if (s->slice_height == 0 || s->mb_x != 0 || slice_ret < 0 ||
621  (s->mb_y % s->slice_height) != 0 || get_bits_left(&s->gb) < 0)
622  break;
623  } else {
624  int prev_x = s->mb_x, prev_y = s->mb_y;
625  if (ff_h263_resync(s) < 0)
626  break;
627  if (prev_y * s->mb_width + prev_x < s->mb_y * s->mb_width + s->mb_x)
628  s->er.error_occurred = 1;
629  }
630 
631  if (s->msmpeg4_version < 4 && s->h263_pred)
633 
634  if (decode_slice(s) < 0)
635  slice_ret = AVERROR_INVALIDDATA;
636  }
637 
638  if (s->msmpeg4_version && s->msmpeg4_version < 4 &&
639  s->pict_type == AV_PICTURE_TYPE_I)
640  if (!CONFIG_MSMPEG4DEC ||
641  ff_msmpeg4_decode_ext_header(s, buf_size) < 0)
642  s->er.error_status_table[s->mb_num - 1] = ER_MB_ERROR;
643 
644  av_assert1(s->bitstream_buffer_size == 0);
645 frame_end:
646  if (!s->studio_profile)
647  ff_er_frame_end(&s->er);
648 
649  if (avctx->hwaccel) {
650  ret = avctx->hwaccel->end_frame(avctx);
651  if (ret < 0)
652  return ret;
653  }
654 
656 
657  if (CONFIG_MPEG4_DECODER && avctx->codec_id == AV_CODEC_ID_MPEG4)
658  ff_mpeg4_frame_end(avctx, buf, buf_size);
659 
660  if (!s->divx_packed && avctx->hwaccel)
661  ff_thread_finish_setup(avctx);
662 
663  av_assert1(s->current_picture.f->pict_type == s->current_picture_ptr->f->pict_type);
664  av_assert1(s->current_picture.f->pict_type == s->pict_type);
665  if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
666  if ((ret = av_frame_ref(pict, s->current_picture_ptr->f)) < 0)
667  return ret;
668  ff_print_debug_info(s, s->current_picture_ptr, pict);
669  ff_mpv_export_qp_table(s, pict, s->current_picture_ptr, FF_MPV_QSCALE_TYPE_MPEG1);
670  } else if (s->last_picture_ptr) {
671  if ((ret = av_frame_ref(pict, s->last_picture_ptr->f)) < 0)
672  return ret;
673  ff_print_debug_info(s, s->last_picture_ptr, pict);
674  ff_mpv_export_qp_table(s, pict, s->last_picture_ptr, FF_MPV_QSCALE_TYPE_MPEG1);
675  }
676 
677  if (s->last_picture_ptr || s->low_delay) {
678  if ( pict->format == AV_PIX_FMT_YUV420P
679  && (s->codec_tag == AV_RL32("GEOV") || s->codec_tag == AV_RL32("GEOX"))) {
680  for (int p = 0; p < 3; p++) {
681  int h = AV_CEIL_RSHIFT(pict->height, !!p);
682 
683  pict->data[p] += (h - 1) * pict->linesize[p];
684  pict->linesize[p] *= -1;
685  }
686  }
687  *got_frame = 1;
688  }
689 
690  if (slice_ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
691  return slice_ret;
692  else
693  return get_consumed_bytes(s, buf_size);
694 }
695 
697 #if CONFIG_H263_VAAPI_HWACCEL || CONFIG_MPEG4_VAAPI_HWACCEL
699 #endif
700 #if CONFIG_MPEG4_NVDEC_HWACCEL
702 #endif
703 #if CONFIG_MPEG4_VDPAU_HWACCEL
705 #endif
706 #if CONFIG_H263_VIDEOTOOLBOX_HWACCEL || CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL
708 #endif
711 };
712 
714 #if CONFIG_H263_VAAPI_HWACCEL
715  HWACCEL_VAAPI(h263),
716 #endif
717 #if CONFIG_MPEG4_NVDEC_HWACCEL
718  HWACCEL_NVDEC(mpeg4),
719 #endif
720 #if CONFIG_MPEG4_VDPAU_HWACCEL
721  HWACCEL_VDPAU(mpeg4),
722 #endif
723 #if CONFIG_H263_VIDEOTOOLBOX_HWACCEL
724  HWACCEL_VIDEOTOOLBOX(h263),
725 #endif
726  NULL
727 };
728 
730  .p.name = "h263",
731  CODEC_LONG_NAME("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
732  .p.type = AVMEDIA_TYPE_VIDEO,
733  .p.id = AV_CODEC_ID_H263,
734  .priv_data_size = sizeof(MpegEncContext),
736  .close = ff_h263_decode_end,
738  .p.capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 |
739 #if FF_API_FLAG_TRUNCATED
740  AV_CODEC_CAP_TRUNCATED |
741 #endif
743  .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
744  .flush = ff_mpeg_flush,
745  .p.max_lowres = 3,
746  .p.pix_fmts = ff_h263_hwaccel_pixfmt_list_420,
747  .hw_configs = h263_hw_config_list,
748 };
749 
751  .p.name = "h263p",
752  CODEC_LONG_NAME("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
753  .p.type = AVMEDIA_TYPE_VIDEO,
754  .p.id = AV_CODEC_ID_H263P,
755  .priv_data_size = sizeof(MpegEncContext),
757  .close = ff_h263_decode_end,
759  .p.capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 |
760 #if FF_API_FLAG_TRUNCATED
761  AV_CODEC_CAP_TRUNCATED |
762 #endif
764  .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
765  .flush = ff_mpeg_flush,
766  .p.max_lowres = 3,
767  .p.pix_fmts = ff_h263_hwaccel_pixfmt_list_420,
768  .hw_configs = h263_hw_config_list,
769 };
ff_mpv_common_init
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
Definition: mpegvideo.c:682
hwconfig.h
AVCodecContext::hwaccel
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition: avcodec.h:1369
MV_TYPE_16X16
#define MV_TYPE_16X16
1 vector for the whole mb
Definition: mpegvideo.h:264
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:253
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
h263_hw_config_list
static const AVCodecHWConfigInternal *const h263_hw_config_list[]
Definition: h263dec.c:713
H263_GOB_HEIGHT
#define H263_GOB_HEIGHT(h)
Definition: h263.h:28
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:839
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
ff_mpv_export_qp_table
int ff_mpv_export_qp_table(const MpegEncContext *s, AVFrame *f, const Picture *p, int qp_type)
Definition: mpegvideo_dec.c:502
ff_h263_decode_mb
int ff_h263_decode_mb(MpegEncContext *s, int16_t block[6][64])
Definition: ituh263dec.c:787
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1147
mpeg4videodec.h
AVCodecContext::err_recognition
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition: avcodec.h:1351
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
AVCodec::pix_fmts
enum AVPixelFormat * pix_fmts
array of supported pixel formats, or NULL if unknown, array is terminated by -1
Definition: codec.h:226
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:325
ff_mpv_report_decode_progress
void ff_mpv_report_decode_progress(MpegEncContext *s)
Definition: mpegvideo_dec.c:569
AVPacket::data
uint8_t * data
Definition: packet.h:374
ff_mpeg4_decode_studio_slice_header
int ff_mpeg4_decode_studio_slice_header(Mpeg4DecContext *ctx)
Decode the next video packet.
Definition: mpeg4videodec.c:793
ff_msmpeg4_decode_ext_header
int ff_msmpeg4_decode_ext_header(MpegEncContext *s, int buf_size)
Definition: msmpeg4dec.c:541
FFCodec
Definition: codec_internal.h:119
ff_er_add_slice
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
Definition: error_resilience.c:822
ff_init_block_index
void ff_init_block_index(MpegEncContext *s)
Definition: mpegvideo.c:857
mpegvideo.h
AVERROR_UNKNOWN
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:73
mpegutils.h
ff_set_dimensions
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:91
thread.h
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:346
ff_wmv2_decode_secondary_picture_header
int ff_wmv2_decode_secondary_picture_header(MpegEncContext *s)
Definition: wmv2dec.c:239
ff_mpeg4_frame_end
int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
Definition: mpeg4videodec.c:3651
ff_mpv_reconstruct_mb
void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
Definition: mpegvideo_dec.c:1010
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:123
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:407
AVCodecContext::skip_frame
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition: avcodec.h:1698
GetBitContext
Definition: get_bits.h:61
decode_slice
static int decode_slice(MpegEncContext *s)
Definition: h263dec.c:186
ff_h263dsp_init
av_cold void ff_h263dsp_init(H263DSPContext *ctx)
Definition: h263dsp.c:117
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:478
HWACCEL_VDPAU
#define HWACCEL_VDPAU(codec)
Definition: hwconfig.h:75
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:586
ff_print_debug_info
void ff_print_debug_info(const MpegEncContext *s, const Picture *p, AVFrame *pict)
Definition: mpegvideo_dec.c:495
SLICE_END
#define SLICE_END
end marker found
Definition: mpegvideo.h:480
ff_h263_decode_picture_header
int ff_h263_decode_picture_header(MpegEncContext *s)
Definition: ituh263dec.c:1089
AV_CODEC_ID_MSMPEG4V2
@ AV_CODEC_ID_MSMPEG4V2
Definition: codec_id.h:67
ff_h263_update_motion_val
void ff_h263_update_motion_val(MpegEncContext *s)
Definition: h263.c:53
ff_h263_find_frame_end
int ff_h263_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size)
Definition: h263_parser.c:32
ff_mpv_common_end
void ff_mpv_common_end(MpegEncContext *s)
Definition: mpegvideo.c:788
mpegvideodec.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
h263dec.h
av_cold
#define av_cold
Definition: attributes.h:90
AV_CODEC_ID_H263I
@ AV_CODEC_ID_H263I
Definition: codec_id.h:72
ff_mpeg4_decode_partitions
int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx)
Decode the first and second partition.
Definition: mpeg4videodec.c:1224
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:667
ff_wmv2_decode_picture_header
int ff_wmv2_decode_picture_header(MpegEncContext *s)
Definition: wmv2dec.c:204
ff_msmpeg4_decode_picture_header
int ff_msmpeg4_decode_picture_header(MpegEncContext *s)
Definition: msmpeg4dec.c:385
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:500
AVCodecContext::has_b_frames
int has_b_frames
Size of the frame reordering buffer in the decoder.
Definition: avcodec.h:694
ff_mpv_common_frame_size_change
int ff_mpv_common_frame_size_change(MpegEncContext *s)
Definition: mpegvideo_dec.c:195
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:298
s
#define s(width, name)
Definition: cbs_vp9.c:256
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:50
h263_get_format
static enum AVPixelFormat h263_get_format(AVCodecContext *avctx)
Definition: h263dec.c:57
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts_bsf.c:363
FF_BUG_NO_PADDING
#define FF_BUG_NO_PADDING
Definition: avcodec.h:1284
ff_mpeg_er_frame_start
void ff_mpeg_er_frame_start(MpegEncContext *s)
Definition: mpeg_er.c:47
AV_CODEC_ID_WMV2
@ AV_CODEC_ID_WMV2
Definition: codec_id.h:70
AV_EF_IGNORE_ERR
#define AV_EF_IGNORE_ERR
ignore errors and continue
Definition: defs.h:53
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1451
ff_mpeg4_workaround_bugs
int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
Definition: mpeg4videodec.c:2983
decode.h
AV_CODEC_ID_MSMPEG4V1
@ AV_CODEC_ID_MSMPEG4V1
Definition: codec_id.h:66
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:264
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:408
FRAME_SKIPPED
#define FRAME_SKIPPED
Return value for header parsers if frame is not coded.
Definition: mpegutils.h:33
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:76
ff_h263_decode_init_vlc
void ff_h263_decode_init_vlc(void)
Definition: ituh263dec.c:136
NULL
#define NULL
Definition: coverity.c:32
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:982
ER_AC_ERROR
#define ER_AC_ERROR
Definition: error_resilience.h:31
ff_mpv_idct_init
av_cold void ff_mpv_idct_init(MpegEncContext *s)
Definition: mpegvideo.c:342
SLICE_NOEND
#define SLICE_NOEND
no end marker or error found but mb count exceeded
Definition: mpegvideo.h:481
ER_MB_ERROR
#define ER_MB_ERROR
Definition: error_resilience.h:38
AVHWAccel::end_frame
int(* end_frame)(AVCodecContext *avctx)
Called at the end of each frame or field picture.
Definition: avcodec.h:2170
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
ff_flv_decode_picture_header
int ff_flv_decode_picture_header(MpegEncContext *s)
Definition: flvdec.c:29
ff_set_qscale
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
Definition: mpegvideo.c:890
ff_set_sar
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition: utils.c:106
AV_CODEC_FLAG_TRUNCATED
#define AV_CODEC_FLAG_TRUNCATED
Input bitstream might be truncated at a random location instead of only at frame boundaries.
Definition: avcodec.h:271
ff_h263_decode_frame
int ff_h263_decode_frame(AVCodecContext *avctx, AVFrame *pict, int *got_frame, AVPacket *avpkt)
Definition: h263dec.c:416
AV_CODEC_ID_WMV1
@ AV_CODEC_ID_WMV1
Definition: codec_id.h:69
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:74
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:627
FF_MPV_QSCALE_TYPE_MPEG1
#define FF_MPV_QSCALE_TYPE_MPEG1
Definition: mpegvideodec.h:40
ff_h263_decode_end
av_cold int ff_h263_decode_end(AVCodecContext *avctx)
Definition: h263dec.c:147
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:75
AV_CODEC_CAP_DR1
#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_FLAG_GRAY
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:259
AVPacket::size
int size
Definition: packet.h:375
ff_mpeg4_clean_buffers
void ff_mpeg4_clean_buffers(MpegEncContext *s)
Definition: mpeg4video.c:57
av_frame_ref
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:353
codec_internal.h
ff_update_block_index
static void ff_update_block_index(MpegEncContext *s, int bits_per_raw_sample, int lowres, int chroma_x_shift)
Definition: mpegvideo.h:601
AV_CODEC_ID_H263
@ AV_CODEC_ID_H263
Definition: codec_id.h:56
FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
Definition: codec_internal.h:54
ff_mpeg_draw_horiz_band
void ff_mpeg_draw_horiz_band(MpegEncContext *s, int y, int h)
Definition: mpegvideo_dec.c:532
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:412
AVCodecHWConfigInternal
Definition: hwconfig.h:29
ff_mpv_frame_start
int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
generic function called after decoding the header and before a frame is decoded.
Definition: mpegvideo_dec.c:271
ff_mpeg_flush
void ff_mpeg_flush(AVCodecContext *avctx)
Definition: mpegvideo_dec.c:540
ff_h263_decoder
const FFCodec ff_h263_decoder
Definition: h263dec.c:729
msmpeg4dec.h
flvdec.h
HWACCEL_NVDEC
#define HWACCEL_NVDEC(codec)
Definition: hwconfig.h:71
AV_PIX_FMT_VAAPI
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition: pixfmt.h:119
ff_combine_frame
int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size)
Combine the (truncated) bitstream to a complete frame.
Definition: parser.c:199
AVCodec::id
enum AVCodecID id
Definition: codec.h:218
AV_PIX_FMT_VDPAU
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition: pixfmt.h:187
get_consumed_bytes
static int get_consumed_bytes(MpegEncContext *s, int buf_size)
Return the number of bytes consumed for building the current frame.
Definition: h263dec.c:158
AV_PIX_FMT_VIDEOTOOLBOX
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
Definition: pixfmt.h:302
FMT_H263
@ FMT_H263
Definition: mpegutils.h:119
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
ff_h263p_decoder
const FFCodec ff_h263p_decoder
Definition: h263dec.c:750
ff_h263_hwaccel_pixfmt_list_420
enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[]
Definition: h263dec.c:696
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:499
show_bits
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
ff_mpeg4_decode_picture_header
int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, int header, int parse_only)
Decode MPEG-4 headers.
Definition: mpeg4videodec.c:3493
ff_mpv_decode_init
void ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx)
Initialize the given MpegEncContext for decoding.
Definition: mpegvideo_dec.c:42
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
FF_BUG_AUTODETECT
#define FF_BUG_AUTODETECT
autodetection
Definition: avcodec.h:1281
ff_intel_h263_decode_picture_header
int ff_intel_h263_decode_picture_header(MpegEncContext *s)
Definition: intelh263dec.c:30
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:211
ff_h263_decode_init
av_cold int ff_h263_decode_init(AVCodecContext *avctx)
Definition: h263dec.c:74
AVCodecContext::chroma_sample_location
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition: avcodec.h:989
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:608
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:644
HWACCEL_VIDEOTOOLBOX
#define HWACCEL_VIDEOTOOLBOX(codec)
Definition: hwconfig.h:77
h263_parser.h
avcodec.h
mpeg4videodefs.h
ret
ret
Definition: filter_design.txt:187
AV_EF_AGGRESSIVE
#define AV_EF_AGGRESSIVE
consider things that a sane encoder/muxer should not do as an error
Definition: defs.h:56
wmv2dec.h
pos
unsigned int pos
Definition: spdifenc.c:412
ff_thread_finish_setup
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call ff_thread_finish_setup() afterwards. If some code can 't be moved
ff_h263_loop_filter
void ff_h263_loop_filter(MpegEncContext *s)
Definition: h263.c:105
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
AVCodecContext
main external API structure.
Definition: avcodec.h:398
AVFrame::height
int height
Definition: frame.h:397
AV_CODEC_ID_H263P
@ AV_CODEC_ID_H263P
Definition: codec_id.h:71
AV_PICTURE_TYPE_B
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition: avutil.h:276
mpeg4video.h
AVCHROMA_LOC_CENTER
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
Definition: pixfmt.h:683
error_resilience.h
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
frame_end
static void frame_end(MpegEncContext *s)
Definition: mpegvideo_enc.c:1626
ff_mpv_frame_end
void ff_mpv_frame_end(MpegEncContext *s)
Definition: mpegvideo_dec.c:487
AV_CODEC_CAP_DELAY
#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:82
ff_mpeg4_find_frame_end
int ff_mpeg4_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size)
Find the end of the current frame in the bitstream.
Definition: mpeg4video_parser.c:42
AVHWAccel::start_frame
int(* start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
Called at the beginning of each frame or field picture.
Definition: avcodec.h:2132
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:586
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mpeg4video_parser.h
AV_EF_BUFFER
#define AV_EF_BUFFER
detect improper bitstream length
Definition: defs.h:50
ER_MB_END
#define ER_MB_END
Definition: error_resilience.h:39
MAX_NVOP_SIZE
#define MAX_NVOP_SIZE
Definition: mpeg4videodefs.h:66
AVCodecContext::codec_tag
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:423
ff_tlog
#define ff_tlog(ctx,...)
Definition: internal.h:162
MV_DIR_FORWARD
#define MV_DIR_FORWARD
Definition: mpegvideo.h:260
AVPacket
This structure stores compressed data.
Definition: packet.h:351
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:425
ff_er_frame_end
void ff_er_frame_end(ERContext *s)
Definition: error_resilience.c:892
ff_h263_resync
int ff_h263_resync(MpegEncContext *s)
Decode the group of blocks / video packet header / slice header (MPEG-4 Studio).
Definition: ituh263dec.c:216
HWACCEL_VAAPI
#define HWACCEL_VAAPI(codec)
Definition: hwconfig.h:73
mpeg_er.h
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:370
AV_CODEC_CAP_DRAW_HORIZ_BAND
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
Definition: codec.h:44
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
AV_CODEC_ID_MSMPEG4V3
@ AV_CODEC_ID_MSMPEG4V3
Definition: codec_id.h:68
h
h
Definition: vp9dsp_template.c:2038
ER_AC_END
#define ER_AC_END
Definition: error_resilience.h:34
AV_CODEC_ID_FLV1
@ AV_CODEC_ID_FLV1
Definition: codec_id.h:73
AVDISCARD_NONREF
@ AVDISCARD_NONREF
discard all non reference
Definition: defs.h:72
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:70
AVCodecContext::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition: avcodec.h:768
AV_RB64
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
Definition: bytestream.h:95
h263.h