diff options
author | Graham Leggett <minfrin@sharp.fm> | 2016-12-18 19:46:55 +0000 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-12-19 10:52:16 +0200 |
commit | a1e613dd89b7b8d07d12fdb2657e75aa9ece5450 (patch) | |
tree | 11effe415722299f57ecc374a875593a0f602b05 | |
parent | 7925355d72c8d3127fdf05a62fe5f90bb2f9a866 (diff) |
omx*dec: Flush before we stop the srcpad loop
Flushing could otherwise hang if output port queue of pending buffers was empty
https://bugzilla.gnome.org/show_bug.cgi?id=774654
-rw-r--r-- | omx/gstomxaudiodec.c | 12 | ||||
-rw-r--r-- | omx/gstomxvideodec.c | 18 |
2 files changed, 15 insertions, 15 deletions
diff --git a/omx/gstomxaudiodec.c b/omx/gstomxaudiodec.c index 6e9d6df..8b8e121 100644 --- a/omx/gstomxaudiodec.c +++ b/omx/gstomxaudiodec.c @@ -990,7 +990,12 @@ gst_omx_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard) gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE); } - /* 1) Wait until the srcpad loop is stopped, + /* 1) Flush the ports */ + GST_DEBUG_OBJECT (self, "flushing ports"); + gst_omx_port_set_flushing (self->dec_in_port, 5 * GST_SECOND, TRUE); + gst_omx_port_set_flushing (self->dec_out_port, 5 * GST_SECOND, TRUE); + + /* 2) Wait until the srcpad loop is stopped, * unlock GST_AUDIO_DECODER_STREAM_LOCK to prevent deadlocks * caused by using this lock from inside the loop function */ GST_AUDIO_DECODER_STREAM_UNLOCK (self); @@ -998,11 +1003,6 @@ gst_omx_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard) GST_DEBUG_OBJECT (self, "Flushing -- task stopped"); GST_AUDIO_DECODER_STREAM_LOCK (self); - /* 2) Flush the ports */ - GST_DEBUG_OBJECT (self, "flushing ports"); - gst_omx_port_set_flushing (self->dec_in_port, 5 * GST_SECOND, TRUE); - gst_omx_port_set_flushing (self->dec_out_port, 5 * GST_SECOND, TRUE); - /* 3) Resume components */ gst_omx_component_set_state (self->dec, OMX_StateExecuting); gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE); diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index 1e7d436..0dc4871 100644 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -2094,15 +2094,7 @@ gst_omx_video_dec_flush (GstVideoDecoder * decoder) } #endif - /* 1) Wait until the srcpad loop is stopped, - * unlock GST_VIDEO_DECODER_STREAM_LOCK to prevent deadlocks - * caused by using this lock from inside the loop function */ - GST_VIDEO_DECODER_STREAM_UNLOCK (self); - gst_pad_stop_task (GST_VIDEO_DECODER_SRC_PAD (decoder)); - GST_DEBUG_OBJECT (self, "Flushing -- task stopped"); - GST_VIDEO_DECODER_STREAM_LOCK (self); - - /* 2) Flush the ports */ + /* 1) Flush the ports */ GST_DEBUG_OBJECT (self, "flushing ports"); gst_omx_port_set_flushing (self->dec_in_port, 5 * GST_SECOND, TRUE); gst_omx_port_set_flushing (self->dec_out_port, 5 * GST_SECOND, TRUE); @@ -2114,6 +2106,14 @@ gst_omx_video_dec_flush (GstVideoDecoder * decoder) } #endif + /* 2) Wait until the srcpad loop is stopped, + * unlock GST_VIDEO_DECODER_STREAM_LOCK to prevent deadlocks + * caused by using this lock from inside the loop function */ + GST_VIDEO_DECODER_STREAM_UNLOCK (self); + gst_pad_stop_task (GST_VIDEO_DECODER_SRC_PAD (decoder)); + GST_DEBUG_OBJECT (self, "Flushing -- task stopped"); + GST_VIDEO_DECODER_STREAM_LOCK (self); + /* 3) Resume components */ gst_omx_component_set_state (self->dec, OMX_StateExecuting); gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE); |