From a5ac55c4a04e668afb0a5cf9945a92dc4d5e1b31 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 5 Jul 2016 20:15:28 +0300 Subject: [PATCH] avvidenc: Create caps from the codec context after it is opened We won't get codec_data and various other information otherwise. --- ext/libav/gstavvidenc.c | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/ext/libav/gstavvidenc.c b/ext/libav/gstavvidenc.c index 264ea36..2d8391b 100644 --- a/ext/libav/gstavvidenc.c +++ b/ext/libav/gstavvidenc.c @@ -430,6 +430,29 @@ gst_ffmpegvidenc_set_format (GstVideoEncoder * encoder, gst_ffmpeg_caps_with_codecid (oclass->in_plugin->id, oclass->in_plugin->type, allowed_caps, ffmpegenc->context); + /* open codec */ + if (gst_ffmpeg_avcodec_open (ffmpegenc->context, oclass->in_plugin) < 0) { + gst_caps_unref (allowed_caps); + goto open_codec_fail; + } + + /* is the colourspace correct? */ + if (pix_fmt != ffmpegenc->context->pix_fmt) { + gst_caps_unref (allowed_caps); + goto pix_fmt_err; + } + + /* we may have failed mapping caps to a pixfmt, + * and quite some codecs do not make up their own mind about that + * in any case, _NONE can never work out later on */ + if (pix_fmt == AV_PIX_FMT_NONE) { + gst_caps_unref (allowed_caps); + goto bad_input_fmt; + } + + /* second pass stats buffer no longer needed */ + g_free (ffmpegenc->context->stats_in); + /* try to set this caps on the other side */ other_caps = gst_ffmpeg_codecid_to_caps (oclass->in_plugin->id, ffmpegenc->context, TRUE); @@ -450,23 +473,6 @@ gst_ffmpegvidenc_set_format (GstVideoEncoder * encoder, GST_DEBUG_OBJECT (ffmpegenc, "codec flags 0x%08x", ffmpegenc->context->flags); - /* open codec */ - if (gst_ffmpeg_avcodec_open (ffmpegenc->context, oclass->in_plugin) < 0) - goto open_codec_fail; - - /* is the colourspace correct? */ - if (pix_fmt != ffmpegenc->context->pix_fmt) - goto pix_fmt_err; - - /* we may have failed mapping caps to a pixfmt, - * and quite some codecs do not make up their own mind about that - * in any case, _NONE can never work out later on */ - if (pix_fmt == AV_PIX_FMT_NONE) - goto bad_input_fmt; - - /* second pass stats buffer no longer needed */ - g_free (ffmpegenc->context->stats_in); - /* Store input state and set output state */ if (ffmpegenc->input_state) gst_video_codec_state_unref (ffmpegenc->input_state); -- 2.7.4