Commit ba3f947f authored by Guillaume Desmottes's avatar Guillaume Desmottes 🐐 Committed by Nicolas Dufresne

omx: wait for flush complete and buffers being released when flushing

When flusing we should wait for OMX to send the flush command complete event
AND all ports being released.
We were stopping as soon as one of those condition was met.

Fix a race between FillThisBufferDone/EmptyBufferDone and the flush
EventCmdComplete messages. The OMX implementation is supposed to release
its buffers before posting the EventCmdComplete event but the ordering
isn't guaranteed as the FillThisBufferDone/EmptyBufferDone and
EventHandler callbacks can be called from different threads (cf 2.7
'Thread Safety' in the spec).

Only wait for buffers currently used by OMX as some buffers may not be
in the pending queue because they are held downstream.
parent 2b7ad7f2
......@@ -1569,17 +1569,27 @@ done:
return err;
/* NOTE: Must be called while holding comp->lock */
static gboolean
should_wait_until_flushed (GstOMXPort * port)
if (port->flushed)
return FALSE;
if (!port->flushed)
/* Flush command hasn't been completed yet by OMX */
return TRUE;
if (port->buffers
&& port->buffers->len == g_queue_get_length (&port->pending_buffers))
return FALSE;
if (port->buffers) {
guint i;
return TRUE;
/* Wait for all the buffers used by OMX to be released */
for (i = 0; i < port->buffers->len; i++) {
GstOMXBuffer *buf = g_ptr_array_index (port->buffers, i);
if (buf->used)
return TRUE;
return FALSE;
/* NOTE: Uses comp->lock and comp->messages_lock */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment