blob: 85fea67be41aae460751253b5c68a6f917f09581 [file] [log] [blame]
From cfb432fcd8868c7a4f32010c61e47e2bf0ff80c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= <eocanha@igalia.com>
Date: Mon, 25 May 2015 14:53:35 +0200
Subject: [PATCH] Don't try to acquire buffer when src pad isn't active
This solves a race condition when setting the pipeline from PAUSE to
NULL while the decoder loop is still running. Without this patch, the
thread which interacts with the decode sink pad gets blocked here:
gst_element_change_state()
gst_element_change_state_func()
gst_element_pads_activate() --> Deactivating pads
activate_pads()
gst_pad_set_active()
gst_pad_activate_mode()
post_activate()
GST_PAD_STREAM_LOCK()
while gst_omx_port_acquire_buffer() gets stalled forever in
gst_omx_component_wait_message() waiting for a message that will never
arrive:
gst_omx_video_dec_loop()
gst_omx_port_acquire_buffer()
gst_omx_component_wait_message()
---
omx/gstomxvideodec.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c
index d12ee8f..fb0100a 100644
--- a/omx/gstomxvideodec.c
+++ b/omx/gstomxvideodec.c
@@ -1250,6 +1250,11 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
GstClockTimeDiff deadline;
OMX_ERRORTYPE err;
+ if (!gst_pad_is_active(GST_VIDEO_DECODER_SRC_PAD (self))) {
+ GST_DEBUG_OBJECT (self, "Src pad not active, not acquiring buffer and flushing instead");
+ goto flushing;
+ }
+
#if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL)
port = self->eglimage ? self->egl_out_port : self->dec_out_port;
#else