static gboolean gst_goo_decgsmfr_check_fixed_src_caps (GstGooAudioFilter* filter) { GstGooDecGsmFr *self = GST_GOO_DECGSMFR (filter); OMX_AUDIO_PARAM_PCMMODETYPE *param; GstCaps *src_caps; param = GOO_TI_GSMFRDEC_GET_OUTPUT_PORT_PARAM (GST_GOO_AUDIO_FILTER (self)->component); src_caps = gst_caps_new_simple ( "audio/x-raw-int", "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "rate", G_TYPE_INT, 8000, "channels", G_TYPE_INT, 1, NULL ); filter->src_caps = gst_caps_ref (src_caps); gst_pad_set_caps (GST_GOO_AUDIO_FILTER (self)->srcpad, src_caps); gst_caps_unref (src_caps); return TRUE; }
static gboolean gst_goo_decgsmfr_sink_setcaps (GstPad *pad, GstCaps *caps) { GstStructure *structure; GstGooDecGsmFr *self; GooComponent *component; gchar *str_caps; guint sample_rate = DEFAULT_BITRATE; guint channels = CHANNELS_DEFAULT; self = GST_GOO_DECGSMFR (GST_PAD_PARENT (pad)); component = (GooComponent *) GST_GOO_AUDIO_FILTER (self)->component; GST_DEBUG_OBJECT (self, "sink_setcaps"); g_return_val_if_fail (gst_caps_get_size (caps) == 1, FALSE); structure = gst_caps_get_structure (caps, 0); str_caps = gst_structure_to_string (structure); GST_DEBUG_OBJECT (self, "sink caps: %s", str_caps); g_free (str_caps); if (gst_goo_util_structure_is_parsed (structure)) g_object_set (G_OBJECT (self), "process-mode", 0, NULL); gst_structure_get_int (structure, "rate", &sample_rate); gst_structure_get_int (structure, "channels", &channels); return gst_pad_set_caps (pad, caps); }
static gboolean gst_goo_decgsmfr_src_setcaps (GstPad *pad, GstCaps *caps) { GstStructure *structure; GstGooDecGsmFr *self; GstElement* next_element; GooPort *outport; GstPad* peer; guint width = DEFAULT_WIDTH; guint depth = DEFAULT_DEPTH; gchar* str_peer; gchar dasf[] = "dasf"; gint comp_res; self = GST_GOO_DECGSMFR (GST_PAD_PARENT (pad)); outport = (GooPort *) GST_GOO_AUDIO_FILTER (self)->outport; peer = gst_pad_get_peer (pad); next_element = GST_ELEMENT (gst_pad_get_parent (peer)); str_peer = gst_element_get_name (next_element); comp_res = strncmp (dasf, str_peer, 4); if (comp_res == 0) { GST_DEBUG_OBJECT (self, "DASF-SINK Activated: GSM-FR Dec"); GST_GOO_AUDIO_FILTER (self)->dasf_mode = TRUE; } else { GST_DEBUG_OBJECT (self, "FILE-TO-FILE Activated: GSM-FR Dec"); GST_GOO_AUDIO_FILTER (self)->dasf_mode = FALSE; } GST_DEBUG_OBJECT (self, "src_setcaps"); GST_LOG ("caps are %" GST_PTR_FORMAT, caps); g_return_val_if_fail (gst_caps_get_size (caps) == 1, FALSE); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "depth", &depth); gst_object_unref (next_element); gst_object_unref (peer); return gst_pad_set_caps (pad, caps); }
static void gst_dasf_change_peer_omx_state (GstDasfSrc* self) { GST_INFO (""); GstPad *peer; GstElement *next_element; GooComponent *component; GstBaseSrc *base_src; peer = gst_pad_get_peer (GST_BASE_SRC_PAD (self)); if (G_UNLIKELY (peer == NULL)) { GST_INFO ("No next pad"); return; } next_element = GST_ELEMENT (gst_pad_get_parent (peer)); if (G_UNLIKELY (next_element == NULL)) { GST_INFO ("Cannot find a next element"); gst_object_unref (next_element); return; } /** expecting a capsfilter between dasfsrc and goo audio component **/ while (GST_IS_BASE_TRANSFORM (next_element)) { GST_DEBUG_OBJECT(self, "next element name: %s", gst_element_get_name (next_element)); gst_object_unref (peer); peer = gst_pad_get_peer (GST_BASE_TRANSFORM_SRC_PAD (next_element)); gst_object_unref (next_element); next_element = GST_ELEMENT(gst_pad_get_parent (peer)) ; GST_DEBUG_OBJECT (self, "one after element name: %s", gst_element_get_name(next_element)); } /** capsfilter might be found * element next to the caps filter should be goo **/ component = GOO_COMPONENT (g_object_get_data (G_OBJECT (next_element), "goo")); if (G_UNLIKELY (component == NULL)) { GST_INFO ("Previous element does not have a Goo component"); gst_object_unref (peer); gst_object_unref (next_element); return; } if (!GOO_IS_TI_AUDIO_COMPONENT (component)) { GST_WARNING ("The component in previous element is not TI Audio"); gst_object_unref (peer); gst_object_unref (next_element); return; } self->peer_element = g_object_ref (GST_GOO_AUDIO_FILTER (next_element)); /* Work with a queue on the output buffers */ g_object_set (GST_GOO_AUDIO_FILTER (next_element)->component, "outport-queue", TRUE, NULL); /** This fixates the caps on the next goo element to configure the output omx port **/ gst_goo_audio_filter_check_fixed_src_caps (GST_GOO_AUDIO_FILTER (next_element)); g_object_set (GST_GOO_AUDIO_FILTER (next_element)->inport, "buffercount", 1, NULL); g_object_set (GST_GOO_AUDIO_FILTER (next_element)->outport, "buffercount", 1, NULL); GST_INFO ("Setting peer omx component to idle"); goo_component_set_state_idle (GST_GOO_AUDIO_FILTER (next_element)->component); GST_INFO ("Setting peer omx component to executing"); goo_component_set_state_executing (GST_GOO_AUDIO_FILTER (next_element)->component); gst_object_unref (peer); gst_object_unref (next_element); GST_DEBUG_OBJECT (self, "peer refcount = %d", G_OBJECT (peer)->ref_count); GST_DEBUG_OBJECT (self, "next element refcount = %d", G_OBJECT (next_element)->ref_count); return; }
static void gst_goo_decgsmfr_init (GstGooDecGsmFr *self, GstGooDecGsmFrClass *klass) { GST_DEBUG ("Enter"); GST_GOO_AUDIO_FILTER (self)->component = goo_component_factory_get_component (GST_GOO_AUDIO_FILTER (self)->factory, GOO_TI_GSMFR_DECODER); GooComponent *component = GST_GOO_AUDIO_FILTER (self)->component; /* component default parameters */ { GOO_TI_GSMFRDEC_GET_OUTPUT_PORT_PARAM (component)->nChannels = CHANNELS_DEFAULT; GOO_TI_GSMFRDEC_GET_OUTPUT_PORT_PARAM (component)->nSamplingRate = DEFAULT_BITRATE; } /* input port */ GST_GOO_AUDIO_FILTER (self)->inport = goo_component_get_port (component, "input0"); g_assert (GST_GOO_AUDIO_FILTER (self)->inport != NULL); { GooPort *port = GST_GOO_AUDIO_FILTER (self)->inport; GOO_PORT_GET_DEFINITION (port)->nBufferSize = INPUT_BUFFERSIZE; GOO_PORT_GET_DEFINITION (port)->format.audio.eEncoding = OMX_AUDIO_CodingGSMFR; } /* output port */ GST_GOO_AUDIO_FILTER (self)->outport = goo_component_get_port (component, "output0"); g_assert (GST_GOO_AUDIO_FILTER (self)->outport != NULL); { GooPort *port = GST_GOO_AUDIO_FILTER (self)->outport; GOO_PORT_GET_DEFINITION (port)->nBufferSize = OUTPUT_BUFFERSIZE; GOO_PORT_GET_DEFINITION (port)->format.audio.eEncoding = OMX_AUDIO_CodingPCM; goo_port_set_process_buffer_function (port, gst_goo_audio_filter_outport_buffer); } /* Setcap functions */ gst_pad_set_setcaps_function (GST_GOO_AUDIO_FILTER (self)->sinkpad, gst_goo_decgsmfr_sink_setcaps); gst_pad_set_setcaps_function (GST_GOO_AUDIO_FILTER (self)->srcpad, gst_goo_decgsmfr_src_setcaps); g_object_set_data (G_OBJECT (GST_GOO_AUDIO_FILTER (self)->component), "gst", self); g_object_set_data (G_OBJECT (self), "goo", GST_GOO_AUDIO_FILTER (self)->component); g_object_set (G_OBJECT (self), "process mode", 1, NULL); GST_DEBUG ("Exit"); return; }