aboutsummaryrefslogtreecommitdiff
path: root/ext/libav/gstavviddec.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/libav/gstavviddec.c')
-rw-r--r--ext/libav/gstavviddec.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c
index 3e537a0..0635767 100644
--- a/ext/libav/gstavviddec.c
+++ b/ext/libav/gstavviddec.c
@@ -947,7 +947,8 @@ gst_ffmpegviddec_negotiate (GstFFMpegVidDec * ffmpegdec,
/* calculate and update par now */
gst_ffmpegviddec_update_par (ffmpegdec, in_info, out_info);
- gst_video_decoder_negotiate (GST_VIDEO_DECODER (ffmpegdec));
+ if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (ffmpegdec)))
+ goto negotiate_failed;
return TRUE;
@@ -958,6 +959,21 @@ unknown_format:
"decoder requires a video format unsupported by GStreamer");
return FALSE;
}
+negotiate_failed:
+ {
+ /* Reset so we try again next time even if force==FALSE */
+ ffmpegdec->ctx_width = 0;
+ ffmpegdec->ctx_height = 0;
+ ffmpegdec->ctx_ticks = 0;
+ ffmpegdec->ctx_time_n = 0;
+ ffmpegdec->ctx_time_d = 0;
+ ffmpegdec->ctx_pix_fmt = 0;
+ ffmpegdec->ctx_par_n = 0;
+ ffmpegdec->ctx_par_d = 0;
+
+ GST_ERROR_OBJECT (ffmpegdec, "negotiation failed");
+ return FALSE;
+ }
}
/* perform qos calculations before decoding the next frame.
@@ -1499,6 +1515,15 @@ gst_ffmpegviddec_stop (GstVideoDecoder * decoder)
gst_video_codec_state_unref (ffmpegdec->output_state);
ffmpegdec->output_state = NULL;
+ ffmpegdec->ctx_width = 0;
+ ffmpegdec->ctx_height = 0;
+ ffmpegdec->ctx_ticks = 0;
+ ffmpegdec->ctx_time_n = 0;
+ ffmpegdec->ctx_time_d = 0;
+ ffmpegdec->ctx_pix_fmt = 0;
+ ffmpegdec->ctx_par_n = 0;
+ ffmpegdec->ctx_par_d = 0;
+
return TRUE;
}