diff --git a/subprojects/gst-libav/ext/libav/gstavviddec.c b/subprojects/gst-libav/ext/libav/gstavviddec.c index 8c2fa458f8..bba4151e0e 100644 --- a/subprojects/gst-libav/ext/libav/gstavviddec.c +++ b/subprojects/gst-libav/ext/libav/gstavviddec.c @@ -560,6 +560,19 @@ gst_ffmpegviddec_set_format (GstVideoDecoder * decoder, GST_OBJECT_LOCK (ffmpegdec); if (!gst_ffmpegviddec_needs_reset (ffmpegdec, state)) { + if (ffmpegdec->last_caps) { + gint last_fps_n, last_fps_d, fps_n, fps_d; + + if (gst_structure_get (gst_caps_get_structure (ffmpegdec->last_caps, 0), + "framerate", GST_TYPE_FRACTION, &last_fps_n, &last_fps_d, NULL) && + gst_structure_get (gst_caps_get_structure (state->caps, 0), + "framerate", GST_TYPE_FRACTION, &fps_n, &fps_d, NULL)) { + + ffmpegdec->needs_renegotation = (last_fps_d != fps_d + || last_fps_n != fps_n); + } + + } gst_caps_replace (&ffmpegdec->last_caps, state->caps); goto update_state; } @@ -1482,9 +1495,12 @@ gst_ffmpegviddec_negotiate (GstFFMpegVidDec * ffmpegdec, gint caps_height; gboolean one_field = !!(flags & GST_VIDEO_BUFFER_FLAG_ONEFIELD); - if (!update_video_context (ffmpegdec, context, picture, one_field)) + if (!update_video_context (ffmpegdec, context, picture, one_field) + && !ffmpegdec->needs_renegotation) { return TRUE; + } + ffmpegdec->needs_renegotation = FALSE; caps_height = ffmpegdec->pic_height; fmt = gst_ffmpeg_pixfmt_to_videoformat (ffmpegdec->pic_pix_fmt); @@ -2425,6 +2441,7 @@ gst_ffmpegviddec_stop (GstVideoDecoder * decoder) ffmpegdec->pool_width = 0; ffmpegdec->pool_height = 0; ffmpegdec->pool_format = 0; + ffmpegdec->needs_renegotation = FALSE; return TRUE; } diff --git a/subprojects/gst-libav/ext/libav/gstavviddec.h b/subprojects/gst-libav/ext/libav/gstavviddec.h index 14d5a9aff3..b209fea43e 100644 --- a/subprojects/gst-libav/ext/libav/gstavviddec.h +++ b/subprojects/gst-libav/ext/libav/gstavviddec.h @@ -93,6 +93,8 @@ struct _GstFFMpegVidDec gint pool_height; enum AVPixelFormat pool_format; GstVideoInfo pool_info; + + gboolean needs_renegotation; }; typedef struct _GstFFMpegVidDecClass GstFFMpegVidDecClass;