(cmd == OMX_CommandPortEnable ? "enabled" : "disabled"));
g_mutex_lock (port->port_lock);
+ port->enabled_changed = TRUE;
g_cond_broadcast (port->port_cond);
g_mutex_unlock (port->port_lock);
if (! !port->port_def.bEnabled == ! !enabled)
goto done;
+ port->enabled_changed = FALSE;
+
if (enabled)
err =
OMX_SendCommand (comp->handle, OMX_CommandPortEnable, port->index,
timeval = &abstimeout;
GST_DEBUG_OBJECT (comp->parent, "Waiting for 5s");
- /* FIXME XXX: The spec says that bEnabled should be set *immediately*
- * but bellagio sets bEnabled after all buffers are allocated/deallocated
- */
-
/* First wait until all buffers are released by the port */
signalled = TRUE;
last_error = OMX_ErrorNone;
GST_ERROR_OBJECT (comp->parent,
"Got error while waiting for port %u to release all buffers: %d",
port->index, err);
+ goto done;
} else if (!signalled) {
GST_ERROR_OBJECT (comp->parent,
"Timeout waiting for port %u to release all buffers", port->index);
err = OMX_ErrorTimeout;
gst_omx_component_set_last_error (comp, err);
+ goto done;
}
/* Allocate/deallocate all buffers for the port to finish
OMX_GetParameter (comp->handle, OMX_IndexParamPortDefinition,
&port->port_def);
while (signalled && last_error == OMX_ErrorNone
- && (! !port->port_def.bEnabled != ! !enabled)) {
+ && (! !port->port_def.bEnabled != ! !enabled || !port->enabled_changed)) {
signalled = g_cond_timed_wait (port->port_cond, port->port_lock, timeval);
last_error = gst_omx_component_get_last_error (comp);
OMX_GetParameter (comp->handle, OMX_IndexParamPortDefinition,
&port->port_def);
}
+ port->enabled_changed = FALSE;
+
if (!signalled) {
GST_ERROR_OBJECT (comp->parent,
"Timeout waiting for port %u to be enabled/disabled", port->index);
guint32 index;
/* Protects port_def, buffers, pending_buffers,
- * settings_changed, flushing and flushed.
+ * settings_changed, flushing, flushed, enabled_changed.
*
* Signalled if pending_buffers gets a
* new buffer or flushing/flushed is set
gboolean settings_changed;
gboolean flushing;
gboolean flushed; /* TRUE after OMX_CommandFlush was done */
+ gboolean enabled_changed; /* TRUE after OMX_Command{En,Dis}able was done */
};
struct _GstOMXComponent {