r32036 - in trunk/libmpcodecs: dec_video.c mp_image.h vd_ffmpeg.c
Author: cehoyos Date: Tue Aug 31 01:24:56 2010 New Revision: 32036 Log: Improve correct-pts with PAFF streams. Patch by Pásztor Szilárd, bartosteka freemail hu Modified: trunk/libmpcodecs/dec_video.c trunk/libmpcodecs/mp_image.h trunk/libmpcodecs/vd_ffmpeg.c Modified: trunk/libmpcodecs/dec_video.c ============================================================================== --- trunk/libmpcodecs/dec_video.c Mon Aug 30 22:07:34 2010 (r32035) +++ trunk/libmpcodecs/dec_video.c Tue Aug 31 01:24:56 2010 (r32036) @@ -394,8 +394,21 @@ void *decode_video(sh_video_t *sh_video, unsigned int t = GetTimer(); unsigned int t2; double tt; + int delay; + int got_picture = 1; - if (correct_pts && pts != MP_NOPTS_VALUE) { + mpi = mpvdec->decode(sh_video, start, in_size, drop_frame); + + //------------------------ frame decoded. -------------------- + + if (mpi && mpi->type == MP_IMGTYPE_INCOMPLETE) { + got_picture = 0; + mpi = NULL; + } + + delay = get_current_video_decoder_lag(sh_video); + if (correct_pts && pts != MP_NOPTS_VALUE + && (got_picture || sh_video->num_buffered_pts < delay)) { if (sh_video->num_buffered_pts == sizeof(sh_video->buffered_pts) / sizeof(double)) mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Too many buffered pts\n"); @@ -411,10 +424,6 @@ void *decode_video(sh_video_t *sh_video, } } - mpi = mpvdec->decode(sh_video, start, in_size, drop_frame); - - //------------------------ frame decoded. -------------------- - #if HAVE_MMX // some codecs are broken, and doesn't restore MMX state :( // it happens usually with broken/damaged files. @@ -439,7 +448,6 @@ void *decode_video(sh_video_t *sh_video, mpi->fields &= ~MP_IMGFIELD_TOP_FIRST; if (correct_pts) { - int delay = get_current_video_decoder_lag(sh_video); if (sh_video->num_buffered_pts) { sh_video->num_buffered_pts--; sh_video->pts = sh_video->buffered_pts[sh_video->num_buffered_pts]; Modified: trunk/libmpcodecs/mp_image.h ============================================================================== --- trunk/libmpcodecs/mp_image.h Mon Aug 30 22:07:34 2010 (r32035) +++ trunk/libmpcodecs/mp_image.h Tue Aug 31 01:24:56 2010 (r32036) @@ -86,6 +86,10 @@ #define MP_IMGTYPE_IPB 4 // Upper 16 bits give desired buffer number, -1 means get next available #define MP_IMGTYPE_NUMBERED 5 +// Doesn't need any buffer, incomplete image (probably a first field only) +// we need this type to be able to differentiate between half frames and +// all other cases +#define MP_IMGTYPE_INCOMPLETE 6 #define MP_MAX_PLANES 4 Modified: trunk/libmpcodecs/vd_ffmpeg.c ============================================================================== --- trunk/libmpcodecs/vd_ffmpeg.c Mon Aug 30 22:07:34 2010 (r32035) +++ trunk/libmpcodecs/vd_ffmpeg.c Tue Aug 31 01:24:56 2010 (r32036) @@ -103,6 +103,11 @@ static int lavc_param_threads=1; static int lavc_param_bitexact=0; static char *lavc_avopt = NULL; +static const mp_image_t mpi_no_picture = +{ + .type = MP_IMGTYPE_INCOMPLETE +}; + const m_option_t lavc_decode_opts_conf[]={ {"bug", &lavc_param_workaround_bugs, CONF_TYPE_INT, CONF_RANGE, -1, 999999, NULL}, {"er", &lavc_param_error_resilience, CONF_TYPE_INT, CONF_RANGE, 0, 99, NULL}, @@ -901,7 +906,12 @@ static mp_image_t *decode(sh_video_t *sh } //-- - if(!got_picture) return NULL; // skipped image + if(!got_picture) { + if (avctx->codec->id == CODEC_ID_H264) + return &mpi_no_picture; // H.264 first field only + else + return NULL; // skipped image + } if(init_vo(sh, avctx->pix_fmt) < 0) return NULL;
participants (1)
-
cehoyos