[gst-devel] Converting a gst-launch pipeline to C code

MSJ mauricio_sj at yahoo.com
Sat Oct 3 00:01:44 CEST 2009

I'm trying to do the same, but my pipeline doesn't seem to work; if I removed
either of the lines marked *** then video or audio play, but having both
lines doesn't seem to work.  I've been trying evrything, and I notice than
in the working case I get an sync-done message which I don't get in the
other cases.  I appreaciate any insight.


static void on_pad_added (GstElement *element,
    GstPad *pad,
    gpointer data)
    GstCaps *caps;
    const gchar *mime;

    GstPad *audiopad, *videopad;

    caps = gst_pad_get_caps (pad);
    g_assert (caps != NULL);
    mime = gst_structure_get_name (gst_caps_get_structure (caps, 0));

    if (g_strrstr (mime, "audio")) {
        /* only link once */
        audiopad = gst_element_get_static_pad (audio, "sink");
        if (GST_PAD_IS_LINKED (audiopad)) {
            g_error("Audio already Linked\n");
            g_object_unref (audiopad);
        g_print("Linking the audio %s\n", mime);
        /* link’n’play */
        gst_pad_link (pad, audiopad);
        gst_object_unref (audiopad);

    if (g_strrstr (mime, "video")) {
        /* only link once */
        videopad = gst_element_get_static_pad (video, "sink");
        if (GST_PAD_IS_LINKED (videopad)) {
            g_error("Video already Linked\n");  
            g_object_unref (videopad);
        gst_pad_link (pad, videopad);
        gst_object_unref (videopad);

    gst_caps_unref (caps);

[...] Main Initialization

    /* Pipeline Creation */
    gst_bin_add_many (GST_BIN (pipeline), source, demux, NULL);

    /* Link of the elements together */
    /* file-source -> AVI-demuxer ~> A/V CODEC -> sink */
    gst_element_link (source, demux);
    g_signal_connect (demux, "pad-added", G_CALLBACK (on_pad_added), NULL);

    /* create audio output */
    audio = gst_bin_new ("audiobin");
    gst_bin_add_many (GST_BIN (audio), aqueue, adec, asink, NULL);
    gst_element_link_many(aqueue, adec, asink, NULL);

    audiopad = gst_element_get_static_pad (aqueue, "sink");    
    gst_element_add_pad (audio, gst_ghost_pad_new ("sink", audiopad));
    gst_object_unref (audiopad);
    gst_bin_add (GST_BIN (pipeline), audio);  ***

    /* create video output */
    video = gst_bin_new ("videobin");
    gst_bin_add_many (GST_BIN (video), vqueue, vdec, vsink, NULL);
    gst_element_link_many (vqueue, vdec, vsink, NULL);

    videopad = gst_element_get_static_pad (vqueue, "sink");    
    gst_element_add_pad (video, gst_ghost_pad_new ("sink", videopad));
    gst_object_unref (videopad);
    gst_bin_add (GST_BIN (pipeline), video  ***

    /* Set the pipeline to "playing" state*/
    g_print ("Now playing: %s\n", aviFile);
    gst_element_set_state (pipeline, GST_STATE_PLAYING);
    /* Iterate */
    g_print ("Running...\n");
    /* Out of the main loop, clean up nicely */
    g_print ("Returned, stopping playback\n");
    gst_element_set_state (pipeline, GST_STATE_NULL);
    g_print ("Deleting pipeline\n");
    gst_object_unref (GST_OBJECT (pipeline));
View this message in context: http://www.nabble.com/Converting-a-gst-launch-pipeline-to-C-code-tp19728759p25722086.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.

More information about the gstreamer-devel mailing list