From 1277540b8c060983d518109237586ea12446d479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 12 Sep 2013 12:12:23 +0200 Subject: [PATCH] avviddec: Use the correct context for negotiation During get_buffer() it can happen that the main context is not updated yet and only the context passed here has the correct width, height, etc. --- ext/libav/gstavviddec.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c index 9c26e1a842..5995d0323e 100644 --- a/ext/libav/gstavviddec.c +++ b/ext/libav/gstavviddec.c @@ -82,7 +82,7 @@ static void gst_ffmpegviddec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_ffmpegviddec_negotiate (GstFFMpegVidDec * ffmpegdec, - gboolean force); + AVCodecContext * context, gboolean force); /* some sort of bufferpool handling, but different */ static int gst_ffmpegviddec_get_buffer (AVCodecContext * context, @@ -585,7 +585,7 @@ gst_ffmpegviddec_get_buffer (AVCodecContext * context, AVFrame * picture) ffmpegdec->context->pix_fmt = context->pix_fmt; /* see if we need renegotiation */ - if (G_UNLIKELY (!gst_ffmpegviddec_negotiate (ffmpegdec, FALSE))) + if (G_UNLIKELY (!gst_ffmpegviddec_negotiate (ffmpegdec, context, FALSE))) goto negotiate_failed; if (!ffmpegdec->current_dr) @@ -768,10 +768,9 @@ gst_ffmpegviddec_release_buffer (AVCodecContext * context, AVFrame * picture) } static gboolean -update_video_context (GstFFMpegVidDec * ffmpegdec, gboolean force) +update_video_context (GstFFMpegVidDec * ffmpegdec, AVCodecContext * context, + gboolean force) { - AVCodecContext *context = ffmpegdec->context; - if (!force && ffmpegdec->ctx_width == context->width && ffmpegdec->ctx_height == context->height && ffmpegdec->ctx_ticks == context->ticks_per_frame @@ -879,14 +878,15 @@ no_par: } static gboolean -gst_ffmpegviddec_negotiate (GstFFMpegVidDec * ffmpegdec, gboolean force) +gst_ffmpegviddec_negotiate (GstFFMpegVidDec * ffmpegdec, + AVCodecContext * context, gboolean force) { GstVideoFormat fmt; GstVideoInfo *in_info, *out_info; GstVideoCodecState *output_state; gint fps_n, fps_d; - if (!update_video_context (ffmpegdec, force)) + if (!update_video_context (ffmpegdec, context, force)) return TRUE; fmt = gst_ffmpeg_pixfmt_to_videoformat (ffmpegdec->ctx_pix_fmt); @@ -1204,7 +1204,7 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec, GST_WARNING ("Change in interlacing ! picture:%d, recorded:%d", ffmpegdec->picture->interlaced_frame, ffmpegdec->ctx_interlaced); ffmpegdec->ctx_interlaced = ffmpegdec->picture->interlaced_frame; - if (!gst_ffmpegviddec_negotiate (ffmpegdec, TRUE)) + if (!gst_ffmpegviddec_negotiate (ffmpegdec, ffmpegdec->context, TRUE)) goto negotiation_error; }