<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 12/13/2011 02:40 PM, jaeyong yoo wrote:
    <blockquote
cite="mid:CANud0TFp7KbdAJGickoEguSOtZn-VLTqLwg=_-k4MwqP-1gqfw@mail.gmail.com"
      type="cite">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>
    </blockquote>
    <br>
    if you want to write a mediaplayer use playbin2 as the only element
    you need (its a toplevel pipeline and will plug whatever is needed).<br>
    <br>
    Stefan<br>
    <br>
    <blockquote
cite="mid:CANud0TFp7KbdAJGickoEguSOtZn-VLTqLwg=_-k4MwqP-1gqfw@mail.gmail.com"
      type="cite">
      <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>
      <br>
      jaeyong<br>
      <br>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
gstreamer-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>