# HG changeset patch # User pulento # Date 1021406202 0 # Node ID e6b64bc3bc87bc7bf9e586de0be58584de694b95 # Parent b1663b0ffbbc952cb8146ce932f5b5838e18c9a0 - repeat_pict meaning changed, now it signals the extra delay for the decoded frame. - extra_delay = (repeat_pict / 2) * (1/fps) diff -r b1663b0ffbbc -r e6b64bc3bc87 avcodec.h --- a/avcodec.h Tue May 14 14:17:11 2002 +0000 +++ b/avcodec.h Tue May 14 19:56:42 2002 +0000 @@ -5,8 +5,8 @@ #define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION "0.4.6" -#define LIBAVCODEC_BUILD 4608 -#define LIBAVCODEC_BUILD_STR "4608" +#define LIBAVCODEC_BUILD 4609 +#define LIBAVCODEC_BUILD_STR "4609" enum CodecID { CODEC_ID_NONE, @@ -130,8 +130,9 @@ #define FF_ASPECT_16_9_525 5 int gop_size; /* 0 = intra only */ enum PixelFormat pix_fmt; /* pixel format, see PIX_FMT_xxx */ - int repeat_pict; /* set this to 1 if you want the decoder - to repeat frames for 3:2 pulldown (MPEG-2) */ + int repeat_pict; /* when decoding, this signal how much the picture */ + /* must be delayed. */ + /* extra_delay = (repeat_pict / 2) * (1/fps) */ /* if non NULL, 'draw_horiz_band' is called by the libavcodec decoder to draw an horizontal band. It improve cache usage. Not all codecs can do that. You must check the codec capabilities diff -r b1663b0ffbbc -r e6b64bc3bc87 mpeg12.c --- a/mpeg12.c Tue May 14 14:17:11 2002 +0000 +++ b/mpeg12.c Tue May 14 19:56:42 2002 +0000 @@ -1338,6 +1338,8 @@ /* composite display not parsed */ dprintf("intra_dc_precision=%d\n", s->intra_dc_precision); dprintf("picture_structure=%d\n", s->picture_structure); + dprintf("top field first=%d\n", s->top_field_first); + dprintf("repeat first field=%d\n", s->repeat_first_field); dprintf("conceal=%d\n", s->concealment_motion_vectors); dprintf("intra_vlc_format=%d\n", s->intra_vlc_format); dprintf("alternate_scan=%d\n", s->alternate_scan); @@ -1587,15 +1589,18 @@ buf_ptr = buf; buf_end = buf + buf_size; - - if (s->repeat_field % 2 == 1 && avctx->repeat_pict) { + +#if 0 + if (s->repeat_field % 2 == 1) { s->repeat_field++; //fprintf(stderr,"\nRepeating last frame: %d -> %d! pict: %d %d", avctx->frame_number-1, avctx->frame_number, - // s2->picture_number, s->repeat_field); - *data_size = sizeof(AVPicture); - goto the_end; + // s2->picture_number, s->repeat_field); + if (avctx->flags & CODEC_FLAG_REPEAT_FIELD) { + *data_size = sizeof(AVPicture); + goto the_end; + } } - +#endif while (buf_ptr < buf_end) { buf_start = buf_ptr; /* find start next code */ @@ -1645,13 +1650,27 @@ if (ret == 1) { /* got a picture: exit */ /* first check if we must repeat the frame */ + avctx->repeat_pict = 0; +#if 0 if (s2->progressive_frame && s2->repeat_first_field) { //fprintf(stderr,"\nRepeat this frame: %d! pict: %d",avctx->frame_number,s2->picture_number); - s2->repeat_first_field = 0; - s2->progressive_frame = 0; + //s2->repeat_first_field = 0; + //s2->progressive_frame = 0; if (++s->repeat_field > 2) s->repeat_field = 0; + avctx->repeat_pict = 1; } +#endif + if (s2->repeat_first_field) { + if (s2->progressive_sequence) { + if (s2->top_field_first) + avctx->repeat_pict = 4; + else + avctx->repeat_pict = 2; + } else if (s2->progressive_frame) { + avctx->repeat_pict = 1; + } + } *data_size = sizeof(AVPicture); goto the_end; }