Hello,<br><br>I just read gstreamer application development manual (0.10.35.1) and want to write a very simple video player.<br><br>I can play a video (mpeg2-encoded) using playbin in test/examples/manual folder thus I tried to strip out the parts that handle the required elements to play the particular video and wrote the code as follows.<br>
<br><br>#include &lt;gst/gst.h&gt;<br><br><br>static void handoff (GstElement * identity, GstBuffer * frame, gpointer data)<br>{<br>    printf(&quot;handoff called\n&quot;);<br>}<br><br>static gboolean my_bus_callback (GstBus * bus, GstMessage * msg, gpointer data)<br>
{<br>    GMainLoop *loop = (GMainLoop *) data;<br><br>    switch (GST_MESSAGE_TYPE (msg)) {<br>        case GST_MESSAGE_EOS:<br>        {<br>            g_print (&quot;End-of-stream\n&quot;);<br>            g_main_loop_quit (loop);<br>
            printf(&quot;JYD: bus_call: GST_MESSAGE_EOS\n&quot;);<br>            break;<br>        }<br>        case GST_MESSAGE_ERROR:<br>        {<br>            gchar *debug;<br>            GError *err;<br>            printf(&quot;JYD: bus_call: GST_MESSAGE_ERROR\n&quot;);<br>
            gst_message_parse_error (msg, &amp;err, &amp;debug);<br>            g_free (debug);<br>            g_print (&quot;Error:: %s\n&quot;, err-&gt;message);<br>            g_error_free (err);<br>            g_main_loop_quit (loop);<br>
            break;<br>        }<br>        case GST_MESSAGE_WARNING:<br>        {<br>            char buf[1024];<br>            sprintf( buf, &quot;%s&quot;,  GST_MESSAGE_SRC_NAME(msg) );<br>            printf(&quot;JYD: bus_call: %s %s\n&quot;, GST_MESSAGE_TYPE_NAME(msg), buf);<br>
<br>            break;<br>        }<br><br>        case GST_MESSAGE_STATE_CHANGED: <br>        {<br>            printf(&quot;JYD: bus_call: (%s: %d)\n&quot;, GST_MESSAGE_TYPE_NAME(msg), GST_MESSAGE_TYPE(msg));<br>            /* TODO: how to see the changed element state? */<br>
            break;<br>        }<br>        default:<br>            printf(&quot;JYD: bus_call: default (%s: %d)\n&quot;, GST_MESSAGE_TYPE_NAME(msg), GST_MESSAGE_TYPE(msg));<br>            break;<br>    }<br>    return TRUE;<br>
}<br><br>gint main (gint argc, gchar * argv[])<br>{<br>    GstElement *scale;<br>    GstElement *identity;<br>    GstElement *pipeline, *queue;<br>    GstElement *src, *dec, *conv, *sink;<br>    GMainLoop *loop;<br>    GstBus *bus;<br>
<br>    gst_init (&amp;argc, &amp;argv);<br><br>    if (argc &lt; 2) {<br>        g_print (&quot;usage: %s &lt;media file or uri&gt;\n&quot;, argv[0]);<br>        return 1;<br>    }<br><br>    /* create and event loop and feed gstreamer bus mesages to it */<br>
    loop = g_main_loop_new (NULL, FALSE);<br><br>    /* create pipeline */<br>    pipeline = gst_pipeline_new (&quot;pipeline&quot;);<br>    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<br>    gst_bus_add_watch(bus, my_bus_callback, loop);<br>
    gst_object_unref (bus);<br><br>    /* create an element for file-reading */<br>    src = gst_element_factory_make (&quot;filesrc&quot;, &quot;source&quot;);<br>    g_object_set (G_OBJECT (src), &quot;location&quot;, argv[1], NULL);<br>
    dec = gst_element_factory_make (&quot;decodebin&quot;, &quot;decode&quot;);<br>    queue = gst_element_factory_make (&quot;queue&quot;, &quot;preroll_video_src0&quot; );<br>    sink = gst_element_factory_make (&quot;autovideosink&quot;, &quot;videosink&quot;);<br>
    conv = gst_element_factory_make (&quot;ffmpegcolorspace&quot;, &quot;vconv&quot;);<br>    scale = gst_element_factory_make (&quot;videoscale&quot;, &quot;vscale&quot;);<br>    identity = gst_element_factory_make (&quot;identity&quot;, &quot;identity-for-what&quot;);<br>
    g_object_set (identity, &quot;silent&quot;, TRUE, NULL);<br>    g_signal_connect (identity, &quot;handoff&quot;, G_CALLBACK (handoff), NULL);<br><br>    /* add elements to a bin */<br>    gst_bin_add_many( GST_BIN (pipeline), src, dec, queue, conv, scale, identity, sink, NULL );<br>
<br>    /* link the elements in the bin */<br>    gst_element_link( src, dec );<br>    gst_element_link( dec, queue );<br>    gst_element_link( queue, identity );<br>    gst_element_link( identity, conv );<br>    gst_element_link( conv, scale );<br>
    gst_element_link( scale, sink );<br><br><br>    /* start the bin */<br>    gst_element_set_state (pipeline, GST_STATE_PLAYING);<br><br>    /* start play back and listed to events */<br>    printf(&quot;go to main loop\n&quot;); /* XXX you may start debugging here */<br>
    g_main_loop_run (loop);<br>    printf(&quot;return from main loop\n&quot;);<br><br>    /* cleanup */<br>    g_object_unref (pipeline);<br>    g_object_unref (loop);<br><br>    return 0;<br>}<br><br><br>and the results give me the following<br>
<br>Error:: Internal data flow error.<br>return from main loop<br><br>(lt-myvideoplayer:26621): GStreamer-CRITICAL **: <br>Trying to dispose element videosink, but it is in PAUSED instead of the NULL state.<br>You need to explicitly set elements to the NULL state before<br>
dropping the final reference, to allow them to clean up.<br>This problem may also be caused by a refcounting bug in the<br>application or some element.<br><br><br>(lt-myvideoplayer:26621): GStreamer-CRITICAL **: <br>Trying to dispose element identity-for-what, but it is in PAUSED instead of the NULL state.<br>
You need to explicitly set elements to the NULL state before<br>dropping the final reference, to allow them to clean up.<br>This problem may also be caused by a refcounting bug in the<br>application or some element.<br><br>
<br>(lt-myvideoplayer:26621): GStreamer-CRITICAL **: <br>Trying to dispose element vscale, but it is in PAUSED instead of the NULL state.<br>You need to explicitly set elements to the NULL state before<br>dropping the final reference, to allow them to clean up.<br>
This problem may also be caused by a refcounting bug in the<br>application or some element.<br><br><br>(lt-myvideoplayer:26621): GStreamer-CRITICAL **: <br>Trying to dispose element vconv, but it is in PAUSED instead of the NULL state.<br>
You need to explicitly set elements to the NULL state before<br>dropping the final reference, to allow them to clean up.<br>This problem may also be caused by a refcounting bug in the<br>application or some element.<br><br>
<br>(lt-myvideoplayer:26621): GStreamer-CRITICAL **: <br>Trying to dispose element preroll_video_src0, but it is in PAUSED instead of the NULL state.<br>You need to explicitly set elements to the NULL state before<br>dropping the final reference, to allow them to clean up.<br>
This problem may also be caused by a refcounting bug in the<br>application or some element.<br><br><br>GThread-ERROR **: file /build/buildd/glib2.0-2.30.0/./gthread/gthread-posix.c: line 171 (g_mutex_free_posix_impl): error &#39;Device or resource busy&#39; during &#39;pthread_mutex_destroy ((pthread_mutex_t *) mutex)&#39;<br>
Trace/breakpoint trap<br><br><br>I&#39;m stcuked in this phase. <br>Please help me.<br>Any comments, reading recommendations, would be very appreciated.<br><br>jaeyong<br><br>