omx: Don't use port_def.bEnabled to check if the Enable/Disable command is finished

bEnabled should be set immediately after sending the command, it's only
Bellagio that waits until the command is finished before setting it.
This commit is contained in:
Sebastian Dröge 2011-07-06 10:40:13 +02:00
parent 11d2e806c2
commit 5d4f7890c2
2 changed files with 10 additions and 6 deletions

View file

@ -206,6 +206,7 @@ EventHandler (OMX_HANDLETYPE hComponent, OMX_PTR pAppData, OMX_EVENTTYPE eEvent,
(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);
@ -1103,6 +1104,8 @@ gst_omx_port_set_enabled_unlocked (GstOMXPort * port, gboolean enabled)
if (! !port->port_def.bEnabled == ! !enabled)
goto done;
port->enabled_changed = FALSE;
if (enabled)
err =
OMX_SendCommand (comp->handle, OMX_CommandPortEnable, port->index,
@ -1125,10 +1128,6 @@ gst_omx_port_set_enabled_unlocked (GstOMXPort * port, gboolean enabled)
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;
@ -1144,11 +1143,13 @@ gst_omx_port_set_enabled_unlocked (GstOMXPort * port, gboolean enabled)
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
@ -1174,13 +1175,15 @@ gst_omx_port_set_enabled_unlocked (GstOMXPort * port, gboolean enabled)
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);

View file

@ -57,7 +57,7 @@ struct _GstOMXPort {
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
@ -80,6 +80,7 @@ struct _GstOMXPort {
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 {