mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-06 15:38:53 +00:00
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
This commit is contained in:
parent
7925355d72
commit
a1e613dd89
2 changed files with 15 additions and 15 deletions
|
@ -990,7 +990,12 @@ gst_omx_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard)
|
||||||
gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE);
|
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
|
* unlock GST_AUDIO_DECODER_STREAM_LOCK to prevent deadlocks
|
||||||
* caused by using this lock from inside the loop function */
|
* caused by using this lock from inside the loop function */
|
||||||
GST_AUDIO_DECODER_STREAM_UNLOCK (self);
|
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_DEBUG_OBJECT (self, "Flushing -- task stopped");
|
||||||
GST_AUDIO_DECODER_STREAM_LOCK (self);
|
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 */
|
/* 3) Resume components */
|
||||||
gst_omx_component_set_state (self->dec, OMX_StateExecuting);
|
gst_omx_component_set_state (self->dec, OMX_StateExecuting);
|
||||||
gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE);
|
gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE);
|
||||||
|
|
|
@ -2094,15 +2094,7 @@ gst_omx_video_dec_flush (GstVideoDecoder * decoder)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* 1) Wait until the srcpad loop is stopped,
|
/* 1) Flush the ports */
|
||||||
* 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 */
|
|
||||||
GST_DEBUG_OBJECT (self, "flushing 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_in_port, 5 * GST_SECOND, TRUE);
|
||||||
gst_omx_port_set_flushing (self->dec_out_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
|
#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 */
|
/* 3) Resume components */
|
||||||
gst_omx_component_set_state (self->dec, OMX_StateExecuting);
|
gst_omx_component_set_state (self->dec, OMX_StateExecuting);
|
||||||
gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE);
|
gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE);
|
||||||
|
|
Loading…
Reference in a new issue