Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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;

}
Example #5
0
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;
}