<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">It works!<div>Thanks a lot.</div><div><br></div><div>jaeyong</div><div><br><div><div><div>2011. 12. 14., ¿ÀÈÄ 5:46, ½Å½Â¹è ÀÛ¼º:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hi,<br>It seems that you are trying to link decodebin with queue element directly.<br>Try to link them by handling "new-decoded-pad" signal from decodebin.<br>Please refer below link which is official gstreamer document.<br>
<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-components-decodebin.html">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-components-decodebin.html</a><br>
Thank you.<br><br><br><br><div class="gmail_quote">On Tue, Dec 13, 2011 at 10:40 PM, jaeyong yoo <span dir="ltr">&lt;<a href="mailto:y.jaeyong@gmail.com">y.jaeyong@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
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>&nbsp;&nbsp;&nbsp; printf("handoff called\n");<br>}<br><br>static gboolean my_bus_callback (GstBus * bus, GstMessage * msg, gpointer data)<br>

{<br>&nbsp;&nbsp;&nbsp; GMainLoop *loop = (GMainLoop *) data;<br><br>&nbsp;&nbsp;&nbsp; switch (GST_MESSAGE_TYPE (msg)) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case GST_MESSAGE_EOS:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_print ("End-of-stream\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_main_loop_quit (loop);<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("JYD: bus_call: GST_MESSAGE_EOS\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case GST_MESSAGE_ERROR:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gchar *debug;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GError *err;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("JYD: bus_call: GST_MESSAGE_ERROR\n");<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_message_parse_error (msg, &amp;err, &amp;debug);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_free (debug);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_print ("Error:: %s\n", err-&gt;message);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_error_free (err);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_main_loop_quit (loop);<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case GST_MESSAGE_WARNING:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char buf[1024];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sprintf( buf, "%s",&nbsp; GST_MESSAGE_SRC_NAME(msg) );<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("JYD: bus_call: %s %s\n", GST_MESSAGE_TYPE_NAME(msg), buf);<br>

<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case GST_MESSAGE_STATE_CHANGED: <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("JYD: bus_call: (%s: %d)\n", GST_MESSAGE_TYPE_NAME(msg), GST_MESSAGE_TYPE(msg));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* TODO: how to see the changed element state? */<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("JYD: bus_call: default (%s: %d)\n", GST_MESSAGE_TYPE_NAME(msg), GST_MESSAGE_TYPE(msg));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return TRUE;<br>

}<br><br>gint main (gint argc, gchar * argv[])<br>{<br>&nbsp;&nbsp;&nbsp; GstElement *scale;<br>&nbsp;&nbsp;&nbsp; GstElement *identity;<br>&nbsp;&nbsp;&nbsp; GstElement *pipeline, *queue;<br>&nbsp;&nbsp;&nbsp; GstElement *src, *dec, *conv, *sink;<br>&nbsp;&nbsp;&nbsp; GMainLoop *loop;<br>&nbsp;&nbsp;&nbsp; GstBus *bus;<br>

<br>&nbsp;&nbsp;&nbsp; gst_init (&amp;argc, &amp;argv);<br><br>&nbsp;&nbsp;&nbsp; if (argc &lt; 2) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_print ("usage: %s &lt;media file or uri&gt;\n", argv[0]);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /* create and event loop and feed gstreamer bus mesages to it */<br>

&nbsp;&nbsp;&nbsp; loop = g_main_loop_new (NULL, FALSE);<br><br>&nbsp;&nbsp;&nbsp; /* create pipeline */<br>&nbsp;&nbsp;&nbsp; pipeline = gst_pipeline_new ("pipeline");<br>&nbsp;&nbsp;&nbsp; bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<br>&nbsp;&nbsp;&nbsp; gst_bus_add_watch(bus, my_bus_callback, loop);<br>

&nbsp;&nbsp;&nbsp; gst_object_unref (bus);<br><br>&nbsp;&nbsp;&nbsp; /* create an element for file-reading */<br>&nbsp;&nbsp;&nbsp; src = gst_element_factory_make ("filesrc", "source");<br>&nbsp;&nbsp;&nbsp; g_object_set (G_OBJECT (src), "location", argv[1], NULL);<br>

&nbsp;&nbsp;&nbsp; dec = gst_element_factory_make ("decodebin", "decode");<br>&nbsp;&nbsp;&nbsp; queue = gst_element_factory_make ("queue", "preroll_video_src0" );<br>&nbsp;&nbsp;&nbsp; sink = gst_element_factory_make ("autovideosink", "videosink");<br>

&nbsp;&nbsp;&nbsp; conv = gst_element_factory_make ("ffmpegcolorspace", "vconv");<br>&nbsp;&nbsp;&nbsp; scale = gst_element_factory_make ("videoscale", "vscale");<br>&nbsp;&nbsp;&nbsp; identity = gst_element_factory_make ("identity", "identity-for-what");<br>

&nbsp;&nbsp;&nbsp; g_object_set (identity, "silent", TRUE, NULL);<br>&nbsp;&nbsp;&nbsp; g_signal_connect (identity, "handoff", G_CALLBACK (handoff), NULL);<br><br>&nbsp;&nbsp;&nbsp; /* add elements to a bin */<br>&nbsp;&nbsp;&nbsp; gst_bin_add_many( GST_BIN (pipeline), src, dec, queue, conv, scale, identity, sink, NULL );<br>

<br>&nbsp;&nbsp;&nbsp; /* link the elements in the bin */<br>&nbsp;&nbsp;&nbsp; gst_element_link( src, dec );<br>&nbsp;&nbsp;&nbsp; gst_element_link( dec, queue );<br>&nbsp;&nbsp;&nbsp; gst_element_link( queue, identity );<br>&nbsp;&nbsp;&nbsp; gst_element_link( identity, conv );<br>&nbsp;&nbsp;&nbsp; gst_element_link( conv, scale );<br>

&nbsp;&nbsp;&nbsp; gst_element_link( scale, sink );<br><br><br>&nbsp;&nbsp;&nbsp; /* start the bin */<br>&nbsp;&nbsp;&nbsp; gst_element_set_state (pipeline, GST_STATE_PLAYING);<br><br>&nbsp;&nbsp;&nbsp; /* start play back and listed to events */<br>&nbsp;&nbsp;&nbsp; printf("go to main loop\n"); /* XXX you may start debugging here */<br>

&nbsp;&nbsp;&nbsp; g_main_loop_run (loop);<br>&nbsp;&nbsp;&nbsp; printf("return from main loop\n");<br><br>&nbsp;&nbsp;&nbsp; /* cleanup */<br>&nbsp;&nbsp;&nbsp; g_object_unref (pipeline);<br>&nbsp;&nbsp;&nbsp; g_object_unref (loop);<br><br>&nbsp;&nbsp;&nbsp; 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 'Device or resource busy' during 'pthread_mutex_destroy ((pthread_mutex_t *) mutex)'<br>

Trace/breakpoint trap<br><br><br>I'm stcuked in this phase. <br>Please help me.<br>Any comments, reading recommendations, would be very appreciated.<br><font color="#888888"><br>jaeyong<br><br>
</font><br>_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
<br></blockquote></div><br>
_______________________________________________<br>gstreamer-devel mailing list<br><a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br>http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel<br></blockquote></div><br></div></div></body></html>