From: Felipe C. <fel...@gm...> - 2009-03-24 21:59:27
|
This patch series seems to be safe to merge since it doesn't degrade the situation with the base sink, which is pretty bad. Doing some hacks here and there I managed to get some output of the audiosink, so at least this works. Thanks go to Frederik Vernelen for the initial implementation and feedback. This is the first step towards merging the tunneling branch, but I would like some feedback if possible, at least from Frederik. Frederik, can I have you acknoledgement to merge this? Felipe Contreras (4): basesink: move omx initalization to pad link basesink: add empty change_state function basesink: align gst and omx states in base_sink basesink: initalize omx when changing to READY Frederik Vernelen (1): basesink: add NXP copyright omx/gstomx_base_sink.c | 161 ++++++++++++++++++++++++++++++------------------ omx/gstomx_base_sink.h | 2 +- 2 files changed, 103 insertions(+), 60 deletions(-) |
From: Felipe C. <fel...@gm...> - 2009-03-24 21:59:46
|
From: Frederik Vernelen <fre...@nx...> For contributions in the initial implementation of gst-omx state alignment and tunneling. Signed-off-by: Felipe Contreras <fel...@gm...> --- omx/gstomx_base_sink.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/omx/gstomx_base_sink.c b/omx/gstomx_base_sink.c index 705b886..8ab055c 100644 --- a/omx/gstomx_base_sink.c +++ b/omx/gstomx_base_sink.c @@ -1,7 +1,10 @@ /* * Copyright (C) 2007-2009 Nokia Corporation. + * Copyright (C) 2008 NXP. * - * Author: Felipe Contreras <fel...@no...> + * Authors: + * Felipe Contreras <fel...@no...> + * Frederik Vernelen <fre...@nx...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public -- 1.6.2.1.316.gedbc2 |
From: Felipe C. <fel...@gm...> - 2009-03-24 21:59:48
|
Based on the tunneling patch series by Frederik Vermelen (NXP), whom also gave feedback to this patch. Signed-off-by: Felipe Contreras <fel...@gm...> --- omx/gstomx_base_sink.c | 54 +++++++++++++++++++++++++++++++---------------- omx/gstomx_base_sink.h | 1 + 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/omx/gstomx_base_sink.c b/omx/gstomx_base_sink.c index 8ab055c..0f22f14 100644 --- a/omx/gstomx_base_sink.c +++ b/omx/gstomx_base_sink.c @@ -64,24 +64,6 @@ setup_ports (GstOmxBaseSink *self) } static gboolean -start (GstBaseSink *gst_base) -{ - GstOmxBaseSink *self; - - self = GST_OMX_BASE_SINK (gst_base); - - GST_LOG_OBJECT (self, "begin"); - - g_omx_core_init (self->gomx, self->omx_library, self->omx_component); - if (self->gomx->omx_error) - return GST_STATE_CHANGE_FAILURE; - - GST_LOG_OBJECT (self, "end"); - - return TRUE; -} - -static gboolean stop (GstBaseSink *gst_base) { GstOmxBaseSink *self; @@ -341,7 +323,6 @@ type_class_init (gpointer g_class, gobject_class->dispose = dispose; - gst_base_sink_class->start = start; gst_base_sink_class->stop = stop; gst_base_sink_class->event = handle_event; gst_base_sink_class->preroll = render; @@ -409,6 +390,40 @@ activate_push (GstPad *pad, return result; } +static inline gboolean +omx_init (GstOmxBaseSink *self) +{ + g_omx_core_init (self->gomx, self->omx_library, self->omx_component); + + if (self->gomx->omx_error) + return FALSE; + + return TRUE; +} + +static GstPadLinkReturn +pad_sink_link (GstPad *pad, + GstPad *peer) +{ + GOmxCore *gomx; + GstOmxBaseSink *self; + + self = GST_OMX_BASE_SINK (GST_OBJECT_PARENT (pad)); + + GST_INFO_OBJECT (self, "link"); + + gomx = self->gomx; + + if (!self->initialized) + { + if (!omx_init (self)) + return GST_PAD_LINK_REFUSED; + self->initialized = TRUE; + } + + return GST_PAD_LINK_OK; +} + static void type_instance_init (GTypeInstance *instance, gpointer g_class) @@ -435,6 +450,7 @@ type_instance_init (GTypeInstance *instance, GstPad *sinkpad; self->sinkpad = sinkpad = GST_BASE_SINK_PAD (self); gst_pad_set_activatepush_function (sinkpad, activate_push); + gst_pad_set_link_function (sinkpad, pad_sink_link); } GST_LOG_OBJECT (self, "end"); diff --git a/omx/gstomx_base_sink.h b/omx/gstomx_base_sink.h index 2ac371d..1356cf7 100644 --- a/omx/gstomx_base_sink.h +++ b/omx/gstomx_base_sink.h @@ -50,6 +50,7 @@ struct GstOmxBaseSink char *omx_library; gboolean ready; + gboolean initialized; }; struct GstOmxBaseSinkClass -- 1.6.2.1.316.gedbc2 |
From: Felipe C. <fel...@gm...> - 2009-03-24 21:59:47
|
Signed-off-by: Felipe Contreras <fel...@gm...> --- omx/gstomx_base_sink.c | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) diff --git a/omx/gstomx_base_sink.c b/omx/gstomx_base_sink.c index 0f22f14..2e29312 100644 --- a/omx/gstomx_base_sink.c +++ b/omx/gstomx_base_sink.c @@ -63,6 +63,28 @@ setup_ports (GstOmxBaseSink *self) free (param); } +static GstStateChangeReturn +change_state (GstElement *element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstOmxBaseSink *self; + + self = GST_OMX_BASE_SINK (element); + + GST_LOG_OBJECT (self, "begin"); + + GST_INFO_OBJECT (self, "changing state %s - %s", + gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)), + gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition))); + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + GST_LOG_OBJECT (self, "end"); + + return ret; +} + static gboolean stop (GstBaseSink *gst_base) { @@ -323,6 +345,8 @@ type_class_init (gpointer g_class, gobject_class->dispose = dispose; + gstelement_class->change_state = change_state; + gst_base_sink_class->stop = stop; gst_base_sink_class->event = handle_event; gst_base_sink_class->preroll = render; -- 1.6.2.1.316.gedbc2 |
From: Felipe C. <fel...@gm...> - 2009-03-24 22:00:00
|
Based on the tunneling patch series by Frederik Vermelen (NXP), whom also gave feedback to this patch. Signed-off-by: Felipe Contreras <fel...@gm...> --- omx/gstomx_base_sink.c | 94 +++++++++++++++++++++-------------------------- omx/gstomx_base_sink.h | 1 - 2 files changed, 42 insertions(+), 53 deletions(-) diff --git a/omx/gstomx_base_sink.c b/omx/gstomx_base_sink.c index 2e29312..f2b3d0a 100644 --- a/omx/gstomx_base_sink.c +++ b/omx/gstomx_base_sink.c @@ -78,31 +78,47 @@ change_state (GstElement *element, gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)), gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition))); - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + switch (transition) + { + case GST_STATE_CHANGE_NULL_TO_READY: + g_omx_core_prepare (self->gomx); + break; - GST_LOG_OBJECT (self, "end"); + case GST_STATE_CHANGE_READY_TO_PAUSED: + g_omx_core_start (self->gomx); + break; - return ret; -} + case GST_STATE_CHANGE_PAUSED_TO_READY: + g_omx_port_finish (self->in_port); + break; -static gboolean -stop (GstBaseSink *gst_base) -{ - GstOmxBaseSink *self; + default: + break; + } - self = GST_OMX_BASE_SINK (gst_base); + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - GST_LOG_OBJECT (self, "begin"); + if (ret == GST_STATE_CHANGE_FAILURE) + goto leave; - g_omx_core_finish (self->gomx); + switch (transition) + { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + g_omx_port_pause (self->in_port); + break; - g_omx_core_deinit (self->gomx); - if (self->gomx->omx_error) - return GST_STATE_CHANGE_FAILURE; + case GST_STATE_CHANGE_PAUSED_TO_READY: + g_omx_core_finish (self->gomx); + break; + default: + break; + } + +leave: GST_LOG_OBJECT (self, "end"); - return TRUE; + return ret; } static void @@ -138,33 +154,12 @@ render (GstBaseSink *gst_base, GST_LOG_OBJECT (self, "state: %d", gomx->omx_state); - if (G_UNLIKELY (gomx->omx_state == OMX_StateLoaded)) - { - GST_INFO_OBJECT (self, "omx: prepare"); - - setup_ports (self); - g_omx_core_prepare (self->gomx); - - self->ready = TRUE; - } - in_port = self->in_port; if (G_LIKELY (in_port->enabled)) { guint buffer_offset = 0; - if (G_UNLIKELY (gomx->omx_state == OMX_StateIdle)) - { - GST_INFO_OBJECT (self, "omx: play"); - g_omx_core_start (gomx); - } - - if (G_UNLIKELY (gomx->omx_state != OMX_StateExecuting)) - { - GST_ERROR_OBJECT (self, "Whoa! very wrong"); - } - while (G_LIKELY (buffer_offset < GST_BUFFER_SIZE (buf))) { OMX_BUFFERHEADERTYPE *omx_buffer; @@ -347,7 +342,6 @@ type_class_init (gpointer g_class, gstelement_class->change_state = change_state; - gst_base_sink_class->stop = stop; gst_base_sink_class->event = handle_event; gst_base_sink_class->preroll = render; gst_base_sink_class->render = render; @@ -382,31 +376,25 @@ activate_push (GstPad *pad, { GST_DEBUG_OBJECT (self, "activate"); - if (self->ready) + /* we do not start the task yet if the pad is not connected */ + if (gst_pad_is_linked (pad)) { - /* we do not start the task yet if the pad is not connected */ - if (gst_pad_is_linked (pad)) - { - /** @todo link callback function also needed */ - g_omx_port_resume (self->in_port); - } + /** @todo link callback function also needed */ + g_omx_port_resume (self->in_port); } } else { GST_DEBUG_OBJECT (self, "deactivate"); - if (self->ready) - { - /** @todo disable this until we properly reinitialize the buffers. */ + /** @todo disable this until we properly reinitialize the buffers. */ #if 0 - /* flush all buffers */ - OMX_SendCommand (self->gomx->omx_handle, OMX_CommandFlush, OMX_ALL, NULL); + /* flush all buffers */ + OMX_SendCommand (self->gomx->omx_handle, OMX_CommandFlush, OMX_ALL, NULL); #endif - /* unlock loops */ - g_omx_port_pause (self->in_port); - } + /* unlock loops */ + g_omx_port_pause (self->in_port); } gst_object_unref (self); @@ -422,6 +410,8 @@ omx_init (GstOmxBaseSink *self) if (self->gomx->omx_error) return FALSE; + setup_ports (self); + return TRUE; } diff --git a/omx/gstomx_base_sink.h b/omx/gstomx_base_sink.h index 1356cf7..564f380 100644 --- a/omx/gstomx_base_sink.h +++ b/omx/gstomx_base_sink.h @@ -49,7 +49,6 @@ struct GstOmxBaseSink char *omx_component; char *omx_library; - gboolean ready; gboolean initialized; }; -- 1.6.2.1.316.gedbc2 |
From: Felipe C. <fel...@gm...> - 2009-03-24 22:00:14
|
Sometimes pad_link is called after switching the state; we need to have omx initialized always. Based on the tunneling patch series by Frederik Vermelen (NXP), whom also gave feedback to this patch. Signed-off-by: Felipe Contreras <fel...@gm...> --- omx/gstomx_base_sink.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/omx/gstomx_base_sink.c b/omx/gstomx_base_sink.c index f2b3d0a..fd42159 100644 --- a/omx/gstomx_base_sink.c +++ b/omx/gstomx_base_sink.c @@ -31,6 +31,8 @@ static gboolean share_input_buffer; +static inline gboolean omx_init (GstOmxBaseSink *self); + enum { ARG_0, @@ -81,6 +83,14 @@ change_state (GstElement *element, switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: + if (!self->initialized) + { + if (!omx_init (self)) + return GST_PAD_LINK_REFUSED; + + self->initialized = TRUE; + } + g_omx_core_prepare (self->gomx); break; -- 1.6.2.1.316.gedbc2 |