FFmpeg
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
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 "libavutil/cpu.h"
31 #include "internal.h"
32 #include "avcodec.h"
33 #include "mpegvideo.h"
34 #include "h263.h"
35 #include "h263_parser.h"
36 #include "mpeg4video_parser.h"
37 #include "msmpeg4.h"
38 #include "vdpau_internal.h"
39 #include "thread.h"
40 #include "flv.h"
41 #include "mpeg4video.h"
42 
43 //#define DEBUG
44 //#define PRINT_FRAME_TIME
45 
47 {
48  MpegEncContext *s = avctx->priv_data;
49  int ret;
50 
51  s->avctx = avctx;
52  s->out_format = FMT_H263;
53 
54  s->width = avctx->coded_width;
55  s->height = avctx->coded_height;
57 
58  // set defaults
60  s->quant_precision=5;
62  s->low_delay= 1;
63  if (avctx->codec->id == AV_CODEC_ID_MSS2)
64  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
65  else
66  avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
67  s->unrestricted_mv= 1;
68 
69  /* select sub codec */
70  switch(avctx->codec->id) {
71  case AV_CODEC_ID_H263:
72  case AV_CODEC_ID_H263P:
73  s->unrestricted_mv= 0;
75  break;
76  case AV_CODEC_ID_MPEG4:
77  break;
79  s->h263_pred = 1;
80  s->msmpeg4_version=1;
81  break;
83  s->h263_pred = 1;
84  s->msmpeg4_version=2;
85  break;
87  s->h263_pred = 1;
88  s->msmpeg4_version=3;
89  break;
90  case AV_CODEC_ID_WMV1:
91  s->h263_pred = 1;
92  s->msmpeg4_version=4;
93  break;
94  case AV_CODEC_ID_WMV2:
95  s->h263_pred = 1;
96  s->msmpeg4_version=5;
97  break;
98  case AV_CODEC_ID_VC1:
99  case AV_CODEC_ID_WMV3:
102  case AV_CODEC_ID_MSS2:
103  s->h263_pred = 1;
104  s->msmpeg4_version=6;
106  break;
107  case AV_CODEC_ID_H263I:
108  break;
109  case AV_CODEC_ID_FLV1:
110  s->h263_flv = 1;
111  break;
112  default:
113  return AVERROR(EINVAL);
114  }
115  s->codec_id= avctx->codec->id;
116  avctx->hwaccel= ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
117 
118  /* for h263, we allocate the images after having read the header */
119  if (avctx->codec->id != AV_CODEC_ID_H263 && avctx->codec->id != AV_CODEC_ID_H263P && avctx->codec->id != AV_CODEC_ID_MPEG4)
120  if ((ret = ff_MPV_common_init(s)) < 0)
121  return ret;
122 
124 
125  return 0;
126 }
127 
129 {
130  MpegEncContext *s = avctx->priv_data;
131 
133  return 0;
134 }
135 
136 /**
137  * Return the number of bytes consumed for building the current frame.
138  */
139 static int get_consumed_bytes(MpegEncContext *s, int buf_size){
140  int pos= (get_bits_count(&s->gb)+7)>>3;
141 
142  if(s->divx_packed || s->avctx->hwaccel){
143  //we would have to scan through the whole buf to handle the weird reordering ...
144  return buf_size;
145  }else if(s->flags&CODEC_FLAG_TRUNCATED){
146  pos -= s->parse_context.last_index;
147  if(pos<0) pos=0; // padding is not really read so this might be -1
148  return pos;
149  }else{
150  if(pos==0) pos=1; //avoid infinite loops (i doubt that is needed but ...)
151  if(pos+10>buf_size) pos=buf_size; // oops ;)
152 
153  return pos;
154  }
155 }
156 
158  const int part_mask= s->partitioned_frame ? (ER_AC_END|ER_AC_ERROR) : 0x7F;
159  const int mb_size= 16>>s->avctx->lowres;
160  int ret;
161 
162  s->last_resync_gb= s->gb;
163  s->first_slice_line= 1;
164 
165  s->resync_mb_x= s->mb_x;
166  s->resync_mb_y= s->mb_y;
167 
168  ff_set_qscale(s, s->qscale);
169 
170  if (s->avctx->hwaccel) {
171  const uint8_t *start= s->gb.buffer + get_bits_count(&s->gb)/8;
172  const uint8_t *end = ff_h263_find_resync_marker(s, start + 1, s->gb.buffer_end);
173  skip_bits_long(&s->gb, 8*(end - start));
174  return s->avctx->hwaccel->decode_slice(s->avctx, start, end - start);
175  }
176 
177  if(s->partitioned_frame){
178  const int qscale= s->qscale;
179 
180  if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4){
181  if ((ret = ff_mpeg4_decode_partitions(s)) < 0)
182  return ret;
183  }
184 
185  /* restore variables which were modified */
186  s->first_slice_line=1;
187  s->mb_x= s->resync_mb_x;
188  s->mb_y= s->resync_mb_y;
189  ff_set_qscale(s, qscale);
190  }
191 
192  for(; s->mb_y < s->mb_height; s->mb_y++) {
193  /* per-row end of slice checks */
194  if(s->msmpeg4_version){
195  if(s->resync_mb_y + s->slice_height == s->mb_y){
196  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END);
197 
198  return 0;
199  }
200  }
201 
202  if(s->msmpeg4_version==1){
203  s->last_dc[0]=
204  s->last_dc[1]=
205  s->last_dc[2]= 128;
206  }
207 
209  for(; s->mb_x < s->mb_width; s->mb_x++) {
210  int ret;
211 
213 
214  if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
215  s->first_slice_line=0;
216  }
217 
218  /* DCT & quantize */
219 
220  s->mv_dir = MV_DIR_FORWARD;
221  s->mv_type = MV_TYPE_16X16;
222 // s->mb_skipped = 0;
223  av_dlog(s, "%d %d %06X\n",
224  ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
225  ret= s->decode_mb(s, s->block);
226 
229 
230  if(ret<0){
231  const int xy= s->mb_x + s->mb_y*s->mb_stride;
232  if(ret==SLICE_END){
233  ff_MPV_decode_mb(s, s->block);
234  if(s->loop_filter)
236 
237  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_END&part_mask);
238 
239  s->padding_bug_score--;
240 
241  if(++s->mb_x >= s->mb_width){
242  s->mb_x=0;
243  ff_mpeg_draw_horiz_band(s, s->mb_y*mb_size, mb_size);
245  s->mb_y++;
246  }
247  return 0;
248  }else if(ret==SLICE_NOEND){
249  av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy);
250  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, ER_MB_END&part_mask);
251  return AVERROR_INVALIDDATA;
252  }
253  av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy);
254  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR&part_mask);
255 
256  return AVERROR_INVALIDDATA;
257  }
258 
259  ff_MPV_decode_mb(s, s->block);
260  if(s->loop_filter)
262  }
263 
264  ff_mpeg_draw_horiz_band(s, s->mb_y*mb_size, mb_size);
266 
267  s->mb_x= 0;
268  }
269 
270  av_assert1(s->mb_x==0 && s->mb_y==s->mb_height);
271 
274  && get_bits_left(&s->gb) >= 48
275  && show_bits(&s->gb, 24)==0x4010
276  && !s->data_partitioning)
277  s->padding_bug_score+=32;
278 
279  /* try to detect the padding bug */
282  && get_bits_left(&s->gb) >=0
283  && get_bits_left(&s->gb) < 137
284 // && !s->resync_marker
285  && !s->data_partitioning){
286 
287  const int bits_count= get_bits_count(&s->gb);
288  const int bits_left = s->gb.size_in_bits - bits_count;
289 
290  if(bits_left==0){
291  s->padding_bug_score+=16;
292  } else if(bits_left != 1){
293  int v= show_bits(&s->gb, 8);
294  v|= 0x7F >> (7-(bits_count&7));
295 
296  if(v==0x7F && bits_left<=8)
297  s->padding_bug_score--;
298  else if(v==0x7F && ((get_bits_count(&s->gb)+8)&8) && bits_left<=16)
299  s->padding_bug_score+= 4;
300  else
301  s->padding_bug_score++;
302  }
303  }
304 
306  if(s->padding_bug_score > -2 && !s->data_partitioning /*&& (s->divx_version>=0 || !s->resync_marker)*/)
308  else
310  }
311 
312  // handle formats which don't have unique end markers
313  if(s->msmpeg4_version || (s->workaround_bugs&FF_BUG_NO_PADDING)){ //FIXME perhaps solve this more cleanly
314  int left= get_bits_left(&s->gb);
315  int max_extra=7;
316 
317  /* no markers in M$ crap */
319  max_extra+= 17;
320 
321  /* buggy padding but the frame should still end approximately at the bitstream end */
323  max_extra+= 48;
324  else if((s->workaround_bugs&FF_BUG_NO_PADDING))
325  max_extra+= 256*256*256*64;
326 
327  if(left>max_extra){
328  av_log(s->avctx, AV_LOG_ERROR, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24));
329  }
330  else if(left<0){
331  av_log(s->avctx, AV_LOG_ERROR, "overreading %d bits\n", -left);
332  }else
333  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END);
334 
335  return 0;
336  }
337 
338  av_log(s->avctx, AV_LOG_ERROR, "slice end not reached but screenspace end (%d left %06X, score= %d)\n",
339  get_bits_left(&s->gb),
340  show_bits(&s->gb, 24), s->padding_bug_score);
341 
342  ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_END&part_mask);
343 
344  return AVERROR_INVALIDDATA;
345 }
346 
348  void *data, int *got_frame,
349  AVPacket *avpkt)
350 {
351  const uint8_t *buf = avpkt->data;
352  int buf_size = avpkt->size;
353  MpegEncContext *s = avctx->priv_data;
354  int ret;
355  AVFrame *pict = data;
356 
357 #ifdef PRINT_FRAME_TIME
358 uint64_t time= rdtsc();
359 #endif
360  s->flags= avctx->flags;
361  s->flags2= avctx->flags2;
362 
363  /* no supplementary picture */
364  if (buf_size == 0) {
365  /* special case for last picture */
366  if (s->low_delay==0 && s->next_picture_ptr) {
367  *pict = s->next_picture_ptr->f;
369 
370  *got_frame = 1;
371  }
372 
373  return 0;
374  }
375 
377  int next;
378 
379  if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4){
380  next= ff_mpeg4_find_frame_end(&s->parse_context, buf, buf_size);
381  }else if(CONFIG_H263_DECODER && s->codec_id==AV_CODEC_ID_H263){
382  next= ff_h263_find_frame_end(&s->parse_context, buf, buf_size);
383  }else if(CONFIG_H263P_DECODER && s->codec_id==AV_CODEC_ID_H263P){
384  next= ff_h263_find_frame_end(&s->parse_context, buf, buf_size);
385  }else{
386  av_log(s->avctx, AV_LOG_ERROR, "this codec does not support truncated bitstreams\n");
387  return AVERROR(EINVAL);
388  }
389 
390  if( ff_combine_frame(&s->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 )
391  return buf_size;
392  }
393 
394 
395 retry:
396  if(s->divx_packed && s->bitstream_buffer_size){
397  int i;
398  for(i=0; i<buf_size-3; i++){
399  if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1){
400  if(buf[i+3]==0xB0){
401  av_log(s->avctx, AV_LOG_WARNING, "Discarding excessive bitstream in packed xvid\n");
403  }
404  break;
405  }
406  }
407  }
408 
409  if(s->bitstream_buffer_size && (s->divx_packed || buf_size<20)){ //divx 5.01+/xvid frame reorder
411  }else
412  init_get_bits(&s->gb, buf, buf_size*8);
414 
415  if (!s->context_initialized) {
416  if ((ret = ff_MPV_common_init(s)) < 0) //we need the idct permutaton for reading a custom matrix
417  return ret;
418  }
419 
420  /* We need to set current_picture_ptr before reading the header,
421  * otherwise we cannot store anyting in there */
422  if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
423  int i= ff_find_unused_picture(s, 0);
424  if (i < 0)
425  return i;
426  s->current_picture_ptr= &s->picture[i];
427  }
428 
429  /* let's go :-) */
430  if (CONFIG_WMV2_DECODER && s->msmpeg4_version==5) {
432  } else if (CONFIG_MSMPEG4_DECODER && s->msmpeg4_version) {
434  } else if (CONFIG_MPEG4_DECODER && s->h263_pred) {
435  if(s->avctx->extradata_size && s->picture_number==0){
436  GetBitContext gb;
437 
439  ret = ff_mpeg4_decode_picture_header(s, &gb);
440  }
441  ret = ff_mpeg4_decode_picture_header(s, &s->gb);
442  } else if (CONFIG_H263I_DECODER && s->codec_id == AV_CODEC_ID_H263I) {
444  } else if (CONFIG_FLV_DECODER && s->h263_flv) {
446  } else {
448  }
449 
450  if (ret < 0 || ret==FRAME_SKIPPED) {
451  if ( s->width != avctx->coded_width
452  || s->height != avctx->coded_height) {
453  av_log(s->avctx, AV_LOG_WARNING, "Reverting picture dimensions change due to header decoding failure\n");
454  s->width = avctx->coded_width;
455  s->height= avctx->coded_height;
456  }
457  }
458  if(ret==FRAME_SKIPPED) return get_consumed_bytes(s, buf_size);
459 
460  /* skip if the header was thrashed */
461  if (ret < 0){
462  av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
463  return ret;
464  }
465 
466  avctx->has_b_frames= !s->low_delay;
467 
468  if(s->xvid_build==-1 && s->divx_version==-1 && s->lavc_build==-1){
469  if(s->stream_codec_tag == AV_RL32("XVID") ||
470  s->codec_tag == AV_RL32("XVID") || s->codec_tag == AV_RL32("XVIX") ||
471  s->codec_tag == AV_RL32("RMP4") || s->codec_tag == AV_RL32("ZMP4") ||
472  s->codec_tag == AV_RL32("SIPP")
473  )
474  s->xvid_build= 0;
475 #if 0
476  if(s->codec_tag == AV_RL32("DIVX") && s->vo_type==0 && s->vol_control_parameters==1
477  && s->padding_bug_score > 0 && s->low_delay) // XVID with modified fourcc
478  s->xvid_build= 0;
479 #endif
480  }
481 
482  if(s->xvid_build==-1 && s->divx_version==-1 && s->lavc_build==-1){
483  if(s->codec_tag == AV_RL32("DIVX") && s->vo_type==0 && s->vol_control_parameters==0)
484  s->divx_version= 400; //divx 4
485  }
486 
487  if(s->xvid_build>=0 && s->divx_version>=0){
488  s->divx_version=
489  s->divx_build= -1;
490  }
491 
493  if(s->codec_tag == AV_RL32("XVIX"))
495 
496  if(s->codec_tag == AV_RL32("UMP4")){
498  }
499 
500  if(s->divx_version>=500 && s->divx_build<1814){
502  }
503 
504  if(s->divx_version>502 && s->divx_build<1814){
506  }
507 
508  if(s->xvid_build<=3U)
509  s->padding_bug_score= 256*256*256*64;
510 
511  if(s->xvid_build<=1U)
513 
514  if(s->xvid_build<=12U)
516 
517  if(s->xvid_build<=32U)
519 
520 #define SET_QPEL_FUNC(postfix1, postfix2) \
521  s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
522  s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
523  s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
524 
525  if(s->lavc_build<4653U)
527 
528  if(s->lavc_build<4655U)
530 
531  if(s->lavc_build<4670U){
533  }
534 
535  if(s->lavc_build<=4712U)
537 
538  if(s->divx_version>=0)
540  if(s->divx_version==501 && s->divx_build==20020416)
541  s->padding_bug_score= 256*256*256*64;
542 
543  if(s->divx_version<500U){
545  }
546 
547  if(s->divx_version>=0)
549 #if 0
550  if(s->divx_version==500)
551  s->padding_bug_score= 256*256*256*64;
552 
553  /* very ugly XVID padding bug detection FIXME/XXX solve this differently
554  * Let us hope this at least works.
555  */
556  if( s->resync_marker==0 && s->data_partitioning==0 && s->divx_version==-1
557  && s->codec_id==AV_CODEC_ID_MPEG4 && s->vo_type==0)
559 
560  if(s->lavc_build<4609U) //FIXME not sure about the version num but a 4609 file seems ok
562 #endif
563  }
564 
566  SET_QPEL_FUNC(qpel_pixels_tab[0][ 5], qpel16_mc11_old_c)
567  SET_QPEL_FUNC(qpel_pixels_tab[0][ 7], qpel16_mc31_old_c)
568  SET_QPEL_FUNC(qpel_pixels_tab[0][ 9], qpel16_mc12_old_c)
569  SET_QPEL_FUNC(qpel_pixels_tab[0][11], qpel16_mc32_old_c)
570  SET_QPEL_FUNC(qpel_pixels_tab[0][13], qpel16_mc13_old_c)
571  SET_QPEL_FUNC(qpel_pixels_tab[0][15], qpel16_mc33_old_c)
572 
573  SET_QPEL_FUNC(qpel_pixels_tab[1][ 5], qpel8_mc11_old_c)
574  SET_QPEL_FUNC(qpel_pixels_tab[1][ 7], qpel8_mc31_old_c)
575  SET_QPEL_FUNC(qpel_pixels_tab[1][ 9], qpel8_mc12_old_c)
576  SET_QPEL_FUNC(qpel_pixels_tab[1][11], qpel8_mc32_old_c)
577  SET_QPEL_FUNC(qpel_pixels_tab[1][13], qpel8_mc13_old_c)
578  SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
579  }
580 
581  if(avctx->debug & FF_DEBUG_BUGS)
582  av_log(s->avctx, AV_LOG_DEBUG, "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
584  s->divx_packed ? "p" : "");
585 
586 #if HAVE_MMX
588  avctx->idct_algo= FF_IDCT_XVIDMMX;
590  goto retry;
591  }
592 #endif
593 
594  /* After H263 & mpeg4 header decode we have the height, width,*/
595  /* and other parameters. So then we could init the picture */
596  /* FIXME: By the way H263 decoder is evolving it should have */
597  /* an H263EncContext */
598 
599  if ((!avctx->coded_width || !avctx->coded_height) && 0) {
600  ParseContext pc= s->parse_context; //FIXME move these demuxng hack to avformat
601 
602  s->parse_context.buffer=0;
604  s->parse_context= pc;
605  avcodec_set_dimensions(avctx, s->width, s->height);
606 
607  goto retry;
608  }
609 
610  if (s->width != avctx->coded_width ||
611  s->height != avctx->coded_height ||
612  s->context_reinit) {
613  /* H.263 could change picture size any time */
614  s->context_reinit = 0;
615 
616  avcodec_set_dimensions(avctx, s->width, s->height);
617 
618  if ((ret = ff_MPV_common_frame_size_change(s)))
619  return ret;
620  }
621 
624 
625  // for skipping the frame
628 
629  /* skip B-frames if we don't have reference frames */
630  if (s->last_picture_ptr == NULL &&
631  (s->pict_type == AV_PICTURE_TYPE_B || s->droppable))
632  return get_consumed_bytes(s, buf_size);
635  || avctx->skip_frame >= AVDISCARD_ALL)
636  return get_consumed_bytes(s, buf_size);
637 
638  if(s->next_p_frame_damaged){
640  return get_consumed_bytes(s, buf_size);
641  else
643  }
644 
645  if((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
648  }else{
651  }
652 
653  if ((ret = ff_MPV_frame_start(s, avctx)) < 0)
654  return ret;
655 
656  if (!s->divx_packed) ff_thread_finish_setup(avctx);
657 
658  if (CONFIG_MPEG4_VDPAU_DECODER && (s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)) {
660  goto frame_end;
661  }
662 
663  if (avctx->hwaccel) {
664  if ((ret = avctx->hwaccel->start_frame(avctx, s->gb.buffer, s->gb.buffer_end - s->gb.buffer)) < 0)
665  return ret;
666  }
667 
669 
670  //the second part of the wmv2 header contains the MB skip bits which are stored in current_picture->mb_type
671  //which is not available before ff_MPV_frame_start()
672  if (CONFIG_WMV2_DECODER && s->msmpeg4_version==5){
674  if(ret<0) return ret;
675  if(ret==1) goto intrax8_decoded;
676  }
677 
678  /* decode each macroblock */
679  s->mb_x=0;
680  s->mb_y=0;
681 
682  ret = decode_slice(s);
683  while(s->mb_y<s->mb_height){
684  if(s->msmpeg4_version){
685  if(s->slice_height==0 || s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_left(&s->gb)<0)
686  break;
687  }else{
688  int prev_x=s->mb_x, prev_y=s->mb_y;
689  if(ff_h263_resync(s)<0)
690  break;
691  if (prev_y * s->mb_width + prev_x < s->mb_y * s->mb_width + s->mb_x)
692  s->er.error_occurred = 1;
693  }
694 
695  if(s->msmpeg4_version<4 && s->h263_pred)
697 
698  if (decode_slice(s) < 0) ret = AVERROR_INVALIDDATA;
699  }
700 
702  if(!CONFIG_MSMPEG4_DECODER || ff_msmpeg4_decode_ext_header(s, buf_size) < 0){
704  }
705 
707 frame_end:
708  /* divx 5.01+ bitstream reorder stuff */
709  if(s->codec_id==AV_CODEC_ID_MPEG4 && s->divx_packed){
710  int current_pos= s->gb.buffer == s->bitstream_buffer ? 0 : (get_bits_count(&s->gb)>>3);
711  int startcode_found=0;
712 
713  if(buf_size - current_pos > 7){
714  int i;
715  for(i=current_pos; i<buf_size-4; i++){
716  if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){
717  startcode_found=!(buf[i+4]&0x40);
718  break;
719  }
720  }
721  }
722 
723  if(startcode_found){
725  &s->bitstream_buffer,
727  buf_size - current_pos + FF_INPUT_BUFFER_PADDING_SIZE);
728  if (!s->bitstream_buffer)
729  return AVERROR(ENOMEM);
730  memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
731  s->bitstream_buffer_size= buf_size - current_pos;
732  }
733  }
734 
735 intrax8_decoded:
736  ff_er_frame_end(&s->er);
737 
738  if (avctx->hwaccel) {
739  if ((ret = avctx->hwaccel->end_frame(avctx)) < 0)
740  return ret;
741  }
742 
743  ff_MPV_frame_end(s);
744 
746  assert(s->current_picture.f.pict_type == s->pict_type);
747  if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
748  *pict = s->current_picture_ptr->f;
749  } else if (s->last_picture_ptr != NULL) {
750  *pict = s->last_picture_ptr->f;
751  }
752 
753  if(s->last_picture_ptr || s->low_delay){
754  *got_frame = 1;
755  ff_print_debug_info(s, pict);
756  }
757 
758 #ifdef PRINT_FRAME_TIME
759 av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time);
760 #endif
761 
762  return (ret && (avctx->err_recognition & AV_EF_EXPLODE))?ret:get_consumed_bytes(s, buf_size);
763 }
764 
766 #if CONFIG_VAAPI
768 #endif
769 #if CONFIG_VDPAU
771 #endif
774 };
775 
777  .name = "h263",
778  .type = AVMEDIA_TYPE_VIDEO,
779  .id = AV_CODEC_ID_H263,
780  .priv_data_size = sizeof(MpegEncContext),
784  .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
786  .flush = ff_mpeg_flush,
787  .max_lowres = 3,
788  .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
790 };
791 
793  .name = "h263p",
794  .type = AVMEDIA_TYPE_VIDEO,
795  .id = AV_CODEC_ID_H263P,
796  .priv_data_size = sizeof(MpegEncContext),
800  .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
802  .flush = ff_mpeg_flush,
803  .max_lowres = 3,
804  .long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
806 };