<div dir="ltr">2008/10/12 Štěpán <span dir="ltr">&lt;<a href="mailto:stepan1117@atlas.cz">stepan1117@atlas.cz</a>&gt;</span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi, I am really new to gstreamer and I am trying to play an .avi file<br>
(for a start). I am able to play the file with<br>
<br>
gst-launch &nbsp;filesrc &nbsp;location=something.avi &nbsp;! &nbsp;avidemux<br>
name=demuxer &nbsp; demuxer. &nbsp;! &nbsp;queue ! ffdec_mpeg4 ! ffmpegcolorspace !<br>
sdlvideosink &nbsp; demuxer. ! queue ! mad ! audioconvert ! audioresample !<br>
osssink<br>
<br>
But I need to do that in a program, so I tried to rewrite it to the<br>
code. Here is what I have now (argv[1] is the name of input .avi):<br>
<br>
----------- code begins ------------<br>
GMainLoop *loop;<br>
<br>
 &nbsp; &nbsp;GstElement *pipeline, *source, *demuxer, *decoder,<br>
*conv,*mpeg_decoder,*mpeg_space,<br>
<br>
*video_sink,*audio_decoder,*audio_convert,*audio_resample,*audio_sink,*video_bin,<br>
*audio_bin,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;*video_queue,*audio_queue;<br>
 &nbsp; &nbsp;GstBus *bus;<br>
<br>
 &nbsp; &nbsp;/* Initialisation */<br>
 &nbsp; &nbsp;gst_init(&amp;argc, &amp;argv);<br>
<br>
 &nbsp; &nbsp;loop = g_main_loop_new(NULL, FALSE);<br>
<br>
 &nbsp; &nbsp;/* Create gstreamer elements */<br>
 &nbsp; &nbsp;pipeline = gst_pipeline_new (&quot;video-player&quot;);<br>
 &nbsp; &nbsp;source = gst_element_factory_make (&quot;filesrc&quot;, &quot;file-source&quot;); //<br>
source<br>
 &nbsp; &nbsp;demuxer = gst_element_factory_make (&quot;avidemux&quot;, &quot;avi-demuxer&quot;); //<br>
demuxer<br>
<br>
 &nbsp; &nbsp;video_queue = gst_element_factory_make(&quot;queue&quot;,&quot;video_queue&quot;); //<br>
video fronta<br>
 &nbsp; &nbsp;mpeg_decoder = gst_element_factory_make (&quot;ffdec_mpeg4&quot;,<br>
&quot;mpeg-decoder&quot;); // mpeg decoder<br>
 &nbsp; &nbsp;mpeg_space = gst_element_factory_make (&quot;ffmpegcolorspace&quot;,<br>
&quot;color-space&quot;); // color space<br>
 &nbsp; &nbsp;video_sink = gst_element_factory_make(&quot;sdlvideosink&quot;,<br>
&quot;video_sink&quot;); // vykreslovac<br>
<br>
 &nbsp; &nbsp;audio_queue = gst_element_factory_make(&quot;queue&quot;,&quot;audio_queue&quot;);<br>
 &nbsp; &nbsp;audio_decoder = gst_element_factory_make (&quot;mad&quot;, &quot;audio-decoder&quot;);<br>
 &nbsp; &nbsp;audio_convert = gst_element_factory_make (&quot;audioconvert&quot;,<br>
&quot;audio-convert&quot;);<br>
 &nbsp; &nbsp;audio_resample = gst_element_factory_make(&quot;audioresample&quot;,<br>
&quot;audio_resample&quot;);<br>
 &nbsp; &nbsp;audio_sink = gst_element_factory_make (&quot;autoaudiosink&quot;, &quot;audio-sink&quot;);<br>
<br>
 &nbsp; &nbsp;if (!pipeline || !source || !mpeg_decoder || !mpeg_space ||<br>
!video_sink || !audio_decoder<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|| !audio_convert || !audio_resample || !audio_sink ||<br>
!video_queue || !audio_queue){<br>
 &nbsp; &nbsp; &nbsp; &nbsp;g_printerr (&quot;One element could not be created. Exiting.\n&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;/* we set the input filename to the source element */<br>
 &nbsp; &nbsp;g_object_set (G_OBJECT (source), &quot;location&quot;, argv[1], NULL);<br>
<br>
 &nbsp; &nbsp;video_bin = gst_pipeline_new (&quot;video_bin&quot;);<br>
 &nbsp; &nbsp;gst_bin_add_many (GST_BIN (video_bin),video_queue, mpeg_decoder,<br>
mpeg_space, video_sink, NULL);<br>
 &nbsp; &nbsp;gst_element_link_many (mpeg_decoder,<br>
video_queue,mpeg_space,video_sink, NULL);<br>
<br>
 &nbsp; &nbsp;audio_bin = gst_pipeline_new (&quot;audio_bin&quot;);<br>
 &nbsp; &nbsp;gst_bin_add_many (GST_BIN (audio_bin), audio_queue,audio_decoder,<br>
audio_convert,audio_resample,audio_sink, NULL);<br>
 &nbsp; &nbsp;gst_element_link_many ( audio_decoder,<br>
audio_queue,audio_convert,audio_resample,audio_sink, NULL);<br>
<br>
 &nbsp; &nbsp;/* we add a message handler */<br>
 &nbsp; &nbsp;bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<br>
 &nbsp; &nbsp;gst_bus_add_watch (bus, bus_call, loop);<br>
 &nbsp; &nbsp;gst_object_unref (bus);<br>
<br>
 &nbsp; &nbsp;gst_bin_add_many (GST_BIN (pipeline), source,demuxer,NULL);<br>
 &nbsp; &nbsp;gst_element_link(source,demuxer);<br>
<br>
 &nbsp; &nbsp;gst_bin_add (GST_BIN (pipeline), video_bin);<br>
 &nbsp; &nbsp;gst_bin_add (GST_BIN (pipeline), audio_bin);<br>
<br>
 &nbsp; &nbsp;gst_element_link(demuxer,video_bin);<br>
 &nbsp; &nbsp;gst_element_link(demuxer,audio_bin);<br>
<br>
 &nbsp; &nbsp;/* Set the pipeline to &quot;playing&quot; state*/<br>
 &nbsp; &nbsp;g_print (&quot;Now playing: %s\n&quot;, argv[1]);<br>
 &nbsp; &nbsp;gst_element_set_state (pipeline, GST_STATE_PLAYING);<br>
<br>
 &nbsp; &nbsp;/* Iterate */<br>
 &nbsp; &nbsp;g_print (&quot;Running...\n&quot;);<br>
 &nbsp; &nbsp;g_main_loop_run (loop);<br>
<br>
 &nbsp; &nbsp;/* Out of the main loop, clean up nicely */<br>
 &nbsp; &nbsp;g_print (&quot;Returned, stopping playback\n&quot;);<br>
 &nbsp; &nbsp;gst_element_set_state (pipeline, GST_STATE_NULL);<br>
<br>
 &nbsp; &nbsp;g_print (&quot;Deleting pipeline\n&quot;);<br>
 &nbsp; &nbsp;gst_object_unref (GST_OBJECT (pipeline));<br>
----------- code ends --------------<br>
<br>
But this does not work, I always end with this error:<br>
gstavidemux.c(3779): gst_avi_demux_loop ():<br>
/GstPipeline:video-player/GstAviDemux:avi-demuxer:\nstreaming stopped,<br>
reason not-linked&quot;<br>
<br>
Or, more precisely from the stderr:<br>
<br>
---- log begins -----<br>
0:00:16.645434576 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[37mLOG &nbsp; [00m<br>
&nbsp;[00;01;35m &nbsp; &nbsp; &nbsp;GST_SCHEDULING<br>
gstpad.c:4069:gst_pad_push:&lt;avi-demuxer:video_00&gt; [00m pushing, but it<br>
was not linked<br>
0:00:16.645442485 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[37mLOG &nbsp; [00m<br>
&nbsp;[00m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;avidemux<br>
gstavidemux.c:3363:gst_avi_demux_combine_flows:&lt;avi-demuxer&gt; [00m<br>
cobined return not-linked<br>
0:00:16.645450229 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[36mDEBUG [00m<br>
&nbsp;[00m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;avidemux<br>
gstavidemux.c:3466:gst_avi_demux_process_next_entry:&lt;avi-demuxer&gt; [00m<br>
Processed buffer 3: not-linked<br>
0:00:16.645458033 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[36mDEBUG [00m<br>
&nbsp;[00m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;avidemux<br>
gstavidemux.c:3474:gst_avi_demux_process_next_entry:&lt;avi-demuxer&gt; [00m<br>
returning not-linked<br>
0:00:16.645464954 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[32;01mINFO &nbsp;[00m<br>
&nbsp;[00m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;avidemux gstavidemux.c:3736:gst_avi_demux_loop: [00m<br>
stream_movi flow: not-linked<br>
0:00:16.645472746 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[37mLOG &nbsp; [00m<br>
&nbsp;[00m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;avidemux<br>
gstavidemux.c:3752:gst_avi_demux_loop:&lt;avi-demuxer&gt; [00m pausing task,<br>
reason not-linked<br>
0:00:16.645481639 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[36mDEBUG [00m<br>
&nbsp;[00;01;37;41m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GST_PADS<br>
gstpad.c:4768:gst_pad_pause_task:&lt;avi-demuxer:sink&gt; [00m pause task<br>
0:00:16.645491405 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[36mDEBUG [00m<br>
&nbsp;[00m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;task gsttask.c:476:gst_task_pause:&lt;task2&gt; [00m<br>
Pausing task 0x9c7940<br>
0:00:16.645609511 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[33;01mWARN &nbsp;[00m<br>
&nbsp;[00m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;avidemux<br>
gstavidemux.c:3779:gst_avi_demux_loop:&lt;avi-demuxer&gt; [00m error:<br>
Vnitřní chyba datového proudu.<br>
0:00:16.645619223 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[33;01mWARN &nbsp;[00m<br>
&nbsp;[00m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;avidemux<br>
gstavidemux.c:3779:gst_avi_demux_loop:&lt;avi-demuxer&gt; [00m error:<br>
streaming stopped, reason not-linked<br>
0:00:16.645631090 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[36mDEBUG [00m<br>
&nbsp;[00;04m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default<br>
gstelement.c:1644:gst_element_message_full:&lt;avi-demuxer&gt; [00m start-&gt;1<br>
0:00:16.645691274 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[32;01mINFO &nbsp;[00m<br>
&nbsp;[00;01;31;47m &nbsp; &nbsp;GST_ERROR_SYSTEM<br>
gstelement.c:1675:gst_element_message_full:&lt;avi-demuxer&gt; [00m posting<br>
message: Vnitřní chyba datového proudu.<br>
0:00:16.645704961 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[37mLOG &nbsp; [00m<br>
&nbsp;[00;01;37;41m &nbsp; &nbsp; &nbsp; &nbsp; GST_MESSAGE<br>
gstmessage.c:204:gst_message_init: [00m new message 0x92f6c0<br>
0:00:16.645713569 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[37mLOG &nbsp; [00m<br>
&nbsp;[00;01;37;41m &nbsp; &nbsp; &nbsp; &nbsp; GST_MESSAGE<br>
gstmessage.c:289:gst_message_new_custom: [00m source avi-demuxer:<br>
creating new message 0x92f6c0 error<br>
0:00:16.645740710 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[36mDEBUG [00m<br>
&nbsp;[00;43m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GST_BUS gstbus.c:337:gst_bus_post:&lt;bus0&gt; [00m<br>
[msg 0x92f6c0] posting on bus, type error, GstMessageError,<br>
gerror=(GstGError)(NULL), debug=(string)&quot;gstavidemux.c\(3779\):\<br>
gst_avi_demux_loop\ \(\):\<br>
/GstPipeline:video-player/GstAviDemux:avi-demuxer:\012streaming\<br>
stopped\,\ reason\ not-linked&quot;; from source &lt;avi-demuxer&gt;<br>
0:00:16.645759690 &nbsp;[336m10637 [00m 0x7fa59c000b50 &nbsp;[36mDEBUG [00m<br>
&nbsp;[00;01m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bin<br>
gstbin.c:2729:gst_bin_handle_message_func:&lt;video-player&gt; [00m [msg<br>
0x92f6c0] handling child avi-demuxer message of type error<br>
---- log ends ------<br>
<br>
Linked against gstreamer v. 0.10.21-42.pm.2, gstreamer-plugins-good v.<br>
0.10.7-38.1 on Opensuse 11 x86-64, 2.6.25.16-0.1-default<br>
<br>
<br>
There is definitely something, what I am doing wrong, but I am unable<br>
to find it...<br>
</blockquote><div><br>You can&#39;t link the demuxer to your output bins like that. The demuxer uses &#39;sometimes&#39; pads. Reading this you certainly help you:&nbsp; <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html</a><br>
&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
Thanks in advance<br>
<br>
<br>
-------------------------------------------------------------------------<br>
This SF.Net email is sponsored by the Moblin Your Move Developer&#39;s challenge<br>
Build the coolest Linux based applications with Moblin SDK &amp; win great prizes<br>
Grand prize is a trip for two to an Open Source event anywhere in the world<br>
<a href="http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/" target="_blank">http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/</a><br>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.sourceforge.net">gstreamer-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>Thiago Sousa Santos<br><br>Embedded Systems and Pervasive Computing Lab (Embedded)<br>Center of Electrical Engineering and Informatics (CEEI)<br>Federal University of Campina Grande (UFCG)<br>

</div>