summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <ts.santos@sisa.samsung.com>2014-07-02 04:54:29 -0300
committerThiago Santos <ts.santos@sisa.samsung.com>2014-07-02 06:19:58 -0300
commit92dbcf2bf9787460d9013e8e89b4bee16388c05f (patch)
tree99be37a94f16456618835ddd46dc4091268fde75
parentf75f860ff3791f47db3eb52602f0c5e6b9f35748 (diff)
downloadgstreamer-plugins-bad-92dbcf2bf9787460d9013e8e89b4bee16388c05f.tar.gz
vtdec: avoid segfault when output isn't configured
This can help when the callback is called during/after videodecoder base class shut down https://bugzilla.gnome.org/show_bug.cgi?id=728435
-rw-r--r--sys/applemedia/vtdec.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/sys/applemedia/vtdec.c b/sys/applemedia/vtdec.c
index 3d381b49c..116a4d8d5 100644
--- a/sys/applemedia/vtdec.c
+++ b/sys/applemedia/vtdec.c
@@ -530,6 +530,13 @@ gst_vtdec_session_output_callback (void *decompression_output_ref_con,
/* FIXME: use gst_video_decoder_allocate_output_buffer */
state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (vtdec));
+ if (state == NULL) {
+ GST_WARNING_OBJECT (vtdec, "Output state not configured, release buffer");
+ /* release as this usually means that the baseclass isn't ready to do
+ * the QoS that _drop requires and will lead to an assertion with the
+ * segment.format being undefined */
+ goto release;
+ }
buf = gst_core_video_buffer_new (image_buffer, &state->info);
gst_video_codec_state_unref (state);
frame->output_buffer = buf;
@@ -548,6 +555,13 @@ drop:
GST_WARNING_OBJECT (vtdec, "Frame dropped %p %d", frame,
frame->decode_frame_number);
gst_video_decoder_drop_frame (GST_VIDEO_DECODER (vtdec), frame);
+ return;
+
+release:
+ GST_WARNING_OBJECT (vtdec, "Frame released %p %d", frame,
+ frame->decode_frame_number);
+ gst_video_decoder_release_frame (GST_VIDEO_DECODER (vtdec), frame);
+ return;
}
static GstFlowReturn