From 1ca115c44bca894a6bbb2334e60a361dbd64a157 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 14 Jun 2012 15:04:33 +0200 Subject: [PATCH 1/2] ffmpegviddec: Properly error out when codec doesn't open Avoids ending up using an un-set codec --- ext/ffmpeg/gstffmpegviddec.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/ffmpeg/gstffmpegviddec.c b/ext/ffmpeg/gstffmpegviddec.c index 3554ead117..a4afe08a1b 100644 --- a/ext/ffmpeg/gstffmpegviddec.c +++ b/ext/ffmpeg/gstffmpegviddec.c @@ -413,7 +413,7 @@ gst_ffmpegviddec_set_format (GstVideoDecoder * decoder, { GstFFMpegVidDec *ffmpegdec; GstFFMpegVidDecClass *oclass; - gboolean ret = TRUE; + gboolean ret = FALSE; ffmpegdec = (GstFFMpegVidDec *) decoder; oclass = (GstFFMpegVidDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec)); @@ -528,6 +528,8 @@ gst_ffmpegviddec_set_format (GstVideoDecoder * decoder, gst_video_codec_state_unref (ffmpegdec->input_state); ffmpegdec->input_state = gst_video_codec_state_ref (state); + ret = TRUE; + done: GST_OBJECT_UNLOCK (ffmpegdec); From ce7f65f752dfff124c672a418bbd1728df2fd137 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 14 Jun 2012 15:13:31 +0200 Subject: [PATCH 2/2] ffmpegviddec: Properly update the interlacing Fixes #678080 --- ext/ffmpeg/gstffmpegviddec.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/ext/ffmpeg/gstffmpegviddec.c b/ext/ffmpeg/gstffmpegviddec.c index a4afe08a1b..8e8b03d10a 100644 --- a/ext/ffmpeg/gstffmpegviddec.c +++ b/ext/ffmpeg/gstffmpegviddec.c @@ -1073,20 +1073,21 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec, (guint64) ffmpegdec->picture->reordered_opaque); GST_DEBUG_OBJECT (ffmpegdec, "repeat_pict:%d", ffmpegdec->picture->repeat_pict); - GST_DEBUG_OBJECT (ffmpegdec, "interlaced_frame:%d", - ffmpegdec->picture->interlaced_frame); + GST_DEBUG_OBJECT (ffmpegdec, "interlaced_frame:%d (current:%d)", + ffmpegdec->picture->interlaced_frame, + GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->input_state->info)); - if (G_UNLIKELY (ffmpegdec->output_state + if (G_UNLIKELY (ffmpegdec->input_state && ffmpegdec->picture->interlaced_frame != - GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->output_state->info))) { + GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->input_state->info))) { GST_WARNING ("Change in interlacing ! picture:%d, recorded:%d", ffmpegdec->picture->interlaced_frame, - GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->output_state->info)); + GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->input_state->info)); if (ffmpegdec->picture->interlaced_frame) - GST_VIDEO_INFO_INTERLACE_MODE (&ffmpegdec->output_state->info) = + GST_VIDEO_INFO_INTERLACE_MODE (&ffmpegdec->input_state->info) = GST_VIDEO_INTERLACE_MODE_INTERLEAVED; else - GST_VIDEO_INFO_INTERLACE_MODE (&ffmpegdec->output_state->info) = + GST_VIDEO_INFO_INTERLACE_MODE (&ffmpegdec->input_state->info) = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; gst_ffmpegviddec_negotiate (ffmpegdec, TRUE); } @@ -1097,17 +1098,17 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec, if (G_UNLIKELY (*ret != GST_FLOW_OK)) goto no_output; - if (G_UNLIKELY (ffmpegdec->output_state + if (G_UNLIKELY (ffmpegdec->input_state && ffmpegdec->picture->interlaced_frame != - GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->output_state->info))) { + GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->input_state->info))) { GST_WARNING ("Change in interlacing ! picture:%d, recorded:%d", ffmpegdec->picture->interlaced_frame, - GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->output_state->info)); + GST_VIDEO_INFO_IS_INTERLACED (&ffmpegdec->input_state->info)); if (ffmpegdec->picture->interlaced_frame) - GST_VIDEO_INFO_INTERLACE_MODE (&ffmpegdec->output_state->info) = + GST_VIDEO_INFO_INTERLACE_MODE (&ffmpegdec->input_state->info) = GST_VIDEO_INTERLACE_MODE_INTERLEAVED; else - GST_VIDEO_INFO_INTERLACE_MODE (&ffmpegdec->output_state->info) = + GST_VIDEO_INFO_INTERLACE_MODE (&ffmpegdec->input_state->info) = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; gst_ffmpegviddec_negotiate (ffmpegdec, TRUE); }