omx*dec: Flush before we stop the srcpad loop
authorGraham Leggett <minfrin@sharp.fm>
Sun, 18 Dec 2016 19:46:55 +0000 (19:46 +0000)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 19 Dec 2016 08:52:16 +0000 (10:52 +0200)
Flushing could otherwise hang if output port queue of pending buffers was empty

https://bugzilla.gnome.org/show_bug.cgi?id=774654

omx/gstomxaudiodec.c
omx/gstomxvideodec.c

index 6e9d6df..8b8e121 100644 (file)
@@ -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);
index 1e7d436..0dc4871 100644 (file)
@@ -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);