mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
omx: Clean up port settings change handling
This commit is contained in:
parent
26b69d99a2
commit
b12610efd7
5 changed files with 284 additions and 209 deletions
145
omx/gstomx.c
145
omx/gstomx.c
|
@ -876,7 +876,6 @@ gst_omx_component_add_port (GstOMXComponent * comp, guint32 index)
|
||||||
g_queue_init (&port->pending_buffers);
|
g_queue_init (&port->pending_buffers);
|
||||||
port->flushing = TRUE;
|
port->flushing = TRUE;
|
||||||
port->flushed = FALSE;
|
port->flushed = FALSE;
|
||||||
port->settings_changed = FALSE;
|
|
||||||
port->enabled_pending = FALSE;
|
port->enabled_pending = FALSE;
|
||||||
port->disabled_pending = FALSE;
|
port->disabled_pending = FALSE;
|
||||||
|
|
||||||
|
@ -905,27 +904,6 @@ gst_omx_component_get_port (GstOMXComponent * comp, guint32 index)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
gst_omx_component_trigger_settings_changed (GstOMXComponent * comp,
|
|
||||||
guint32 port_index)
|
|
||||||
{
|
|
||||||
g_return_if_fail (comp != NULL);
|
|
||||||
|
|
||||||
/* Reverse hacks */
|
|
||||||
if (port_index == 1
|
|
||||||
&& (comp->hacks & GST_OMX_HACK_EVENT_PORT_SETTINGS_CHANGED_PORT_0_TO_1))
|
|
||||||
port_index = 0;
|
|
||||||
|
|
||||||
if (!(comp->hacks &
|
|
||||||
GST_OMX_HACK_EVENT_PORT_SETTINGS_CHANGED_NDATA_PARAMETER_SWAP)) {
|
|
||||||
EventHandler (comp->handle, comp, OMX_EventPortSettingsChanged, port_index,
|
|
||||||
0, NULL);
|
|
||||||
} else {
|
|
||||||
EventHandler (comp->handle, comp, OMX_EventPortSettingsChanged, 0,
|
|
||||||
port_index, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTE: Uses comp->lock and comp->messages_lock */
|
/* NOTE: Uses comp->lock and comp->messages_lock */
|
||||||
void
|
void
|
||||||
gst_omx_component_set_last_error (GstOMXComponent * comp, OMX_ERRORTYPE err)
|
gst_omx_component_set_last_error (GstOMXComponent * comp, OMX_ERRORTYPE err)
|
||||||
|
@ -1252,7 +1230,6 @@ retry:
|
||||||
* the caller about it */
|
* the caller about it */
|
||||||
if (port->settings_cookie != port->configured_settings_cookie) {
|
if (port->settings_cookie != port->configured_settings_cookie) {
|
||||||
ret = GST_OMX_ACQUIRE_BUFFER_RECONFIGURE;
|
ret = GST_OMX_ACQUIRE_BUFFER_RECONFIGURE;
|
||||||
port->settings_changed = TRUE;
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1275,15 +1252,6 @@ retry:
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = GST_OMX_ACQUIRE_BUFFER_RECONFIGURE;
|
ret = GST_OMX_ACQUIRE_BUFFER_RECONFIGURE;
|
||||||
port->settings_changed = TRUE;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (port->settings_changed) {
|
|
||||||
GST_DEBUG_OBJECT (comp->parent,
|
|
||||||
"Port %u has settings changed, need new caps", port->index);
|
|
||||||
ret = GST_OMX_ACQUIRE_BUFFER_RECONFIGURED;
|
|
||||||
port->settings_changed = FALSE;
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2207,7 +2175,7 @@ gst_omx_port_is_enabled (GstOMXPort * port)
|
||||||
|
|
||||||
/* NOTE: Uses comp->lock and comp->messages_lock */
|
/* NOTE: Uses comp->lock and comp->messages_lock */
|
||||||
OMX_ERRORTYPE
|
OMX_ERRORTYPE
|
||||||
gst_omx_port_reconfigure (GstOMXPort * port)
|
gst_omx_port_mark_reconfigured (GstOMXPort * port)
|
||||||
{
|
{
|
||||||
GstOMXComponent *comp;
|
GstOMXComponent *comp;
|
||||||
OMX_ERRORTYPE err = OMX_ErrorNone;
|
OMX_ERRORTYPE err = OMX_ErrorNone;
|
||||||
|
@ -2217,57 +2185,16 @@ gst_omx_port_reconfigure (GstOMXPort * port)
|
||||||
comp = port->comp;
|
comp = port->comp;
|
||||||
|
|
||||||
g_mutex_lock (&comp->lock);
|
g_mutex_lock (&comp->lock);
|
||||||
GST_DEBUG_OBJECT (comp->parent, "Reconfiguring port %u", port->index);
|
GST_DEBUG_OBJECT (comp->parent, "Marking port %u is reconfigured",
|
||||||
|
port->index);
|
||||||
|
|
||||||
gst_omx_component_handle_messages (comp);
|
gst_omx_component_handle_messages (comp);
|
||||||
|
|
||||||
if (!port->settings_changed)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
if ((err = comp->last_error) != OMX_ErrorNone)
|
if ((err = comp->last_error) != OMX_ErrorNone)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* Disable and enable the port. This already takes
|
|
||||||
* care of deallocating and allocating buffers.
|
|
||||||
*/
|
|
||||||
err = gst_omx_port_set_enabled_unlocked (port, FALSE);
|
|
||||||
if (err != OMX_ErrorNone)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
err = gst_omx_port_wait_buffers_released_unlocked (port, 5 * GST_SECOND);
|
|
||||||
if (err != OMX_ErrorNone)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
if (!port->tunneled) {
|
|
||||||
err = gst_omx_port_deallocate_buffers_unlocked (port);
|
|
||||||
if (err != OMX_ErrorNone)
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = gst_omx_port_wait_enabled_unlocked (port, 1 * GST_SECOND);
|
|
||||||
if (err != OMX_ErrorNone)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
err = gst_omx_port_set_enabled_unlocked (port, TRUE);
|
|
||||||
if (err != OMX_ErrorNone)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
if (!port->tunneled) {
|
|
||||||
err = gst_omx_port_allocate_buffers_unlocked (port);
|
|
||||||
if (err != OMX_ErrorNone)
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = gst_omx_port_wait_enabled_unlocked (port, 5 * GST_SECOND);
|
|
||||||
if (err != OMX_ErrorNone)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
port->configured_settings_cookie = port->settings_cookie;
|
port->configured_settings_cookie = port->settings_cookie;
|
||||||
|
|
||||||
/* If this is an output port, notify all input ports
|
|
||||||
* that might wait for us to reconfigure in
|
|
||||||
* acquire_buffer()
|
|
||||||
*/
|
|
||||||
if (port->port_def.eDir == OMX_DirOutput) {
|
if (port->port_def.eDir == OMX_DirOutput) {
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
|
@ -2285,71 +2212,7 @@ gst_omx_port_reconfigure (GstOMXPort * port)
|
||||||
done:
|
done:
|
||||||
gst_omx_port_update_port_definition (port, NULL);
|
gst_omx_port_update_port_definition (port, NULL);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (comp->parent, "Reconfigured port %u: %s (0x%08x)",
|
GST_DEBUG_OBJECT (comp->parent, "Marked port %u as reconfigured: %s (0x%08x)",
|
||||||
port->index, gst_omx_error_to_string (err), err);
|
|
||||||
|
|
||||||
g_mutex_unlock (&comp->lock);
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTE: Uses comp->lock and comp->messages_lock */
|
|
||||||
OMX_ERRORTYPE
|
|
||||||
gst_omx_port_manual_reconfigure (GstOMXPort * port, gboolean start)
|
|
||||||
{
|
|
||||||
GstOMXComponent *comp;
|
|
||||||
OMX_ERRORTYPE err = OMX_ErrorNone;
|
|
||||||
|
|
||||||
g_return_val_if_fail (port != NULL, OMX_ErrorUndefined);
|
|
||||||
|
|
||||||
comp = port->comp;
|
|
||||||
|
|
||||||
g_mutex_lock (&comp->lock);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (comp->parent, "Manual reconfigure of port %u %s",
|
|
||||||
port->index, (start ? "start" : "stsop"));
|
|
||||||
|
|
||||||
gst_omx_component_handle_messages (comp);
|
|
||||||
|
|
||||||
if ((err = comp->last_error) != OMX_ErrorNone)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
if (start)
|
|
||||||
port->settings_cookie++;
|
|
||||||
else
|
|
||||||
port->configured_settings_cookie = port->settings_cookie;
|
|
||||||
|
|
||||||
if (port->port_def.eDir == OMX_DirOutput) {
|
|
||||||
GList *l;
|
|
||||||
|
|
||||||
if (start) {
|
|
||||||
for (l = comp->pending_reconfigure_outports; l; l = l->next) {
|
|
||||||
if (l->data == (gpointer) port)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!l) {
|
|
||||||
comp->pending_reconfigure_outports =
|
|
||||||
g_list_prepend (comp->pending_reconfigure_outports, port);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (l = comp->pending_reconfigure_outports; l; l = l->next) {
|
|
||||||
if (l->data == (gpointer) port) {
|
|
||||||
comp->pending_reconfigure_outports =
|
|
||||||
g_list_delete_link (comp->pending_reconfigure_outports, l);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!comp->pending_reconfigure_outports)
|
|
||||||
gst_omx_component_send_message (comp, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
done:
|
|
||||||
gst_omx_port_update_port_definition (port, NULL);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (comp->parent, "Manual reconfigure of port %u: %s (0x%08x)",
|
|
||||||
port->index, gst_omx_error_to_string (err), err);
|
port->index, gst_omx_error_to_string (err), err);
|
||||||
|
|
||||||
g_mutex_unlock (&comp->lock);
|
g_mutex_unlock (&comp->lock);
|
||||||
|
|
10
omx/gstomx.h
10
omx/gstomx.h
|
@ -119,9 +119,6 @@ typedef enum {
|
||||||
GST_OMX_ACQUIRE_BUFFER_FLUSHING,
|
GST_OMX_ACQUIRE_BUFFER_FLUSHING,
|
||||||
/* The port must be reconfigured */
|
/* The port must be reconfigured */
|
||||||
GST_OMX_ACQUIRE_BUFFER_RECONFIGURE,
|
GST_OMX_ACQUIRE_BUFFER_RECONFIGURE,
|
||||||
/* The port was reconfigured and the caps might have changed
|
|
||||||
* NOTE: This is only returned a single time! */
|
|
||||||
GST_OMX_ACQUIRE_BUFFER_RECONFIGURED,
|
|
||||||
/* A fatal error happened */
|
/* A fatal error happened */
|
||||||
GST_OMX_ACQUIRE_BUFFER_ERROR
|
GST_OMX_ACQUIRE_BUFFER_ERROR
|
||||||
} GstOMXAcquireBufferReturn;
|
} GstOMXAcquireBufferReturn;
|
||||||
|
@ -191,8 +188,6 @@ struct _GstOMXPort {
|
||||||
OMX_PARAM_PORTDEFINITIONTYPE port_def;
|
OMX_PARAM_PORTDEFINITIONTYPE port_def;
|
||||||
GPtrArray *buffers; /* Contains GstOMXBuffer* */
|
GPtrArray *buffers; /* Contains GstOMXBuffer* */
|
||||||
GQueue pending_buffers; /* Contains GstOMXBuffer* */
|
GQueue pending_buffers; /* Contains GstOMXBuffer* */
|
||||||
/* If TRUE we need to get the new caps of this port */
|
|
||||||
gboolean settings_changed;
|
|
||||||
gboolean flushing;
|
gboolean flushing;
|
||||||
gboolean flushed; /* TRUE after OMX_CommandFlush was done */
|
gboolean flushed; /* TRUE after OMX_CommandFlush was done */
|
||||||
gboolean enabled_pending; /* TRUE after OMX_Command{En,Dis}able */
|
gboolean enabled_pending; /* TRUE after OMX_Command{En,Dis}able */
|
||||||
|
@ -284,8 +279,6 @@ const gchar * gst_omx_component_get_last_error_string (GstOMXComponent * com
|
||||||
GstOMXPort * gst_omx_component_add_port (GstOMXComponent * comp, guint32 index);
|
GstOMXPort * gst_omx_component_add_port (GstOMXComponent * comp, guint32 index);
|
||||||
GstOMXPort * gst_omx_component_get_port (GstOMXComponent * comp, guint32 index);
|
GstOMXPort * gst_omx_component_get_port (GstOMXComponent * comp, guint32 index);
|
||||||
|
|
||||||
void gst_omx_component_trigger_settings_changed (GstOMXComponent * comp, guint32 port_index);
|
|
||||||
|
|
||||||
OMX_ERRORTYPE gst_omx_component_get_parameter (GstOMXComponent * comp, OMX_INDEXTYPE index, gpointer param);
|
OMX_ERRORTYPE gst_omx_component_get_parameter (GstOMXComponent * comp, OMX_INDEXTYPE index, gpointer param);
|
||||||
OMX_ERRORTYPE gst_omx_component_set_parameter (GstOMXComponent * comp, OMX_INDEXTYPE index, gpointer param);
|
OMX_ERRORTYPE gst_omx_component_set_parameter (GstOMXComponent * comp, OMX_INDEXTYPE index, gpointer param);
|
||||||
|
|
||||||
|
@ -308,13 +301,12 @@ OMX_ERRORTYPE gst_omx_port_allocate_buffers (GstOMXPort *port);
|
||||||
OMX_ERRORTYPE gst_omx_port_deallocate_buffers (GstOMXPort *port);
|
OMX_ERRORTYPE gst_omx_port_deallocate_buffers (GstOMXPort *port);
|
||||||
OMX_ERRORTYPE gst_omx_port_wait_buffers_released (GstOMXPort * port, GstClockTime timeout);
|
OMX_ERRORTYPE gst_omx_port_wait_buffers_released (GstOMXPort * port, GstClockTime timeout);
|
||||||
|
|
||||||
OMX_ERRORTYPE gst_omx_port_reconfigure (GstOMXPort * port);
|
OMX_ERRORTYPE gst_omx_port_mark_reconfigured (GstOMXPort * port);
|
||||||
|
|
||||||
OMX_ERRORTYPE gst_omx_port_set_enabled (GstOMXPort * port, gboolean enabled);
|
OMX_ERRORTYPE gst_omx_port_set_enabled (GstOMXPort * port, gboolean enabled);
|
||||||
OMX_ERRORTYPE gst_omx_port_wait_enabled (GstOMXPort * port, GstClockTime timeout);
|
OMX_ERRORTYPE gst_omx_port_wait_enabled (GstOMXPort * port, GstClockTime timeout);
|
||||||
gboolean gst_omx_port_is_enabled (GstOMXPort * port);
|
gboolean gst_omx_port_is_enabled (GstOMXPort * port);
|
||||||
|
|
||||||
OMX_ERRORTYPE gst_omx_port_manual_reconfigure (GstOMXPort * port, gboolean start);
|
|
||||||
|
|
||||||
void gst_omx_set_default_role (GstOMXClassData *class_data, const gchar *default_role);
|
void gst_omx_set_default_role (GstOMXClassData *class_data, const gchar *default_role);
|
||||||
|
|
||||||
|
|
|
@ -296,15 +296,47 @@ gst_omx_audio_enc_loop (GstOMXAudioEnc * self)
|
||||||
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_FLUSHING) {
|
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_FLUSHING) {
|
||||||
goto flushing;
|
goto flushing;
|
||||||
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
if (gst_omx_port_reconfigure (self->enc_out_port) != OMX_ErrorNone)
|
OMX_ERRORTYPE err;
|
||||||
|
|
||||||
|
/* Reallocate all buffers */
|
||||||
|
err = gst_omx_port_set_enabled (port, FALSE);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
goto reconfigure_error;
|
goto reconfigure_error;
|
||||||
/* And restart the loop */
|
|
||||||
return;
|
err = gst_omx_port_wait_buffers_released (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_deallocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 1 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_set_enabled (port, TRUE);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_allocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_mark_reconfigured (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
/* Update caps below */
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
if (!gst_pad_has_current_caps (GST_AUDIO_ENCODER_SRC_PAD (self))
|
if (!gst_pad_has_current_caps (GST_AUDIO_ENCODER_SRC_PAD (self))
|
||||||
|| acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURED) {
|
|| acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
GstAudioInfo *info =
|
GstAudioInfo *info =
|
||||||
gst_audio_encoder_get_audio_info (GST_AUDIO_ENCODER (self));
|
gst_audio_encoder_get_audio_info (GST_AUDIO_ENCODER (self));
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
@ -599,9 +631,6 @@ gst_omx_audio_enc_set_format (GstAudioEncoder * encoder, GstAudioInfo * info)
|
||||||
GST_DEBUG_OBJECT (self, "Need to disable and drain encoder");
|
GST_DEBUG_OBJECT (self, "Need to disable and drain encoder");
|
||||||
gst_omx_audio_enc_drain (self);
|
gst_omx_audio_enc_drain (self);
|
||||||
|
|
||||||
if (gst_omx_port_manual_reconfigure (self->enc_in_port,
|
|
||||||
TRUE) != OMX_ErrorNone)
|
|
||||||
return FALSE;
|
|
||||||
if (gst_omx_port_set_enabled (self->enc_in_port, FALSE) != OMX_ErrorNone)
|
if (gst_omx_port_set_enabled (self->enc_in_port, FALSE) != OMX_ErrorNone)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (gst_omx_port_wait_buffers_released (self->enc_in_port,
|
if (gst_omx_port_wait_buffers_released (self->enc_in_port,
|
||||||
|
@ -704,8 +733,7 @@ gst_omx_audio_enc_set_format (GstAudioEncoder * encoder, GstAudioInfo * info)
|
||||||
if (gst_omx_port_wait_enabled (self->enc_in_port,
|
if (gst_omx_port_wait_enabled (self->enc_in_port,
|
||||||
5 * GST_SECOND) != OMX_ErrorNone)
|
5 * GST_SECOND) != OMX_ErrorNone)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (gst_omx_port_manual_reconfigure (self->enc_in_port,
|
if (gst_omx_port_mark_reconfigured (self->enc_in_port) != OMX_ErrorNone)
|
||||||
FALSE) != OMX_ErrorNone)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
if (gst_omx_component_set_state (self->enc, OMX_StateIdle) != OMX_ErrorNone)
|
if (gst_omx_component_set_state (self->enc, OMX_StateIdle) != OMX_ErrorNone)
|
||||||
|
@ -786,6 +814,7 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
|
||||||
{
|
{
|
||||||
GstOMXAcquireBufferReturn acq_ret = GST_OMX_ACQUIRE_BUFFER_ERROR;
|
GstOMXAcquireBufferReturn acq_ret = GST_OMX_ACQUIRE_BUFFER_ERROR;
|
||||||
GstOMXAudioEnc *self;
|
GstOMXAudioEnc *self;
|
||||||
|
GstOMXPort *port;
|
||||||
GstOMXBuffer *buf;
|
GstOMXBuffer *buf;
|
||||||
gsize size;
|
gsize size;
|
||||||
guint offset = 0;
|
guint offset = 0;
|
||||||
|
@ -810,13 +839,15 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
|
||||||
timestamp = GST_BUFFER_TIMESTAMP (inbuf);
|
timestamp = GST_BUFFER_TIMESTAMP (inbuf);
|
||||||
duration = GST_BUFFER_DURATION (inbuf);
|
duration = GST_BUFFER_DURATION (inbuf);
|
||||||
|
|
||||||
|
port = self->enc_in_port;
|
||||||
|
|
||||||
size = gst_buffer_get_size (inbuf);
|
size = gst_buffer_get_size (inbuf);
|
||||||
while (offset < size) {
|
while (offset < size) {
|
||||||
/* Make sure to release the base class stream lock, otherwise
|
/* Make sure to release the base class stream lock, otherwise
|
||||||
* _loop() can't call _finish_frame() and we might block forever
|
* _loop() can't call _finish_frame() and we might block forever
|
||||||
* because no input buffers are released */
|
* because no input buffers are released */
|
||||||
GST_AUDIO_ENCODER_STREAM_UNLOCK (self);
|
GST_AUDIO_ENCODER_STREAM_UNLOCK (self);
|
||||||
acq_ret = gst_omx_port_acquire_buffer (self->enc_in_port, &buf);
|
acq_ret = gst_omx_port_acquire_buffer (port, &buf);
|
||||||
|
|
||||||
if (acq_ret == GST_OMX_ACQUIRE_BUFFER_ERROR) {
|
if (acq_ret == GST_OMX_ACQUIRE_BUFFER_ERROR) {
|
||||||
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
@ -825,29 +856,72 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
|
||||||
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
goto flushing;
|
goto flushing;
|
||||||
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
if (gst_omx_port_reconfigure (self->enc_in_port) != OMX_ErrorNone) {
|
OMX_ERRORTYPE err;
|
||||||
|
|
||||||
|
/* Reallocate all buffers */
|
||||||
|
err = gst_omx_port_set_enabled (port, FALSE);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
goto reconfigure_error;
|
goto reconfigure_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_buffers_released (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_deallocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 1 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_set_enabled (port, TRUE);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_allocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_mark_reconfigured (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
/* Now get a new buffer and fill it */
|
/* Now get a new buffer and fill it */
|
||||||
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
continue;
|
continue;
|
||||||
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURED) {
|
|
||||||
/* TODO: Anything to do here? Don't think so */
|
|
||||||
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
||||||
|
|
||||||
g_assert (acq_ret == GST_OMX_ACQUIRE_BUFFER_OK && buf != NULL);
|
g_assert (acq_ret == GST_OMX_ACQUIRE_BUFFER_OK && buf != NULL);
|
||||||
|
|
||||||
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
||||||
gst_omx_port_release_buffer (self->enc_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
return self->downstream_flow_ret;
|
return self->downstream_flow_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf->omx_buf->nAllocLen - buf->omx_buf->nOffset <= 0) {
|
if (buf->omx_buf->nAllocLen - buf->omx_buf->nOffset <= 0) {
|
||||||
gst_omx_port_release_buffer (self->enc_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
goto full_buffer;
|
goto full_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -881,7 +955,7 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
|
||||||
|
|
||||||
offset += buf->omx_buf->nFilledLen;
|
offset += buf->omx_buf->nFilledLen;
|
||||||
self->started = TRUE;
|
self->started = TRUE;
|
||||||
gst_omx_port_release_buffer (self->enc_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Passed frame to component");
|
GST_DEBUG_OBJECT (self, "Passed frame to component");
|
||||||
|
|
|
@ -565,15 +565,47 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
|
||||||
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_FLUSHING) {
|
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_FLUSHING) {
|
||||||
goto flushing;
|
goto flushing;
|
||||||
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
if (gst_omx_port_reconfigure (self->dec_out_port) != OMX_ErrorNone)
|
OMX_ERRORTYPE err;
|
||||||
|
|
||||||
|
/* Reallocate all buffers */
|
||||||
|
err = gst_omx_port_set_enabled (port, FALSE);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
goto reconfigure_error;
|
goto reconfigure_error;
|
||||||
/* And restart the loop */
|
|
||||||
return;
|
err = gst_omx_port_wait_buffers_released (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_deallocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 1 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_set_enabled (port, TRUE);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_allocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_mark_reconfigured (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
/* Update caps below */
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
if (!gst_pad_has_current_caps (GST_VIDEO_DECODER_SRC_PAD (self))
|
if (!gst_pad_has_current_caps (GST_VIDEO_DECODER_SRC_PAD (self))
|
||||||
|| acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURED) {
|
|| acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
GstVideoCodecState *state;
|
GstVideoCodecState *state;
|
||||||
OMX_PARAM_PORTDEFINITIONTYPE port_def;
|
OMX_PARAM_PORTDEFINITIONTYPE port_def;
|
||||||
GstVideoFormat format;
|
GstVideoFormat format;
|
||||||
|
@ -1109,10 +1141,6 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
needs_disable = FALSE;
|
needs_disable = FALSE;
|
||||||
} else {
|
} else {
|
||||||
if (gst_omx_port_manual_reconfigure (self->dec_in_port,
|
|
||||||
TRUE) != OMX_ErrorNone)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (gst_omx_port_set_enabled (self->dec_in_port, FALSE) != OMX_ErrorNone)
|
if (gst_omx_port_set_enabled (self->dec_in_port, FALSE) != OMX_ErrorNone)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (gst_omx_port_wait_buffers_released (self->dec_in_port,
|
if (gst_omx_port_wait_buffers_released (self->dec_in_port,
|
||||||
|
@ -1171,8 +1199,7 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
|
||||||
if (gst_omx_port_wait_enabled (self->dec_in_port,
|
if (gst_omx_port_wait_enabled (self->dec_in_port,
|
||||||
5 * GST_SECOND) != OMX_ErrorNone)
|
5 * GST_SECOND) != OMX_ErrorNone)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (gst_omx_port_manual_reconfigure (self->dec_in_port,
|
if (gst_omx_port_mark_reconfigured (self->dec_in_port) != OMX_ErrorNone)
|
||||||
FALSE) != OMX_ErrorNone)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
if (gst_omx_component_set_state (self->dec, OMX_StateIdle) != OMX_ErrorNone)
|
if (gst_omx_component_set_state (self->dec, OMX_StateIdle) != OMX_ErrorNone)
|
||||||
|
@ -1262,6 +1289,7 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
GstOMXAcquireBufferReturn acq_ret = GST_OMX_ACQUIRE_BUFFER_ERROR;
|
GstOMXAcquireBufferReturn acq_ret = GST_OMX_ACQUIRE_BUFFER_ERROR;
|
||||||
GstOMXVideoDec *self;
|
GstOMXVideoDec *self;
|
||||||
GstOMXVideoDecClass *klass;
|
GstOMXVideoDecClass *klass;
|
||||||
|
GstOMXPort *port;
|
||||||
GstOMXBuffer *buf;
|
GstOMXBuffer *buf;
|
||||||
GstBuffer *codec_data = NULL;
|
GstBuffer *codec_data = NULL;
|
||||||
guint offset = 0, size;
|
guint offset = 0, size;
|
||||||
|
@ -1298,13 +1326,15 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
port = self->dec_in_port;
|
||||||
|
|
||||||
size = gst_buffer_get_size (frame->input_buffer);
|
size = gst_buffer_get_size (frame->input_buffer);
|
||||||
while (offset < size) {
|
while (offset < size) {
|
||||||
/* Make sure to release the base class stream lock, otherwise
|
/* Make sure to release the base class stream lock, otherwise
|
||||||
* _loop() can't call _finish_frame() and we might block forever
|
* _loop() can't call _finish_frame() and we might block forever
|
||||||
* because no input buffers are released */
|
* because no input buffers are released */
|
||||||
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|
||||||
acq_ret = gst_omx_port_acquire_buffer (self->dec_in_port, &buf);
|
acq_ret = gst_omx_port_acquire_buffer (port, &buf);
|
||||||
|
|
||||||
if (acq_ret == GST_OMX_ACQUIRE_BUFFER_ERROR) {
|
if (acq_ret == GST_OMX_ACQUIRE_BUFFER_ERROR) {
|
||||||
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
@ -1313,7 +1343,53 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
goto flushing;
|
goto flushing;
|
||||||
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
if (gst_omx_port_reconfigure (self->dec_in_port) != OMX_ErrorNone) {
|
OMX_ERRORTYPE err;
|
||||||
|
|
||||||
|
/* Reallocate all buffers */
|
||||||
|
err = gst_omx_port_set_enabled (port, FALSE);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_buffers_released (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_deallocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 1 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_set_enabled (port, TRUE);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_allocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_mark_reconfigured (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
goto reconfigure_error;
|
goto reconfigure_error;
|
||||||
}
|
}
|
||||||
|
@ -1321,22 +1397,18 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
/* Now get a new buffer and fill it */
|
/* Now get a new buffer and fill it */
|
||||||
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
continue;
|
continue;
|
||||||
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURED) {
|
|
||||||
/* TODO: Anything to do here? Don't think so */
|
|
||||||
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
|
||||||
g_assert (acq_ret == GST_OMX_ACQUIRE_BUFFER_OK && buf != NULL);
|
g_assert (acq_ret == GST_OMX_ACQUIRE_BUFFER_OK && buf != NULL);
|
||||||
|
|
||||||
if (buf->omx_buf->nAllocLen - buf->omx_buf->nOffset <= 0) {
|
if (buf->omx_buf->nAllocLen - buf->omx_buf->nOffset <= 0) {
|
||||||
gst_omx_port_release_buffer (self->dec_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
goto full_buffer;
|
goto full_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
||||||
gst_omx_port_release_buffer (self->dec_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
goto flow_error;
|
goto flow_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1347,7 +1419,7 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
|
|
||||||
if (buf->omx_buf->nAllocLen - buf->omx_buf->nOffset <
|
if (buf->omx_buf->nAllocLen - buf->omx_buf->nOffset <
|
||||||
gst_buffer_get_size (codec_data)) {
|
gst_buffer_get_size (codec_data)) {
|
||||||
gst_omx_port_release_buffer (self->dec_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
goto too_large_codec_data;
|
goto too_large_codec_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1358,7 +1430,7 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
buf->omx_buf->nFilledLen);
|
buf->omx_buf->nFilledLen);
|
||||||
|
|
||||||
self->started = TRUE;
|
self->started = TRUE;
|
||||||
gst_omx_port_release_buffer (self->dec_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
gst_buffer_replace (&self->codec_data, NULL);
|
gst_buffer_replace (&self->codec_data, NULL);
|
||||||
/* Acquire new buffer for the actual frame */
|
/* Acquire new buffer for the actual frame */
|
||||||
continue;
|
continue;
|
||||||
|
@ -1412,7 +1484,7 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
|
|
||||||
offset += buf->omx_buf->nFilledLen;
|
offset += buf->omx_buf->nFilledLen;
|
||||||
self->started = TRUE;
|
self->started = TRUE;
|
||||||
gst_omx_port_release_buffer (self->dec_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_video_codec_frame_unref (frame);
|
gst_video_codec_frame_unref (frame);
|
||||||
|
|
|
@ -747,15 +747,47 @@ gst_omx_video_enc_loop (GstOMXVideoEnc * self)
|
||||||
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_FLUSHING) {
|
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_FLUSHING) {
|
||||||
goto flushing;
|
goto flushing;
|
||||||
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
} else if (acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
if (gst_omx_port_reconfigure (self->enc_out_port) != OMX_ErrorNone)
|
OMX_ERRORTYPE err;
|
||||||
|
|
||||||
|
/* Reallocate all buffers */
|
||||||
|
err = gst_omx_port_set_enabled (port, FALSE);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
goto reconfigure_error;
|
goto reconfigure_error;
|
||||||
/* And restart the loop */
|
|
||||||
return;
|
err = gst_omx_port_wait_buffers_released (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_deallocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 1 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_set_enabled (port, TRUE);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_allocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
err = gst_omx_port_mark_reconfigured (port);
|
||||||
|
if (err != OMX_ErrorNone)
|
||||||
|
goto reconfigure_error;
|
||||||
|
|
||||||
|
/* Update caps below */
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
if (!gst_pad_has_current_caps (GST_VIDEO_ENCODER_SRC_PAD (self))
|
if (!gst_pad_has_current_caps (GST_VIDEO_ENCODER_SRC_PAD (self))
|
||||||
|| acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURED) {
|
|| acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GstVideoCodecState *state;
|
GstVideoCodecState *state;
|
||||||
|
|
||||||
|
@ -1068,9 +1100,6 @@ gst_omx_video_enc_set_format (GstVideoEncoder * encoder,
|
||||||
GST_DEBUG_OBJECT (self, "Need to disable and drain encoder");
|
GST_DEBUG_OBJECT (self, "Need to disable and drain encoder");
|
||||||
gst_omx_video_enc_drain (self, FALSE);
|
gst_omx_video_enc_drain (self, FALSE);
|
||||||
|
|
||||||
if (gst_omx_port_manual_reconfigure (self->enc_in_port,
|
|
||||||
TRUE) != OMX_ErrorNone)
|
|
||||||
return FALSE;
|
|
||||||
if (gst_omx_port_set_enabled (self->enc_in_port, FALSE) != OMX_ErrorNone)
|
if (gst_omx_port_set_enabled (self->enc_in_port, FALSE) != OMX_ErrorNone)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (gst_omx_port_wait_buffers_released (self->enc_in_port,
|
if (gst_omx_port_wait_buffers_released (self->enc_in_port,
|
||||||
|
@ -1178,8 +1207,7 @@ gst_omx_video_enc_set_format (GstVideoEncoder * encoder,
|
||||||
if (gst_omx_port_wait_enabled (self->enc_in_port,
|
if (gst_omx_port_wait_enabled (self->enc_in_port,
|
||||||
5 * GST_SECOND) != OMX_ErrorNone)
|
5 * GST_SECOND) != OMX_ErrorNone)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (gst_omx_port_manual_reconfigure (self->enc_in_port,
|
if (gst_omx_port_mark_reconfigured (self->enc_in_port) != OMX_ErrorNone)
|
||||||
FALSE) != OMX_ErrorNone)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else {
|
||||||
if (gst_omx_component_set_state (self->enc, OMX_StateIdle) != OMX_ErrorNone)
|
if (gst_omx_component_set_state (self->enc, OMX_StateIdle) != OMX_ErrorNone)
|
||||||
|
@ -1434,6 +1462,7 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
|
||||||
{
|
{
|
||||||
GstOMXAcquireBufferReturn acq_ret = GST_OMX_ACQUIRE_BUFFER_ERROR;
|
GstOMXAcquireBufferReturn acq_ret = GST_OMX_ACQUIRE_BUFFER_ERROR;
|
||||||
GstOMXVideoEnc *self;
|
GstOMXVideoEnc *self;
|
||||||
|
GstOMXPort *port;
|
||||||
GstOMXBuffer *buf;
|
GstOMXBuffer *buf;
|
||||||
|
|
||||||
self = GST_OMX_VIDEO_ENC (encoder);
|
self = GST_OMX_VIDEO_ENC (encoder);
|
||||||
|
@ -1451,6 +1480,8 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
|
||||||
return self->downstream_flow_ret;
|
return self->downstream_flow_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
port = self->enc_in_port;
|
||||||
|
|
||||||
while (acq_ret != GST_OMX_ACQUIRE_BUFFER_OK) {
|
while (acq_ret != GST_OMX_ACQUIRE_BUFFER_OK) {
|
||||||
BufferIdentification *id;
|
BufferIdentification *id;
|
||||||
GstClockTime timestamp, duration;
|
GstClockTime timestamp, duration;
|
||||||
|
@ -1459,7 +1490,7 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
|
||||||
* _loop() can't call _finish_frame() and we might block forever
|
* _loop() can't call _finish_frame() and we might block forever
|
||||||
* because no input buffers are released */
|
* because no input buffers are released */
|
||||||
GST_VIDEO_ENCODER_STREAM_UNLOCK (self);
|
GST_VIDEO_ENCODER_STREAM_UNLOCK (self);
|
||||||
acq_ret = gst_omx_port_acquire_buffer (self->enc_in_port, &buf);
|
acq_ret = gst_omx_port_acquire_buffer (port, &buf);
|
||||||
|
|
||||||
if (acq_ret == GST_OMX_ACQUIRE_BUFFER_ERROR) {
|
if (acq_ret == GST_OMX_ACQUIRE_BUFFER_ERROR) {
|
||||||
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
@ -1468,29 +1499,72 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
|
||||||
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
goto flushing;
|
goto flushing;
|
||||||
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
|
||||||
if (gst_omx_port_reconfigure (self->enc_in_port) != OMX_ErrorNone) {
|
OMX_ERRORTYPE err;
|
||||||
|
|
||||||
|
/* Reallocate all buffers */
|
||||||
|
err = gst_omx_port_set_enabled (port, FALSE);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
goto reconfigure_error;
|
goto reconfigure_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_buffers_released (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_deallocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 1 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_set_enabled (port, TRUE);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_allocate_buffers (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_wait_enabled (port, 5 * GST_SECOND);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gst_omx_port_mark_reconfigured (port);
|
||||||
|
if (err != OMX_ErrorNone) {
|
||||||
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
goto reconfigure_error;
|
||||||
|
}
|
||||||
|
|
||||||
/* Now get a new buffer and fill it */
|
/* Now get a new buffer and fill it */
|
||||||
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
continue;
|
continue;
|
||||||
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURED) {
|
|
||||||
/* TODO: Anything to do here? Don't think so */
|
|
||||||
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
GST_VIDEO_ENCODER_STREAM_LOCK (self);
|
||||||
|
|
||||||
g_assert (acq_ret == GST_OMX_ACQUIRE_BUFFER_OK && buf != NULL);
|
g_assert (acq_ret == GST_OMX_ACQUIRE_BUFFER_OK && buf != NULL);
|
||||||
|
|
||||||
if (buf->omx_buf->nAllocLen - buf->omx_buf->nOffset <= 0) {
|
if (buf->omx_buf->nAllocLen - buf->omx_buf->nOffset <= 0) {
|
||||||
gst_omx_port_release_buffer (self->enc_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
goto full_buffer;
|
goto full_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
||||||
gst_omx_port_release_buffer (self->enc_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
goto flow_error;
|
goto flow_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1502,7 +1576,7 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
|
||||||
OMX_CONFIG_INTRAREFRESHVOPTYPE config;
|
OMX_CONFIG_INTRAREFRESHVOPTYPE config;
|
||||||
|
|
||||||
GST_OMX_INIT_STRUCT (&config);
|
GST_OMX_INIT_STRUCT (&config);
|
||||||
config.nPortIndex = self->enc_out_port->index;
|
config.nPortIndex = port->index;
|
||||||
config.IntraRefreshVOP = OMX_TRUE;
|
config.IntraRefreshVOP = OMX_TRUE;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Forcing a keyframe");
|
GST_DEBUG_OBJECT (self, "Forcing a keyframe");
|
||||||
|
@ -1517,7 +1591,7 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
|
||||||
/* Copy the buffer content in chunks of size as requested
|
/* Copy the buffer content in chunks of size as requested
|
||||||
* by the port */
|
* by the port */
|
||||||
if (!gst_omx_video_enc_fill_buffer (self, frame->input_buffer, buf)) {
|
if (!gst_omx_video_enc_fill_buffer (self, frame->input_buffer, buf)) {
|
||||||
gst_omx_port_release_buffer (self->enc_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
goto buffer_fill_error;
|
goto buffer_fill_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1542,7 +1616,7 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
|
||||||
(GDestroyNotify) buffer_identification_free);
|
(GDestroyNotify) buffer_identification_free);
|
||||||
|
|
||||||
self->started = TRUE;
|
self->started = TRUE;
|
||||||
gst_omx_port_release_buffer (self->enc_in_port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Passed frame to component");
|
GST_DEBUG_OBJECT (self, "Passed frame to component");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue