[gst-devel] Error : App hangs when I try to test my source plugin

Krishnakumar Ramachandran krishnakumar.ramachandran at gmail.com
Wed Jun 10 10:21:26 CEST 2009


Hi All,

     I am very new to gstreamer and started working only 2 days back. I am
trying to create a sample source plugin with 2 source pads. (My large idea
is to include a demux also in the source plugin and at that point in time
one pad will push audio and the other will push video. But as of now both
pads are of type "ANY"). To test my plugin, I am trying to connect it to two
filesinks (i.e each source pad is connected to the sink pad of a filesink).
So the pipeline has 3 plugins. My test source  and 2 filesinks. After
creating the pipeline, I call gst_element_set_state with GST_STATE_PLAYING.
After this initially all 3 of the plugins and pipeline move to READY state
(I get bus_call callback with state changed confirmation). Then my source
plugin changes to PAUSED state and then the entire app hangs. I have
attached the sample app code I am working on. Please tell me what I am doing
wrong here.

Thanks in advance
KK

#include <gst/gst.h>

#include <glib.h>

GstElement *mypipeline = NULL;
static int ccount = 0;

static gboolean bus_call (GstBus     *bus,
                          GstMessage *msg,
                          gpointer    data)
{
      g_print("Got one bus call:%d\n", GST_MESSAGE_TYPE(msg));
          GMainLoop *loop = (GMainLoop *) data;
            switch (GST_MESSAGE_TYPE (msg))
            {
                case GST_MESSAGE_EOS:
                      g_print ("End of stream\n");
                      g_main_loop_quit (loop);
                      break;

                case GST_MESSAGE_ERROR:
                      {
                            gchar *debug;
                            GError *error;
                            gst_message_parse_error (msg, &error, &debug);
                            g_free (debug);
                            g_printerr ("Error: %s\n", error->message);
                            g_error_free (error);
                            g_main_loop_quit (loop);
                            break;
                      }

        case GST_MESSAGE_STATE_CHANGED:
              {
            ccount++;
            printf("State change:%d\n", ccount);
            printf("Element:%s\n", msg->src->name);
            break;
              }
                default:
                   break;
            }
            return TRUE;
}


int main(int argc, char* argv[])
{
    GMainLoop* loop = NULL;
    GstElement *pipeline, *source, *fsink1, *fsink2;
    GstBus *bus;

    gst_init(&argc, &argv);

    loop = g_main_loop_new (NULL, FALSE);

    pipeline = gst_pipeline_new("TstPipeLine");

    if(!pipeline)
    {
        g_print("Could not create pipeline\n");
        return -1;
    }

    source = gst_element_factory_make("tstsrc", "tstsrcplug");
    if(!source)
    {
        g_print("Did not get ur source\n");
        return -1;
    }

    fsink1 = gst_element_factory_make ("filesink","asink");
    fsink2 = gst_element_factory_make ("filesink","vsink");
    if((!fsink1) || (!fsink2))
    {
        g_print("Could not create at least one sink\n");
        return -1;
    }

    g_object_set(G_OBJECT (fsink1), "location", "afile.dmp", NULL);
    g_object_set(G_OBJECT (fsink2), "location", "vfile.dmp", NULL);

    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
        gst_bus_add_watch (bus, bus_call, loop);
        gst_object_unref (bus);

    gst_bin_add_many (GST_BIN (pipeline),source, fsink1, fsink2, NULL);

    gboolean bret = gst_element_link_pads(source, "asrc", fsink1, "sink");
    printf("Bool ret = %d\n", bret);
    bret = gst_element_link_pads(source, "vsrc", fsink2, "sink");
    printf("Bool ret = %d\n", bret);

    GstStateChangeReturn myretval = 0;
    g_print("Now playing\n");
    myretval = gst_element_set_state(pipeline, GST_STATE_PLAYING);

    printf("State of source:%d \n", GST_STATE(source));
    printf("State of asink:%d \n", GST_STATE(fsink1));
    printf("State of vsink:%d \n", GST_STATE(fsink2));
    printf("Retval%d\n", myretval);

    g_print ("Running...\n");
        g_main_loop_run (loop);
    return 0;
}

<gstreamer-devel at lists.sourceforge.net>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20090610/a09ad19e/attachment.htm>


More information about the gstreamer-devel mailing list