3 * Copyright (c) 2001 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "mpegvideo.h"
30 //#define PRINT_FRAME_TIME
31 #ifdef PRINT_FRAME_TIME
32 static inline long long rdtsc()
35 asm volatile( "rdtsc\n\t"
38 // printf("%d\n", int(l/1000));
43 int ff_h263_decode_init(AVCodecContext
*avctx
)
45 MpegEncContext
*s
= avctx
->priv_data
;
48 s
->out_format
= FMT_H263
;
50 s
->width
= avctx
->width
;
51 s
->height
= avctx
->height
;
52 s
->workaround_bugs
= avctx
->workaround_bugs
;
56 s
->progressive_sequence
=1;
57 s
->decode_mb
= ff_h263_decode_mb
;
59 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
60 s
->unrestricted_mv
= 1;
62 /* select sub codec */
63 switch(avctx
->codec
->id
) {
68 s
->time_increment_bits
= 4; /* default value for broken headers */
70 s
->low_delay
= 0; //default, might be overriden in the vol header during header parsing
72 case CODEC_ID_MSMPEG4V1
:
77 case CODEC_ID_MSMPEG4V2
:
82 case CODEC_ID_MSMPEG4V3
:
106 s
->codec_id
= avctx
->codec
->id
;
108 /* for h263, we allocate the images after having read the header */
109 if (avctx
->codec
->id
!= CODEC_ID_H263
&& avctx
->codec
->id
!= CODEC_ID_MPEG4
)
110 if (MPV_common_init(s
) < 0)
114 ff_msmpeg4_decode_init(s
);
116 h263_decode_init_vlc(s
);
121 int ff_h263_decode_end(AVCodecContext
*avctx
)
123 MpegEncContext
*s
= avctx
->priv_data
;
130 * retunrs the number of bytes consumed for building the current frame
132 static int get_consumed_bytes(MpegEncContext
*s
, int buf_size
){
133 int pos
= (get_bits_count(&s
->gb
)+7)>>3;
136 //we would have to scan through the whole buf to handle the weird reordering ...
138 }else if(s
->flags
&CODEC_FLAG_TRUNCATED
){
139 pos
-= s
->parse_context
.last_index
;
140 if(pos
<0) pos
=0; // padding is not really read so this might be -1
143 if(pos
==0) pos
=1; //avoid infinite loops (i doubt thats needed but ...)
144 if(pos
+10>buf_size
) pos
=buf_size
; // oops ;)
150 static int decode_slice(MpegEncContext
*s
){
151 const int part_mask
= s
->partitioned_frame ?
(AC_END
|AC_ERROR
) : 0x7F;
152 s
->last_resync_gb
= s
->gb
;
153 s
->first_slice_line
= 1;
155 s
->resync_mb_x
= s
->mb_x
;
156 s
->resync_mb_y
= s
->mb_y
;
158 s
->y_dc_scale
= s
->y_dc_scale_table
[ s
->qscale
];
159 s
->c_dc_scale
= s
->c_dc_scale_table
[ s
->qscale
];
161 if(s
->partitioned_frame
){
162 const int qscale
= s
->qscale
;
164 if(s
->codec_id
==CODEC_ID_MPEG4
){
165 if(ff_mpeg4_decode_partitions(s
) < 0)
169 /* restore variables which were modified */
170 s
->first_slice_line
=1;
171 s
->mb_x
= s
->resync_mb_x
;
172 s
->mb_y
= s
->resync_mb_y
;
174 s
->y_dc_scale
= s
->y_dc_scale_table
[ s
->qscale
];
175 s
->c_dc_scale
= s
->c_dc_scale_table
[ s
->qscale
];
178 for(; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
179 /* per-row end of slice checks */
180 if(s
->msmpeg4_version
){
181 if(s
->resync_mb_y
+ s
->slice_height
== s
->mb_y
){
182 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
-1, s
->mb_y
, AC_END
|DC_END
|MV_END
);
188 if(s
->msmpeg4_version
==1){
194 ff_init_block_index(s
);
195 for(; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
198 ff_update_block_index(s
);
200 if(s
->resync_mb_x
== s
->mb_x
&& s
->resync_mb_y
+1 == s
->mb_y
){
201 s
->first_slice_line
=0;
205 s
->dsp
.clear_blocks(s
->block
[0]);
207 s
->mv_dir
= MV_DIR_FORWARD
;
208 s
->mv_type
= MV_TYPE_16X16
;
210 //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
211 ret
= s
->decode_mb(s
, s
->block
);
213 if (s
->pict_type
!=B_TYPE
)
214 ff_h263_update_motion_val(s
);
217 const int xy
= s
->mb_x
+ s
->mb_y
*s
->mb_stride
;
219 MPV_decode_mb(s
, s
->block
);
221 //printf("%d %d %d %06X\n", s->mb_x, s->mb_y, s->gb.size*8 - get_bits_count(&s->gb), show_bits(&s->gb, 24));
222 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
224 s
->padding_bug_score
--;
226 if(++s
->mb_x
>= s
->mb_width
){
228 ff_draw_horiz_band(s
, s
->mb_y
*16, 16);
232 }else if(ret
==SLICE_NOEND
){
233 fprintf(stderr
,"Slice mismatch at MB: %d\n", xy
);
234 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
+1, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
237 fprintf(stderr
,"Error at MB: %d\n", xy
);
238 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_ERROR
|DC_ERROR
|MV_ERROR
)&part_mask
);
243 MPV_decode_mb(s
, s
->block
);
246 ff_draw_horiz_band(s
, s
->mb_y
*16, 16);
251 assert(s
->mb_x
==0 && s
->mb_y
==s
->mb_height
);
253 /* try to detect the padding bug */
254 if( s
->codec_id
==CODEC_ID_MPEG4
255 && (s
->workaround_bugs
&FF_BUG_AUTODETECT
)
256 && s
->gb
.size_in_bits
- get_bits_count(&s
->gb
) >=0
257 && s
->gb
.size_in_bits
- get_bits_count(&s
->gb
) < 48
258 // && !s->resync_marker
259 && !s
->data_partitioning
){
261 const int bits_count
= get_bits_count(&s
->gb
);
262 const int bits_left
= s
->gb
.size_in_bits
- bits_count
;
265 s
->padding_bug_score
+=16;
266 }else if(bits_left
>8){
267 s
->padding_bug_score
++;
268 } else if(bits_left
!= 1){
269 int v
= show_bits(&s
->gb
, 8);
270 v
|= 0x7F >> (7-(bits_count
&7));
273 s
->padding_bug_score
--;
275 s
->padding_bug_score
++;
279 // handle formats which dont have unique end markers
280 if(s
->msmpeg4_version
|| (s
->workaround_bugs
&FF_BUG_NO_PADDING
)){ //FIXME perhaps solve this more cleanly
281 int left
= s
->gb
.size_in_bits
- get_bits_count(&s
->gb
);
284 /* no markers in M$ crap */
285 if(s
->msmpeg4_version
&& s
->pict_type
==I_TYPE
)
288 /* buggy padding but the frame should still end approximately at the bitstream end */
289 if((s
->workaround_bugs
&FF_BUG_NO_PADDING
) && s
->error_resilience
>=3)
291 else if((s
->workaround_bugs
&FF_BUG_NO_PADDING
))
292 max_extra
+= 256*256*256*64;
295 fprintf(stderr
, "discarding %d junk bits at end, next would be %X\n", left
, show_bits(&s
->gb
, 24));
298 fprintf(stderr
, "overreading %d bits\n", -left
);
300 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
-1, s
->mb_y
, AC_END
|DC_END
|MV_END
);
305 fprintf(stderr
, "slice end not reached but screenspace end (%d left %06X, score= %d)\n",
306 s
->gb
.size_in_bits
- get_bits_count(&s
->gb
),
307 show_bits(&s
->gb
, 24), s
->padding_bug_score
);
309 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
315 * finds the end of the current frame in the bitstream.
316 * @return the position of the first byte of the next frame, or -1
318 static int mpeg4_find_frame_end(MpegEncContext
*s
, uint8_t *buf
, int buf_size
){
319 ParseContext
*pc
= &s
->parse_context
;
323 vop_found
= pc
->frame_start_found
;
328 for(i
=0; i
<buf_size
; i
++){
329 state
= (state
<<8) | buf
[i
];
339 for(; i
<buf_size
; i
++){
340 state
= (state
<<8) | buf
[i
];
341 if((state
&0xFFFFFF00) == 0x100){
342 pc
->frame_start_found
=0;
348 pc
->frame_start_found
= vop_found
;
350 return END_NOT_FOUND
;
353 static int h263_find_frame_end(MpegEncContext
*s
, uint8_t *buf
, int buf_size
){
354 ParseContext
*pc
= &s
->parse_context
;
358 vop_found
= pc
->frame_start_found
;
363 for(i
=0; i
<buf_size
; i
++){
364 state
= (state
<<8) | buf
[i
];
365 if(state
>>(32-22) == 0x20){
374 for(; i
<buf_size
; i
++){
375 state
= (state
<<8) | buf
[i
];
376 if(state
>>(32-22) == 0x20){
377 pc
->frame_start_found
=0;
383 pc
->frame_start_found
= vop_found
;
386 return END_NOT_FOUND
;
389 int ff_h263_decode_frame(AVCodecContext
*avctx
,
390 void *data
, int *data_size
,
391 uint8_t *buf
, int buf_size
)
393 MpegEncContext
*s
= avctx
->priv_data
;
395 AVFrame
*pict
= data
;
397 #ifdef PRINT_FRAME_TIME
398 uint64_t time
= rdtsc();
401 printf("*****frame %d size=%d\n", avctx
->frame_number
, buf_size
);
402 printf("bytes=%x %x %x %x\n", buf
[0], buf
[1], buf
[2], buf
[3]);
404 s
->flags
= avctx
->flags
;
408 /* no supplementary picture */
410 /* special case for last picture */
411 if (s
->low_delay
==0 && s
->next_picture_ptr
) {
412 *pict
= *(AVFrame
*)s
->next_picture_ptr
;
413 s
->next_picture_ptr
= NULL
;
415 *data_size
= sizeof(AVFrame
);
421 if(s
->flags
&CODEC_FLAG_TRUNCATED
){
424 if(s
->codec_id
==CODEC_ID_MPEG4
){
425 next
= mpeg4_find_frame_end(s
, buf
, buf_size
);
426 }else if(s
->codec_id
==CODEC_ID_H263
){
427 next
= h263_find_frame_end(s
, buf
, buf_size
);
429 fprintf(stderr
, "this codec doesnt support truncated bitstreams\n");
433 if( ff_combine_frame(s
, next
, &buf
, &buf_size
) < 0 )
439 if(s
->bitstream_buffer_size
&& buf_size
<20){ //divx 5.01+ frame reorder
440 init_get_bits(&s
->gb
, s
->bitstream_buffer
, s
->bitstream_buffer_size
*8);
442 init_get_bits(&s
->gb
, buf
, buf_size
*8);
443 s
->bitstream_buffer_size
=0;
445 if (!s
->context_initialized
) {
446 if (MPV_common_init(s
) < 0) //we need the idct permutaton for reading a custom matrix
451 if (s
->msmpeg4_version
==5) {
452 ret
= ff_wmv2_decode_picture_header(s
);
453 } else if (s
->msmpeg4_version
) {
454 ret
= msmpeg4_decode_picture_header(s
);
455 } else if (s
->h263_pred
) {
456 if(s
->avctx
->extradata_size
&& s
->picture_number
==0){
459 init_get_bits(&gb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
*8);
460 ret
= ff_mpeg4_decode_picture_header(s
, &gb
);
462 ret
= ff_mpeg4_decode_picture_header(s
, &s
->gb
);
464 if(s
->flags
& CODEC_FLAG_LOW_DELAY
)
466 } else if (s
->h263_intel
) {
467 ret
= intel_h263_decode_picture_header(s
);
468 } else if (s
->h263_flv
) {
469 ret
= flv_h263_decode_picture_header(s
);
471 ret
= h263_decode_picture_header(s
);
474 if(ret
==FRAME_SKIPED
) return get_consumed_bytes(s
, buf_size
);
476 /* skip if the header was thrashed */
478 fprintf(stderr
, "header damaged\n");
482 avctx
->has_b_frames
= !s
->low_delay
;
484 if(s
->xvid_build
==0 && s
->divx_version
==0 && s
->lavc_build
==0){
485 if(s
->avctx
->stream_codec_tag
== ff_get_fourcc("XVID") ||
486 s
->avctx
->codec_tag
== ff_get_fourcc("XVID") || s
->avctx
->codec_tag
== ff_get_fourcc("XVIX"))
489 if(s
->avctx
->codec_tag
== ff_get_fourcc("DIVX") && s
->vo_type
==0 && s
->vol_control_parameters
==1
490 && s
->padding_bug_score
> 0 && s
->low_delay
) // XVID with modified fourcc
495 if(s
->xvid_build
==0 && s
->divx_version
==0 && s
->lavc_build
==0){
496 if(s
->avctx
->codec_tag
== ff_get_fourcc("DIVX") && s
->vo_type
==0 && s
->vol_control_parameters
==0)
497 s
->divx_version
= 400; //divx 4
500 if(s
->workaround_bugs
&FF_BUG_AUTODETECT
){
501 s
->workaround_bugs
&= ~FF_BUG_NO_PADDING
;
503 if(s
->padding_bug_score
> -2 && !s
->data_partitioning
&& (s
->divx_version
|| !s
->resync_marker
))
504 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
506 if(s
->avctx
->codec_tag
== ff_get_fourcc("XVIX"))
507 s
->workaround_bugs
|= FF_BUG_XVID_ILACE
;
509 if(s
->avctx
->codec_tag
== ff_get_fourcc("UMP4")){
510 s
->workaround_bugs
|= FF_BUG_UMP4
;
513 if(s
->divx_version
>=500){
514 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA
;
517 if(s
->divx_version
>502){
518 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA2
;
521 if(s
->xvid_build
&& s
->xvid_build
<=3)
522 s
->padding_bug_score
= 256*256*256*64;
524 if(s
->xvid_build
&& s
->xvid_build
<=1)
525 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA
;
527 if(s
->xvid_build
&& s
->xvid_build
<=12)
528 s
->workaround_bugs
|= FF_BUG_EDGE
;
530 #define SET_QPEL_FUNC(postfix1, postfix2) \
531 s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
532 s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
533 s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
535 if(s
->lavc_build
&& s
->lavc_build
<4653)
536 s
->workaround_bugs
|= FF_BUG_STD_QPEL
;
538 if(s
->lavc_build
&& s
->lavc_build
<4655)
539 s
->workaround_bugs
|= FF_BUG_DIRECT_BLOCKSIZE
;
541 if(s
->lavc_build
&& s
->lavc_build
<4670){
542 s
->workaround_bugs
|= FF_BUG_EDGE
;
546 s
->workaround_bugs
|= FF_BUG_DIRECT_BLOCKSIZE
;
547 //printf("padding_bug_score: %d\n", s->padding_bug_score);
548 if(s
->divx_version
==501 && s
->divx_build
==20020416)
549 s
->padding_bug_score
= 256*256*256*64;
551 if(s
->divx_version
&& s
->divx_version
<500){
552 s
->workaround_bugs
|= FF_BUG_EDGE
;
556 if(s
->divx_version
==500)
557 s
->padding_bug_score
= 256*256*256*64;
559 /* very ugly XVID padding bug detection FIXME/XXX solve this differently
560 * lets hope this at least works
562 if( s
->resync_marker
==0 && s
->data_partitioning
==0 && s
->divx_version
==0
563 && s
->codec_id
==CODEC_ID_MPEG4
&& s
->vo_type
==0)
564 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
566 if(s
->lavc_build
&& s
->lavc_build
<4609) //FIXME not sure about the version num but a 4609 file seems ok
567 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
571 if(s
->workaround_bugs
& FF_BUG_STD_QPEL
){
572 SET_QPEL_FUNC(qpel_pixels_tab
[0][ 5], qpel16_mc11_old_c
)
573 SET_QPEL_FUNC(qpel_pixels_tab
[0][ 7], qpel16_mc31_old_c
)
574 SET_QPEL_FUNC(qpel_pixels_tab
[0][ 9], qpel16_mc12_old_c
)
575 SET_QPEL_FUNC(qpel_pixels_tab
[0][11], qpel16_mc32_old_c
)
576 SET_QPEL_FUNC(qpel_pixels_tab
[0][13], qpel16_mc13_old_c
)
577 SET_QPEL_FUNC(qpel_pixels_tab
[0][15], qpel16_mc33_old_c
)
579 SET_QPEL_FUNC(qpel_pixels_tab
[1][ 5], qpel8_mc11_old_c
)
580 SET_QPEL_FUNC(qpel_pixels_tab
[1][ 7], qpel8_mc31_old_c
)
581 SET_QPEL_FUNC(qpel_pixels_tab
[1][ 9], qpel8_mc12_old_c
)
582 SET_QPEL_FUNC(qpel_pixels_tab
[1][11], qpel8_mc32_old_c
)
583 SET_QPEL_FUNC(qpel_pixels_tab
[1][13], qpel8_mc13_old_c
)
584 SET_QPEL_FUNC(qpel_pixels_tab
[1][15], qpel8_mc33_old_c
)
587 if(avctx
->debug
& FF_DEBUG_BUGS
)
588 printf("bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
589 s
->workaround_bugs
, s
->lavc_build
, s
->xvid_build
, s
->divx_version
, s
->divx_build
,
590 s
->divx_packed ?
"p" : "");
592 #if 0 // dump bits per frame / qp / complexity
595 if(!f
) f
=fopen("rate_qp_cplx.txt", "w");
596 fprintf(f
, "%d %d %f\n", buf_size
, s
->qscale
, buf_size
*(double)s
->qscale
);
600 /* After H263 & mpeg4 header decode we have the height, width,*/
601 /* and other parameters. So then we could init the picture */
602 /* FIXME: By the way H263 decoder is evolving it should have */
603 /* an H263EncContext */
605 if ( s
->width
!= avctx
->width
|| s
->height
!= avctx
->height
) {
606 /* H.263 could change picture size any time */
607 ParseContext pc
= s
->parse_context
; //FIXME move these demuxng hack to avformat
608 s
->parse_context
.buffer
=0;
610 s
->parse_context
= pc
;
612 if (!s
->context_initialized
) {
613 avctx
->width
= s
->width
;
614 avctx
->height
= s
->height
;
619 if((s
->codec_id
==CODEC_ID_H263
|| s
->codec_id
==CODEC_ID_H263P
))
620 s
->gob_index
= ff_h263_get_gob_height(s
);
623 s
->current_picture
.pict_type
= s
->pict_type
;
624 s
->current_picture
.key_frame
= s
->pict_type
== I_TYPE
;
626 /* skip b frames if we dont have reference frames */
627 if(s
->last_picture_ptr
==NULL
&& s
->pict_type
==B_TYPE
) return get_consumed_bytes(s
, buf_size
);
628 /* skip b frames if we are in a hurry */
629 if(avctx
->hurry_up
&& s
->pict_type
==B_TYPE
) return get_consumed_bytes(s
, buf_size
);
630 /* skip everything if we are in a hurry>=5 */
631 if(avctx
->hurry_up
>=5) return get_consumed_bytes(s
, buf_size
);
633 if(s
->next_p_frame_damaged
){
634 if(s
->pict_type
==B_TYPE
)
635 return get_consumed_bytes(s
, buf_size
);
637 s
->next_p_frame_damaged
=0;
640 if(MPV_frame_start(s
, avctx
) < 0)
644 printf("qscale=%d\n", s
->qscale
);
647 ff_er_frame_start(s
);
649 //the second part of the wmv2 header contains the MB skip bits which are stored in current_picture->mb_type
650 //which isnt available before MPV_frame_start()
651 if (s
->msmpeg4_version
==5){
652 if(ff_wmv2_decode_secondary_picture_header(s
) < 0)
656 /* decode each macroblock */
661 while(s
->mb_y
<s
->mb_height
){
662 if(s
->msmpeg4_version
){
663 if(s
->mb_x
!=0 || (s
->mb_y
%s
->slice_height
)!=0 || get_bits_count(&s
->gb
) > s
->gb
.size_in_bits
)
666 if(ff_h263_resync(s
)<0)
670 if(s
->msmpeg4_version
<4 && s
->h263_pred
)
671 ff_mpeg4_clean_buffers(s
);
676 if (s
->h263_msmpeg4
&& s
->msmpeg4_version
<4 && s
->pict_type
==I_TYPE
)
677 if(msmpeg4_decode_ext_header(s
, buf_size
) < 0){
678 s
->error_status_table
[s
->mb_num
-1]= AC_ERROR
|DC_ERROR
|MV_ERROR
;
681 /* divx 5.01+ bistream reorder stuff */
682 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->bitstream_buffer_size
==0 && s
->divx_packed
){
683 int current_pos
= get_bits_count(&s
->gb
)>>3;
685 if( buf_size
- current_pos
> 5
686 && buf_size
- current_pos
< BITSTREAM_BUFFER_SIZE
){
688 int startcode_found
=0;
689 for(i
=current_pos
; i
<buf_size
-3; i
++){
690 if(buf
[i
]==0 && buf
[i
+1]==0 && buf
[i
+2]==1 && buf
[i
+3]==0xB6){
696 memcpy(s
->bitstream_buffer
, buf
+ current_pos
, buf_size
- current_pos
);
697 s
->bitstream_buffer_size
= buf_size
- current_pos
;
706 assert(s
->current_picture
.pict_type
== s
->current_picture_ptr
->pict_type
);
707 assert(s
->current_picture
.pict_type
== s
->pict_type
);
708 if(s
->pict_type
==B_TYPE
|| s
->low_delay
){
709 *pict
= *(AVFrame
*)&s
->current_picture
;
710 ff_print_debug_info(s
, s
->current_picture_ptr
);
712 *pict
= *(AVFrame
*)&s
->last_picture
;
713 ff_print_debug_info(s
, s
->last_picture_ptr
);
716 /* Return the Picture timestamp as the frame number */
717 /* we substract 1 because it is added on utils.c */
718 avctx
->frame_number
= s
->picture_number
- 1;
720 /* dont output the last pic after seeking */
721 if(s
->last_picture_ptr
|| s
->low_delay
)
722 *data_size
= sizeof(AVFrame
);
723 #ifdef PRINT_FRAME_TIME
724 printf("%Ld\n", rdtsc()-time
);
727 return get_consumed_bytes(s
, buf_size
);
730 static const AVOption mpeg4_decoptions
[] =
732 AVOPTION_SUB(avoptions_workaround_bug
),
736 AVCodec mpeg4_decoder
= {
740 sizeof(MpegEncContext
),
744 ff_h263_decode_frame
,
745 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_TRUNCATED
,
746 .options
= mpeg4_decoptions
,
747 .flush
= ff_mpeg_flush
,
750 AVCodec h263_decoder
= {
754 sizeof(MpegEncContext
),
758 ff_h263_decode_frame
,
759 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_TRUNCATED
,
760 .flush
= ff_mpeg_flush
,
763 AVCodec msmpeg4v1_decoder
= {
767 sizeof(MpegEncContext
),
771 ff_h263_decode_frame
,
772 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
776 AVCodec msmpeg4v2_decoder
= {
780 sizeof(MpegEncContext
),
784 ff_h263_decode_frame
,
785 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
789 AVCodec msmpeg4v3_decoder
= {
793 sizeof(MpegEncContext
),
797 ff_h263_decode_frame
,
798 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
799 .options
= mpeg4_decoptions
,
802 AVCodec wmv1_decoder
= {
806 sizeof(MpegEncContext
),
810 ff_h263_decode_frame
,
811 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
815 AVCodec h263i_decoder
= {
819 sizeof(MpegEncContext
),
823 ff_h263_decode_frame
,
824 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
828 AVCodec flv_decoder
= {
832 sizeof(MpegEncContext
),
836 ff_h263_decode_frame
,
837 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1