Commit 0859ce7f authored by Martin Storsjö's avatar Martin Storsjö

omxil: Factorize event queue handling to a separate struct

Signed-off-by: default avatarMartin Storsjö <martin@martin.st>
parent 9cc68b95
...@@ -501,7 +501,7 @@ static OMX_ERRORTYPE DeinitialiseComponent(decoder_t *p_dec, ...@@ -501,7 +501,7 @@ static OMX_ERRORTYPE DeinitialiseComponent(decoder_t *p_dec,
CHECK_ERROR(omx_error, "OMX_CommandStateSet Idle failed (%x)", omx_error ); CHECK_ERROR(omx_error, "OMX_CommandStateSet Idle failed (%x)", omx_error );
while (1) { while (1) {
OMX_U32 cmd, state; OMX_U32 cmd, state;
omx_error = WaitForSpecificOmxEvent(p_dec, OMX_EventCmdComplete, &cmd, &state, 0); omx_error = WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, &cmd, &state, 0);
CHECK_ERROR(omx_error, "Wait for Idle failed (%x)", omx_error ); CHECK_ERROR(omx_error, "Wait for Idle failed (%x)", omx_error );
// The event queue can contain other OMX_EventCmdComplete items, // The event queue can contain other OMX_EventCmdComplete items,
// such as for OMX_CommandFlush // such as for OMX_CommandFlush
...@@ -552,7 +552,7 @@ static OMX_ERRORTYPE DeinitialiseComponent(decoder_t *p_dec, ...@@ -552,7 +552,7 @@ static OMX_ERRORTYPE DeinitialiseComponent(decoder_t *p_dec,
} }
} }
omx_error = WaitForSpecificOmxEvent(p_dec, OMX_EventCmdComplete, 0, 0, 0); omx_error = WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, 0, 0, 0);
CHECK_ERROR(omx_error, "Wait for Loaded failed (%x)", omx_error ); CHECK_ERROR(omx_error, "Wait for Loaded failed (%x)", omx_error );
} }
...@@ -704,7 +704,7 @@ static OMX_ERRORTYPE InitialiseComponent(decoder_t *p_dec, ...@@ -704,7 +704,7 @@ static OMX_ERRORTYPE InitialiseComponent(decoder_t *p_dec,
p_port->i_port_index, NULL); p_port->i_port_index, NULL);
CHECK_ERROR(omx_error, "OMX_CommandPortEnable on %i failed (%x)", CHECK_ERROR(omx_error, "OMX_CommandPortEnable on %i failed (%x)",
(int)p_port->i_port_index, omx_error ); (int)p_port->i_port_index, omx_error );
omx_error = WaitForSpecificOmxEvent(p_dec, OMX_EventCmdComplete, 0, 0, 0); omx_error = WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, 0, 0, 0);
CHECK_ERROR(omx_error, "Wait for PortEnable on %i failed (%x)", CHECK_ERROR(omx_error, "Wait for PortEnable on %i failed (%x)",
(int)p_port->i_port_index, omx_error ); (int)p_port->i_port_index, omx_error );
} }
...@@ -789,9 +789,7 @@ static int OpenGeneric( vlc_object_t *p_this, bool b_encode ) ...@@ -789,9 +789,7 @@ static int OpenGeneric( vlc_object_t *p_this, bool b_encode )
p_dec->fmt_out.i_codec = 0; p_dec->fmt_out.i_codec = 0;
} }
p_sys->b_enc = b_encode; p_sys->b_enc = b_encode;
p_sys->pp_last_event = &p_sys->p_events; InitOmxEventQueue(&p_sys->event_queue);
vlc_mutex_init (&p_sys->mutex);
vlc_cond_init (&p_sys->cond);
vlc_mutex_init (&p_sys->in.fifo.lock); vlc_mutex_init (&p_sys->in.fifo.lock);
vlc_cond_init (&p_sys->in.fifo.wait); vlc_cond_init (&p_sys->in.fifo.wait);
p_sys->in.fifo.offset = offsetof(OMX_BUFFERHEADERTYPE, pOutputPortPrivate) / sizeof(void *); p_sys->in.fifo.offset = offsetof(OMX_BUFFERHEADERTYPE, pOutputPortPrivate) / sizeof(void *);
...@@ -908,13 +906,13 @@ static int OpenGeneric( vlc_object_t *p_this, bool b_encode ) ...@@ -908,13 +906,13 @@ static int OpenGeneric( vlc_object_t *p_this, bool b_encode )
omx_error, (int)p_port->i_port_index, j ); omx_error, (int)p_port->i_port_index, j );
} }
omx_error = WaitForSpecificOmxEvent(p_dec, OMX_EventCmdComplete, 0, 0, 0); omx_error = WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, 0, 0, 0);
CHECK_ERROR(omx_error, "Wait for Idle failed (%x)", omx_error ); CHECK_ERROR(omx_error, "Wait for Idle failed (%x)", omx_error );
omx_error = OMX_SendCommand( p_sys->omx_handle, OMX_CommandStateSet, omx_error = OMX_SendCommand( p_sys->omx_handle, OMX_CommandStateSet,
OMX_StateExecuting, 0); OMX_StateExecuting, 0);
CHECK_ERROR(omx_error, "OMX_CommandStateSet Executing failed (%x)", omx_error ); CHECK_ERROR(omx_error, "OMX_CommandStateSet Executing failed (%x)", omx_error );
omx_error = WaitForSpecificOmxEvent(p_dec, OMX_EventCmdComplete, 0, 0, 0); omx_error = WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, 0, 0, 0);
CHECK_ERROR(omx_error, "Wait for Executing failed (%x)", omx_error ); CHECK_ERROR(omx_error, "Wait for Executing failed (%x)", omx_error );
/* Send codec configuration data */ /* Send codec configuration data */
...@@ -1053,7 +1051,7 @@ static OMX_ERRORTYPE PortReconfigure(decoder_t *p_dec, OmxPort *p_port) ...@@ -1053,7 +1051,7 @@ static OMX_ERRORTYPE PortReconfigure(decoder_t *p_dec, OmxPort *p_port)
CHECK_ERROR(omx_error, "OMX_FreeBuffer failed (%x, %i, %i)", CHECK_ERROR(omx_error, "OMX_FreeBuffer failed (%x, %i, %i)",
omx_error, (int)p_port->i_port_index, i ); omx_error, (int)p_port->i_port_index, i );
omx_error = WaitForSpecificOmxEvent(p_dec, OMX_EventCmdComplete, 0, 0, 0); omx_error = WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, 0, 0, 0);
CHECK_ERROR(omx_error, "Wait for PortDisable failed (%x)", omx_error ); CHECK_ERROR(omx_error, "Wait for PortDisable failed (%x)", omx_error );
/* Get the new port definition */ /* Get the new port definition */
...@@ -1114,7 +1112,7 @@ static OMX_ERRORTYPE PortReconfigure(decoder_t *p_dec, OmxPort *p_port) ...@@ -1114,7 +1112,7 @@ static OMX_ERRORTYPE PortReconfigure(decoder_t *p_dec, OmxPort *p_port)
CHECK_ERROR(omx_error, "OMX_UseBuffer failed (%x, %i, %i)", CHECK_ERROR(omx_error, "OMX_UseBuffer failed (%x, %i, %i)",
omx_error, (int)p_port->i_port_index, i ); omx_error, (int)p_port->i_port_index, i );
omx_error = WaitForSpecificOmxEvent(p_dec, OMX_EventCmdComplete, 0, 0, 0); omx_error = WaitForSpecificOmxEvent(&p_sys->event_queue, OMX_EventCmdComplete, 0, 0, 0);
CHECK_ERROR(omx_error, "Wait for PortEnable failed (%x)", omx_error ); CHECK_ERROR(omx_error, "Wait for PortEnable failed (%x)", omx_error );
PrintOmx(p_dec, p_sys->omx_handle, p_dec->p_sys->in.i_port_index); PrintOmx(p_dec, p_sys->omx_handle, p_dec->p_sys->in.i_port_index);
...@@ -1543,8 +1541,7 @@ static void CloseGeneric( vlc_object_t *p_this ) ...@@ -1543,8 +1541,7 @@ static void CloseGeneric( vlc_object_t *p_this )
DeinitOmxCore(); DeinitOmxCore();
vlc_mutex_destroy (&p_sys->mutex); DeinitOmxEventQueue(&p_sys->event_queue);
vlc_cond_destroy (&p_sys->cond);
vlc_mutex_destroy (&p_sys->in.fifo.lock); vlc_mutex_destroy (&p_sys->in.fifo.lock);
vlc_cond_destroy (&p_sys->in.fifo.wait); vlc_cond_destroy (&p_sys->in.fifo.wait);
vlc_mutex_destroy (&p_sys->out.fifo.lock); vlc_mutex_destroy (&p_sys->out.fifo.lock);
...@@ -1601,7 +1598,7 @@ static OMX_ERRORTYPE OmxEventHandler( OMX_HANDLETYPE omx_handle, ...@@ -1601,7 +1598,7 @@ static OMX_ERRORTYPE OmxEventHandler( OMX_HANDLETYPE omx_handle,
break; break;
} }
PostOmxEvent(p_dec, event, data_1, data_2, event_data); PostOmxEvent(&p_sys->event_queue, event, data_1, data_2, event_data);
return OMX_ErrorNone; return OMX_ErrorNone;
} }
......
...@@ -81,11 +81,7 @@ struct decoder_sys_t ...@@ -81,11 +81,7 @@ struct decoder_sys_t
char ppsz_components[MAX_COMPONENTS_LIST_SIZE][OMX_MAX_STRINGNAME_SIZE]; char ppsz_components[MAX_COMPONENTS_LIST_SIZE][OMX_MAX_STRINGNAME_SIZE];
unsigned int components; unsigned int components;
struct OmxEvent *p_events; OmxEventQueue event_queue;
struct OmxEvent **pp_last_event;
vlc_mutex_t mutex;
vlc_cond_t cond;
OmxPort *p_ports; OmxPort *p_ports;
unsigned int ports; unsigned int ports;
......
...@@ -151,11 +151,22 @@ typedef struct OmxEvent ...@@ -151,11 +151,22 @@ typedef struct OmxEvent
struct OmxEvent *next; struct OmxEvent *next;
} OmxEvent; } OmxEvent;
OMX_ERRORTYPE PostOmxEvent(decoder_t *p_dec, OMX_EVENTTYPE event, typedef struct OmxEventQueue
{
OmxEvent *p_events;
OmxEvent **pp_last_event;
vlc_mutex_t mutex;
vlc_cond_t cond;
} OmxEventQueue;
void InitOmxEventQueue(OmxEventQueue *queue);
void DeinitOmxEventQueue(OmxEventQueue *queue);
OMX_ERRORTYPE PostOmxEvent(OmxEventQueue *queue, OMX_EVENTTYPE event,
OMX_U32 data_1, OMX_U32 data_2, OMX_PTR event_data); OMX_U32 data_1, OMX_U32 data_2, OMX_PTR event_data);
OMX_ERRORTYPE WaitForOmxEvent(decoder_t *p_dec, OMX_EVENTTYPE *event, OMX_ERRORTYPE WaitForOmxEvent(OmxEventQueue *queue, OMX_EVENTTYPE *event,
OMX_U32 *data_1, OMX_U32 *data_2, OMX_PTR *event_data); OMX_U32 *data_1, OMX_U32 *data_2, OMX_PTR *event_data);
OMX_ERRORTYPE WaitForSpecificOmxEvent(decoder_t *p_dec, OMX_ERRORTYPE WaitForSpecificOmxEvent(OmxEventQueue *queue,
OMX_EVENTTYPE specific_event, OMX_U32 *data_1, OMX_U32 *data_2, OMX_EVENTTYPE specific_event, OMX_U32 *data_1, OMX_U32 *data_2,
OMX_PTR *event_data); OMX_PTR *event_data);
void PrintOmxEvent(vlc_object_t *p_this, OMX_EVENTTYPE event, OMX_U32 data_1, void PrintOmxEvent(vlc_object_t *p_this, OMX_EVENTTYPE event, OMX_U32 data_1,
......
...@@ -40,10 +40,22 @@ ...@@ -40,10 +40,22 @@
/***************************************************************************** /*****************************************************************************
* Events utility functions * Events utility functions
*****************************************************************************/ *****************************************************************************/
OMX_ERRORTYPE PostOmxEvent(decoder_t *p_dec, OMX_EVENTTYPE event, void InitOmxEventQueue(OmxEventQueue *queue)
{
queue->pp_last_event = &queue->p_events;
vlc_mutex_init(&queue->mutex);
vlc_cond_init(&queue->cond);
}
void DeinitOmxEventQueue(OmxEventQueue *queue)
{
vlc_mutex_destroy(&queue->mutex);
vlc_cond_destroy(&queue->cond);
}
OMX_ERRORTYPE PostOmxEvent(OmxEventQueue *queue, OMX_EVENTTYPE event,
OMX_U32 data_1, OMX_U32 data_2, OMX_PTR event_data) OMX_U32 data_1, OMX_U32 data_2, OMX_PTR event_data)
{ {
decoder_sys_t *p_sys = p_dec->p_sys;
OmxEvent *p_event; OmxEvent *p_event;
p_event = malloc(sizeof(OmxEvent)); p_event = malloc(sizeof(OmxEvent));
...@@ -55,33 +67,32 @@ OMX_ERRORTYPE PostOmxEvent(decoder_t *p_dec, OMX_EVENTTYPE event, ...@@ -55,33 +67,32 @@ OMX_ERRORTYPE PostOmxEvent(decoder_t *p_dec, OMX_EVENTTYPE event,
p_event->event_data = event_data; p_event->event_data = event_data;
p_event->next = 0; p_event->next = 0;
vlc_mutex_lock(&p_sys->mutex); vlc_mutex_lock(&queue->mutex);
*p_sys->pp_last_event = p_event; *queue->pp_last_event = p_event;
p_sys->pp_last_event = &p_event->next; queue->pp_last_event = &p_event->next;
vlc_cond_signal(&p_sys->cond); vlc_cond_signal(&queue->cond);
vlc_mutex_unlock(&p_sys->mutex); vlc_mutex_unlock(&queue->mutex);
return OMX_ErrorNone; return OMX_ErrorNone;
} }
OMX_ERRORTYPE WaitForOmxEvent(decoder_t *p_dec, OMX_EVENTTYPE *event, OMX_ERRORTYPE WaitForOmxEvent(OmxEventQueue *queue, OMX_EVENTTYPE *event,
OMX_U32 *data_1, OMX_U32 *data_2, OMX_PTR *event_data) OMX_U32 *data_1, OMX_U32 *data_2, OMX_PTR *event_data)
{ {
decoder_sys_t *p_sys = p_dec->p_sys;
OmxEvent *p_event; OmxEvent *p_event;
vlc_mutex_lock(&p_sys->mutex); vlc_mutex_lock(&queue->mutex);
if(!p_sys->p_events) if(!queue->p_events)
vlc_cond_timedwait(&p_sys->cond, &p_sys->mutex, mdate()+CLOCK_FREQ); vlc_cond_timedwait(&queue->cond, &queue->mutex, mdate()+CLOCK_FREQ);
p_event = p_sys->p_events; p_event = queue->p_events;
if(p_event) if(p_event)
{ {
p_sys->p_events = p_event->next; queue->p_events = p_event->next;
if(!p_sys->p_events) p_sys->pp_last_event = &p_sys->p_events; if(!queue->p_events) queue->pp_last_event = &queue->p_events;
} }
vlc_mutex_unlock(&p_sys->mutex); vlc_mutex_unlock(&queue->mutex);
if(p_event) if(p_event)
{ {
...@@ -96,7 +107,7 @@ OMX_ERRORTYPE WaitForOmxEvent(decoder_t *p_dec, OMX_EVENTTYPE *event, ...@@ -96,7 +107,7 @@ OMX_ERRORTYPE WaitForOmxEvent(decoder_t *p_dec, OMX_EVENTTYPE *event,
return OMX_ErrorTimeout; return OMX_ErrorTimeout;
} }
OMX_ERRORTYPE WaitForSpecificOmxEvent(decoder_t *p_dec, OMX_ERRORTYPE WaitForSpecificOmxEvent(OmxEventQueue *queue,
OMX_EVENTTYPE specific_event, OMX_U32 *data_1, OMX_U32 *data_2, OMX_EVENTTYPE specific_event, OMX_U32 *data_1, OMX_U32 *data_2,
OMX_PTR *event_data) OMX_PTR *event_data)
{ {
...@@ -106,7 +117,7 @@ OMX_ERRORTYPE WaitForSpecificOmxEvent(decoder_t *p_dec, ...@@ -106,7 +117,7 @@ OMX_ERRORTYPE WaitForSpecificOmxEvent(decoder_t *p_dec,
while(1) while(1)
{ {
status = WaitForOmxEvent(p_dec, &event, data_1, data_2, event_data); status = WaitForOmxEvent(queue, &event, data_1, data_2, event_data);
if(status != OMX_ErrorNone) return status; if(status != OMX_ErrorNone) return status;
if(event == specific_event) break; if(event == specific_event) break;
......
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