3 * Copyright (c) 2001 Fabrice Bellard.
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "mpegvideo.h"
31 //#define PRINT_FRAME_TIME
33 int ff_h263_decode_init(AVCodecContext
*avctx
)
35 MpegEncContext
*s
= avctx
->priv_data
;
38 s
->out_format
= FMT_H263
;
40 s
->width
= avctx
->coded_width
;
41 s
->height
= avctx
->coded_height
;
42 s
->workaround_bugs
= avctx
->workaround_bugs
;
45 MPV_decode_defaults(s
);
47 s
->decode_mb
= ff_h263_decode_mb
;
49 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
50 s
->unrestricted_mv
= 1;
52 /* select sub codec */
53 switch(avctx
->codec
->id
) {
55 s
->unrestricted_mv
= 0;
58 s
->decode_mb
= ff_mpeg4_decode_mb
;
59 s
->time_increment_bits
= 4; /* default value for broken headers */
61 s
->low_delay
= 0; //default, might be overriden in the vol header during header parsing
63 case CODEC_ID_MSMPEG4V1
:
68 case CODEC_ID_MSMPEG4V2
:
73 case CODEC_ID_MSMPEG4V3
:
101 s
->codec_id
= avctx
->codec
->id
;
103 /* for h263, we allocate the images after having read the header */
104 if (avctx
->codec
->id
!= CODEC_ID_H263
&& avctx
->codec
->id
!= CODEC_ID_MPEG4
)
105 if (MPV_common_init(s
) < 0)
109 ff_msmpeg4_decode_init(s
);
111 h263_decode_init_vlc(s
);
116 int ff_h263_decode_end(AVCodecContext
*avctx
)
118 MpegEncContext
*s
= avctx
->priv_data
;
125 * returns the number of bytes consumed for building the current frame
127 static int get_consumed_bytes(MpegEncContext
*s
, int buf_size
){
128 int pos
= (get_bits_count(&s
->gb
)+7)>>3;
131 //we would have to scan through the whole buf to handle the weird reordering ...
133 }else if(s
->flags
&CODEC_FLAG_TRUNCATED
){
134 pos
-= s
->parse_context
.last_index
;
135 if(pos
<0) pos
=0; // padding is not really read so this might be -1
138 if(pos
==0) pos
=1; //avoid infinite loops (i doubt thats needed but ...)
139 if(pos
+10>buf_size
) pos
=buf_size
; // oops ;)
145 static int decode_slice(MpegEncContext
*s
){
146 const int part_mask
= s
->partitioned_frame
? (AC_END
|AC_ERROR
) : 0x7F;
147 const int mb_size
= 16>>s
->avctx
->lowres
;
148 s
->last_resync_gb
= s
->gb
;
149 s
->first_slice_line
= 1;
151 s
->resync_mb_x
= s
->mb_x
;
152 s
->resync_mb_y
= s
->mb_y
;
154 ff_set_qscale(s
, s
->qscale
);
156 if(s
->partitioned_frame
){
157 const int qscale
= s
->qscale
;
159 if(s
->codec_id
==CODEC_ID_MPEG4
){
160 if(ff_mpeg4_decode_partitions(s
) < 0)
164 /* restore variables which were modified */
165 s
->first_slice_line
=1;
166 s
->mb_x
= s
->resync_mb_x
;
167 s
->mb_y
= s
->resync_mb_y
;
168 ff_set_qscale(s
, qscale
);
171 for(; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
172 /* per-row end of slice checks */
173 if(s
->msmpeg4_version
){
174 if(s
->resync_mb_y
+ s
->slice_height
== s
->mb_y
){
175 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
);
181 if(s
->msmpeg4_version
==1){
187 ff_init_block_index(s
);
188 for(; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
191 ff_update_block_index(s
);
193 if(s
->resync_mb_x
== s
->mb_x
&& s
->resync_mb_y
+1 == s
->mb_y
){
194 s
->first_slice_line
=0;
199 s
->mv_dir
= MV_DIR_FORWARD
;
200 s
->mv_type
= MV_TYPE_16X16
;
201 // s->mb_skipped = 0;
202 //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
203 ret
= s
->decode_mb(s
, s
->block
);
205 if (s
->pict_type
!=B_TYPE
)
206 ff_h263_update_motion_val(s
);
209 const int xy
= s
->mb_x
+ s
->mb_y
*s
->mb_stride
;
211 MPV_decode_mb(s
, s
->block
);
213 ff_h263_loop_filter(s
);
215 //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));
216 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
);
218 s
->padding_bug_score
--;
220 if(++s
->mb_x
>= s
->mb_width
){
222 ff_draw_horiz_band(s
, s
->mb_y
*mb_size
, mb_size
);
226 }else if(ret
==SLICE_NOEND
){
227 av_log(s
->avctx
, AV_LOG_ERROR
, "Slice mismatch at MB: %d\n", xy
);
228 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
);
231 av_log(s
->avctx
, AV_LOG_ERROR
, "Error at MB: %d\n", xy
);
232 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
);
237 MPV_decode_mb(s
, s
->block
);
239 ff_h263_loop_filter(s
);
242 ff_draw_horiz_band(s
, s
->mb_y
*mb_size
, mb_size
);
247 assert(s
->mb_x
==0 && s
->mb_y
==s
->mb_height
);
249 /* try to detect the padding bug */
250 if( s
->codec_id
==CODEC_ID_MPEG4
251 && (s
->workaround_bugs
&FF_BUG_AUTODETECT
)
252 && s
->gb
.size_in_bits
- get_bits_count(&s
->gb
) >=0
253 && s
->gb
.size_in_bits
- get_bits_count(&s
->gb
) < 48
254 // && !s->resync_marker
255 && !s
->data_partitioning
){
257 const int bits_count
= get_bits_count(&s
->gb
);
258 const int bits_left
= s
->gb
.size_in_bits
- bits_count
;
261 s
->padding_bug_score
+=16;
262 } else if(bits_left
!= 1){
263 int v
= show_bits(&s
->gb
, 8);
264 v
|= 0x7F >> (7-(bits_count
&7));
266 if(v
==0x7F && bits_left
<=8)
267 s
->padding_bug_score
--;
268 else if(v
==0x7F && ((get_bits_count(&s
->gb
)+8)&8) && bits_left
<=16)
269 s
->padding_bug_score
+= 4;
271 s
->padding_bug_score
++;
275 if(s
->workaround_bugs
&FF_BUG_AUTODETECT
){
276 if(s
->padding_bug_score
> -2 && !s
->data_partitioning
/*&& (s->divx_version || !s->resync_marker)*/)
277 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
279 s
->workaround_bugs
&= ~FF_BUG_NO_PADDING
;
282 // handle formats which don't have unique end markers
283 if(s
->msmpeg4_version
|| (s
->workaround_bugs
&FF_BUG_NO_PADDING
)){ //FIXME perhaps solve this more cleanly
284 int left
= s
->gb
.size_in_bits
- get_bits_count(&s
->gb
);
287 /* no markers in M$ crap */
288 if(s
->msmpeg4_version
&& s
->pict_type
==I_TYPE
)
291 /* buggy padding but the frame should still end approximately at the bitstream end */
292 if((s
->workaround_bugs
&FF_BUG_NO_PADDING
) && s
->error_resilience
>=3)
294 else if((s
->workaround_bugs
&FF_BUG_NO_PADDING
))
295 max_extra
+= 256*256*256*64;
298 av_log(s
->avctx
, AV_LOG_ERROR
, "discarding %d junk bits at end, next would be %X\n", left
, show_bits(&s
->gb
, 24));
301 av_log(s
->avctx
, AV_LOG_ERROR
, "overreading %d bits\n", -left
);
303 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
);
308 av_log(s
->avctx
, AV_LOG_ERROR
, "slice end not reached but screenspace end (%d left %06X, score= %d)\n",
309 s
->gb
.size_in_bits
- get_bits_count(&s
->gb
),
310 show_bits(&s
->gb
, 24), s
->padding_bug_score
);
312 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
);
318 * finds the end of the current frame in the bitstream.
319 * @return the position of the first byte of the next frame, or -1
321 int ff_mpeg4_find_frame_end(ParseContext
*pc
, const uint8_t *buf
, int buf_size
){
325 vop_found
= pc
->frame_start_found
;
330 for(i
=0; i
<buf_size
; i
++){
331 state
= (state
<<8) | buf
[i
];
341 /* EOF considered as end of frame */
344 for(; i
<buf_size
; i
++){
345 state
= (state
<<8) | buf
[i
];
346 if((state
&0xFFFFFF00) == 0x100){
347 pc
->frame_start_found
=0;
353 pc
->frame_start_found
= vop_found
;
355 return END_NOT_FOUND
;
358 static int h263_find_frame_end(ParseContext
*pc
, const uint8_t *buf
, int buf_size
){
362 vop_found
= pc
->frame_start_found
;
367 for(i
=0; i
<buf_size
; i
++){
368 state
= (state
<<8) | buf
[i
];
369 if(state
>>(32-22) == 0x20){
378 for(; i
<buf_size
; i
++){
379 state
= (state
<<8) | buf
[i
];
380 if(state
>>(32-22) == 0x20){
381 pc
->frame_start_found
=0;
387 pc
->frame_start_found
= vop_found
;
390 return END_NOT_FOUND
;
393 static int h263_parse(AVCodecParserContext
*s
,
394 AVCodecContext
*avctx
,
395 uint8_t **poutbuf
, int *poutbuf_size
,
396 const uint8_t *buf
, int buf_size
)
398 ParseContext
*pc
= s
->priv_data
;
401 next
= h263_find_frame_end(pc
, buf
, buf_size
);
403 if (ff_combine_frame(pc
, next
, (uint8_t **)&buf
, &buf_size
) < 0) {
409 *poutbuf
= (uint8_t *)buf
;
410 *poutbuf_size
= buf_size
;
414 int ff_h263_decode_frame(AVCodecContext
*avctx
,
415 void *data
, int *data_size
,
416 uint8_t *buf
, int buf_size
)
418 MpegEncContext
*s
= avctx
->priv_data
;
420 AVFrame
*pict
= data
;
422 #ifdef PRINT_FRAME_TIME
423 uint64_t time
= rdtsc();
426 printf("*****frame %d size=%d\n", avctx
->frame_number
, buf_size
);
427 printf("bytes=%x %x %x %x\n", buf
[0], buf
[1], buf
[2], buf
[3]);
429 s
->flags
= avctx
->flags
;
430 s
->flags2
= avctx
->flags2
;
432 /* no supplementary picture */
434 /* special case for last picture */
435 if (s
->low_delay
==0 && s
->next_picture_ptr
) {
436 *pict
= *(AVFrame
*)s
->next_picture_ptr
;
437 s
->next_picture_ptr
= NULL
;
439 *data_size
= sizeof(AVFrame
);
445 if(s
->flags
&CODEC_FLAG_TRUNCATED
){
448 if(s
->codec_id
==CODEC_ID_MPEG4
){
449 next
= ff_mpeg4_find_frame_end(&s
->parse_context
, buf
, buf_size
);
450 }else if(s
->codec_id
==CODEC_ID_H263
){
451 next
= h263_find_frame_end(&s
->parse_context
, buf
, buf_size
);
453 av_log(s
->avctx
, AV_LOG_ERROR
, "this codec does not support truncated bitstreams\n");
457 if( ff_combine_frame(&s
->parse_context
, next
, &buf
, &buf_size
) < 0 )
464 if(s
->bitstream_buffer_size
&& (s
->divx_packed
|| buf_size
<20)){ //divx 5.01+/xvid frame reorder
465 init_get_bits(&s
->gb
, s
->bitstream_buffer
, s
->bitstream_buffer_size
*8);
467 init_get_bits(&s
->gb
, buf
, buf_size
*8);
468 s
->bitstream_buffer_size
=0;
470 if (!s
->context_initialized
) {
471 if (MPV_common_init(s
) < 0) //we need the idct permutaton for reading a custom matrix
475 //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there
476 if(s
->current_picture_ptr
==NULL
|| s
->current_picture_ptr
->data
[0]){
477 int i
= ff_find_unused_picture(s
, 0);
478 s
->current_picture_ptr
= &s
->picture
[i
];
482 if (s
->msmpeg4_version
==5) {
483 ret
= ff_wmv2_decode_picture_header(s
);
484 } else if (s
->msmpeg4_version
) {
485 ret
= msmpeg4_decode_picture_header(s
);
486 } else if (s
->h263_pred
) {
487 if(s
->avctx
->extradata_size
&& s
->picture_number
==0){
490 init_get_bits(&gb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
*8);
491 ret
= ff_mpeg4_decode_picture_header(s
, &gb
);
493 ret
= ff_mpeg4_decode_picture_header(s
, &s
->gb
);
495 if(s
->flags
& CODEC_FLAG_LOW_DELAY
)
497 } else if (s
->codec_id
== CODEC_ID_H263I
) {
498 ret
= intel_h263_decode_picture_header(s
);
499 } else if (s
->h263_flv
) {
500 ret
= flv_h263_decode_picture_header(s
);
502 ret
= h263_decode_picture_header(s
);
505 if(ret
==FRAME_SKIPPED
) return get_consumed_bytes(s
, buf_size
);
507 /* skip if the header was thrashed */
509 av_log(s
->avctx
, AV_LOG_ERROR
, "header damaged\n");
513 avctx
->has_b_frames
= !s
->low_delay
;
515 if(s
->xvid_build
==0 && s
->divx_version
==0 && s
->lavc_build
==0){
516 if(s
->avctx
->stream_codec_tag
== ff_get_fourcc("XVID") ||
517 s
->avctx
->codec_tag
== ff_get_fourcc("XVID") || s
->avctx
->codec_tag
== ff_get_fourcc("XVIX") ||
518 s
->avctx
->codec_tag
== ff_get_fourcc("RMP4"))
521 if(s
->avctx
->codec_tag
== ff_get_fourcc("DIVX") && s
->vo_type
==0 && s
->vol_control_parameters
==1
522 && s
->padding_bug_score
> 0 && s
->low_delay
) // XVID with modified fourcc
527 if(s
->xvid_build
==0 && s
->divx_version
==0 && s
->lavc_build
==0){
528 if(s
->avctx
->codec_tag
== ff_get_fourcc("DIVX") && s
->vo_type
==0 && s
->vol_control_parameters
==0)
529 s
->divx_version
= 400; //divx 4
532 if(s
->xvid_build
&& s
->divx_version
){
537 if(s
->workaround_bugs
&FF_BUG_AUTODETECT
){
538 if(s
->avctx
->codec_tag
== ff_get_fourcc("XVIX"))
539 s
->workaround_bugs
|= FF_BUG_XVID_ILACE
;
541 if(s
->avctx
->codec_tag
== ff_get_fourcc("UMP4")){
542 s
->workaround_bugs
|= FF_BUG_UMP4
;
545 if(s
->divx_version
>=500){
546 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA
;
549 if(s
->divx_version
>502){
550 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA2
;
553 if(s
->xvid_build
&& s
->xvid_build
<=3)
554 s
->padding_bug_score
= 256*256*256*64;
556 if(s
->xvid_build
&& s
->xvid_build
<=1)
557 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA
;
559 if(s
->xvid_build
&& s
->xvid_build
<=12)
560 s
->workaround_bugs
|= FF_BUG_EDGE
;
562 if(s
->xvid_build
&& s
->xvid_build
<=32)
563 s
->workaround_bugs
|= FF_BUG_DC_CLIP
;
565 #define SET_QPEL_FUNC(postfix1, postfix2) \
566 s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
567 s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
568 s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
570 if(s
->lavc_build
&& s
->lavc_build
<4653)
571 s
->workaround_bugs
|= FF_BUG_STD_QPEL
;
573 if(s
->lavc_build
&& s
->lavc_build
<4655)
574 s
->workaround_bugs
|= FF_BUG_DIRECT_BLOCKSIZE
;
576 if(s
->lavc_build
&& s
->lavc_build
<4670){
577 s
->workaround_bugs
|= FF_BUG_EDGE
;
580 if(s
->lavc_build
&& s
->lavc_build
<=4712)
581 s
->workaround_bugs
|= FF_BUG_DC_CLIP
;
584 s
->workaround_bugs
|= FF_BUG_DIRECT_BLOCKSIZE
;
585 //printf("padding_bug_score: %d\n", s->padding_bug_score);
586 if(s
->divx_version
==501 && s
->divx_build
==20020416)
587 s
->padding_bug_score
= 256*256*256*64;
589 if(s
->divx_version
&& s
->divx_version
<500){
590 s
->workaround_bugs
|= FF_BUG_EDGE
;
594 s
->workaround_bugs
|= FF_BUG_HPEL_CHROMA
;
596 if(s
->divx_version
==500)
597 s
->padding_bug_score
= 256*256*256*64;
599 /* very ugly XVID padding bug detection FIXME/XXX solve this differently
600 * lets hope this at least works
602 if( s
->resync_marker
==0 && s
->data_partitioning
==0 && s
->divx_version
==0
603 && s
->codec_id
==CODEC_ID_MPEG4
&& s
->vo_type
==0)
604 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
606 if(s
->lavc_build
&& s
->lavc_build
<4609) //FIXME not sure about the version num but a 4609 file seems ok
607 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
611 if(s
->workaround_bugs
& FF_BUG_STD_QPEL
){
612 SET_QPEL_FUNC(qpel_pixels_tab
[0][ 5], qpel16_mc11_old_c
)
613 SET_QPEL_FUNC(qpel_pixels_tab
[0][ 7], qpel16_mc31_old_c
)
614 SET_QPEL_FUNC(qpel_pixels_tab
[0][ 9], qpel16_mc12_old_c
)
615 SET_QPEL_FUNC(qpel_pixels_tab
[0][11], qpel16_mc32_old_c
)
616 SET_QPEL_FUNC(qpel_pixels_tab
[0][13], qpel16_mc13_old_c
)
617 SET_QPEL_FUNC(qpel_pixels_tab
[0][15], qpel16_mc33_old_c
)
619 SET_QPEL_FUNC(qpel_pixels_tab
[1][ 5], qpel8_mc11_old_c
)
620 SET_QPEL_FUNC(qpel_pixels_tab
[1][ 7], qpel8_mc31_old_c
)
621 SET_QPEL_FUNC(qpel_pixels_tab
[1][ 9], qpel8_mc12_old_c
)
622 SET_QPEL_FUNC(qpel_pixels_tab
[1][11], qpel8_mc32_old_c
)
623 SET_QPEL_FUNC(qpel_pixels_tab
[1][13], qpel8_mc13_old_c
)
624 SET_QPEL_FUNC(qpel_pixels_tab
[1][15], qpel8_mc33_old_c
)
627 if(avctx
->debug
& FF_DEBUG_BUGS
)
628 av_log(s
->avctx
, AV_LOG_DEBUG
, "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
629 s
->workaround_bugs
, s
->lavc_build
, s
->xvid_build
, s
->divx_version
, s
->divx_build
,
630 s
->divx_packed
? "p" : "");
632 #if 0 // dump bits per frame / qp / complexity
635 if(!f
) f
=fopen("rate_qp_cplx.txt", "w");
636 fprintf(f
, "%d %d %f\n", buf_size
, s
->qscale
, buf_size
*(double)s
->qscale
);
640 #if defined(HAVE_MMX) && defined(CONFIG_GPL)
641 if(s
->codec_id
== CODEC_ID_MPEG4
&& s
->xvid_build
&& avctx
->idct_algo
== FF_IDCT_AUTO
&& (mm_flags
& MM_MMX
)){
642 avctx
->idct_algo
= FF_IDCT_XVIDMMX
;
643 avctx
->coded_width
= 0; // force reinit
644 // dsputil_init(&s->dsp, avctx);
649 /* After H263 & mpeg4 header decode we have the height, width,*/
650 /* and other parameters. So then we could init the picture */
651 /* FIXME: By the way H263 decoder is evolving it should have */
652 /* an H263EncContext */
654 if ( s
->width
!= avctx
->coded_width
655 || s
->height
!= avctx
->coded_height
) {
656 /* H.263 could change picture size any time */
657 ParseContext pc
= s
->parse_context
; //FIXME move these demuxng hack to avformat
658 s
->parse_context
.buffer
=0;
660 s
->parse_context
= pc
;
662 if (!s
->context_initialized
) {
663 avcodec_set_dimensions(avctx
, s
->width
, s
->height
);
668 if((s
->codec_id
==CODEC_ID_H263
|| s
->codec_id
==CODEC_ID_H263P
))
669 s
->gob_index
= ff_h263_get_gob_height(s
);
672 s
->current_picture
.pict_type
= s
->pict_type
;
673 s
->current_picture
.key_frame
= s
->pict_type
== I_TYPE
;
675 /* skip B-frames if we don't have reference frames */
676 if(s
->last_picture_ptr
==NULL
&& (s
->pict_type
==B_TYPE
|| s
->dropable
)) return get_consumed_bytes(s
, buf_size
);
677 /* skip b frames if we are in a hurry */
678 if(avctx
->hurry_up
&& s
->pict_type
==B_TYPE
) return get_consumed_bytes(s
, buf_size
);
679 if( (avctx
->skip_frame
>= AVDISCARD_NONREF
&& s
->pict_type
==B_TYPE
)
680 || (avctx
->skip_frame
>= AVDISCARD_NONKEY
&& s
->pict_type
!=I_TYPE
)
681 || avctx
->skip_frame
>= AVDISCARD_ALL
)
682 return get_consumed_bytes(s
, buf_size
);
683 /* skip everything if we are in a hurry>=5 */
684 if(avctx
->hurry_up
>=5) return get_consumed_bytes(s
, buf_size
);
686 if(s
->next_p_frame_damaged
){
687 if(s
->pict_type
==B_TYPE
)
688 return get_consumed_bytes(s
, buf_size
);
690 s
->next_p_frame_damaged
=0;
693 if(MPV_frame_start(s
, avctx
) < 0)
697 av_log(avctx
, AV_LOG_DEBUG
, "qscale=%d\n", s
->qscale
);
700 ff_er_frame_start(s
);
702 //the second part of the wmv2 header contains the MB skip bits which are stored in current_picture->mb_type
703 //which isnt available before MPV_frame_start()
704 if (s
->msmpeg4_version
==5){
705 if(ff_wmv2_decode_secondary_picture_header(s
) < 0)
709 /* decode each macroblock */
714 while(s
->mb_y
<s
->mb_height
){
715 if(s
->msmpeg4_version
){
716 if(s
->mb_x
!=0 || (s
->mb_y
%s
->slice_height
)!=0 || get_bits_count(&s
->gb
) > s
->gb
.size_in_bits
)
719 if(ff_h263_resync(s
)<0)
723 if(s
->msmpeg4_version
<4 && s
->h263_pred
)
724 ff_mpeg4_clean_buffers(s
);
729 if (s
->h263_msmpeg4
&& s
->msmpeg4_version
<4 && s
->pict_type
==I_TYPE
)
730 if(msmpeg4_decode_ext_header(s
, buf_size
) < 0){
731 s
->error_status_table
[s
->mb_num
-1]= AC_ERROR
|DC_ERROR
|MV_ERROR
;
734 /* divx 5.01+ bistream reorder stuff */
735 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->bitstream_buffer_size
==0 && s
->divx_packed
){
736 int current_pos
= get_bits_count(&s
->gb
)>>3;
737 int startcode_found
=0;
739 if(buf_size
- current_pos
> 5){
741 for(i
=current_pos
; i
<buf_size
-3; i
++){
742 if(buf
[i
]==0 && buf
[i
+1]==0 && buf
[i
+2]==1 && buf
[i
+3]==0xB6){
748 if(s
->gb
.buffer
== s
->bitstream_buffer
&& buf_size
>20){ //xvid style
754 s
->bitstream_buffer
= av_fast_realloc(
756 &s
->allocated_bitstream_buffer_size
,
757 buf_size
- current_pos
+ FF_INPUT_BUFFER_PADDING_SIZE
);
758 memcpy(s
->bitstream_buffer
, buf
+ current_pos
, buf_size
- current_pos
);
759 s
->bitstream_buffer_size
= buf_size
- current_pos
;
767 assert(s
->current_picture
.pict_type
== s
->current_picture_ptr
->pict_type
);
768 assert(s
->current_picture
.pict_type
== s
->pict_type
);
769 if (s
->pict_type
== B_TYPE
|| s
->low_delay
) {
770 *pict
= *(AVFrame
*)s
->current_picture_ptr
;
771 } else if (s
->last_picture_ptr
!= NULL
) {
772 *pict
= *(AVFrame
*)s
->last_picture_ptr
;
775 if(s
->last_picture_ptr
|| s
->low_delay
){
776 *data_size
= sizeof(AVFrame
);
777 ff_print_debug_info(s
, pict
);
780 /* Return the Picture timestamp as the frame number */
781 /* we substract 1 because it is added on utils.c */
782 avctx
->frame_number
= s
->picture_number
- 1;
784 #ifdef PRINT_FRAME_TIME
785 av_log(avctx
, AV_LOG_DEBUG
, "%Ld\n", rdtsc()-time
);
788 return get_consumed_bytes(s
, buf_size
);
791 AVCodec mpeg4_decoder
= {
795 sizeof(MpegEncContext
),
799 ff_h263_decode_frame
,
800 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_TRUNCATED
| CODEC_CAP_DELAY
,
801 .flush
= ff_mpeg_flush
,
804 AVCodec h263_decoder
= {
808 sizeof(MpegEncContext
),
812 ff_h263_decode_frame
,
813 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_TRUNCATED
| CODEC_CAP_DELAY
,
814 .flush
= ff_mpeg_flush
,
817 AVCodec msmpeg4v1_decoder
= {
821 sizeof(MpegEncContext
),
825 ff_h263_decode_frame
,
826 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
829 AVCodec msmpeg4v2_decoder
= {
833 sizeof(MpegEncContext
),
837 ff_h263_decode_frame
,
838 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
841 AVCodec msmpeg4v3_decoder
= {
845 sizeof(MpegEncContext
),
849 ff_h263_decode_frame
,
850 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
853 AVCodec wmv1_decoder
= {
857 sizeof(MpegEncContext
),
861 ff_h263_decode_frame
,
862 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
865 AVCodec h263i_decoder
= {
869 sizeof(MpegEncContext
),
873 ff_h263_decode_frame
,
874 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
877 AVCodec flv_decoder
= {
881 sizeof(MpegEncContext
),
885 ff_h263_decode_frame
,
886 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
889 AVCodecParser h263_parser
= {
891 sizeof(ParseContext
),