[gst-devel] Problems with deinterleave plugin
Alexey Chernov
4ernov at gmail.com
Mon Sep 28 18:34:19 CEST 2009
Hi Stefan,
Thank you very much for help, I'll try your suggestions. The project is
targeted to be public and OSS, of course (it's Laudi, laudi.sourceforge.net)
but I'm afraid not mature enough for any releases yet.. There're some ugly
places in my code it's because the project itself is on C++ but I removed any
class stuff and make it like global variables.
link_two_elements() is this:
void link_two_elements(GstElement* src_element, GstElement* sink_element)
{
if(!gst_element_link(src_element, sink_element))
g_debug("Error linking %s to %s", gst_element_get_name(src_element),
gst_element_get_name(sink_element));
}
I also wanted to ask: can these warnings I wrote lead to hang up of the
pipeline? After them it's like it is paused, no messages and no progress, but
in GST_LEVEL_DEBUG level the output is as it plays the same chunk of file (as
of timestamps).
Thanks again for support, it was the big problem for me..
В сообщении от Понедельник 28 сентября 2009 16:51:36 автор Stefan Kost
написал:
> hi,
>
> I'll put some comments inline
>
> Alexey Chernov schrieb:
> > Hello,
> >
> > I'm working on a sound editor based on GStreamer and I faced the problem
> > with deinterleave plugin recently.
>
> Is there project public?
>
> > To load and decode file I use pipeline: filesrc, decodebin, audioconvert,
> > audioresample, deinterleave and then several branches containing queue,
> > audioconvert and appsink (for the experiment I changed it to fakesink).
> >
> > Here's the code of main function:
> >
> > GMainLoop* _loop;
> >
> > GstElement* _pipeline;
> >
> > void load_file(const char* filename)
> > {
> > GstElement *source, *decodebin, *audio_convert, *audio_resample, *deint;
> > GstBus* bus;
> >
> >
> >
> > if (_loop)
> > {
> > g_main_loop_quit(_loop);
> > g_main_loop_unref(_loop);
> > }
> > _loop = g_main_loop_new (NULL, FALSE);
> >
> > /* Create gstreamer elements */
> > if (_pipeline)
> > {
> > gst_element_set_state (_pipeline, GST_STATE_NULL);
> > gst_object_unref (GST_OBJECT (_pipeline));
> > _pipeline=0;
> > }
> > _pipeline = gst_pipeline_new("decode_to_app");
> > source = gst_element_factory_make("filesrc", "filesrc");
> > decodebin = gst_element_factory_make("decodebin", "decode_bin");
> > audio_convert =
> > gst_element_factory_make("audioconvert","audio-convert"); audio_resample
> > = gst_element_factory_make("audioresample","audio-resample"); deint =
> > gst_element_factory_make("deinterleave", "deint");
> >
> >
> > if (!_pipeline || !source || !decodebin || !audio_convert || !deint)
> > {
> > std::cerr<<"Elements could not be created. Exiting."<<std::endl;
> > }
> >
> > /* Set up the pipeline */
> >
> > /* we set the properties to the source element to receive only rtp
> > packets*/ g_object_set(G_OBJECT (source), "location", filename, NULL);
> >
> > /* we add a message handler */
> > bus = gst_pipeline_get_bus (GST_PIPELINE (_pipeline));
> >
> > gst_bus_add_watch (bus, bus_call, this);
> > gst_object_unref (bus);
> >
> > /* we add all elements into the pipeline */
> > gst_bin_add_many (GST_BIN (_pipeline), source, decodebin, audio_convert,
> > audio_resample, deint, NULL);
> >
> > /* we link all the elements together */
> > link_two_elements(source, decodebin);
> > link_two_elements(audio_resample, audio_convert);
> > link_two_elements(audio_convert,deint);
>
> what is link_two_elements() doing differently from gst_element_link()?
>
> > g_signal_connect (decodebin, "new-decoded-pad", G_CALLBACK (cb_new_pad),
> > audio_resample);
> > g_signal_connect (deint, "pad-added", G_CALLBACK (il_new_pad), 0);
> >
> > /* Set the pipeline to "playing" state*/
> > gst_element_set_state (_pipeline, GST_STATE_PLAYING);
> >
> > /* Iterate */
> > g_print ("Running...\n");
> > g_main_loop_run (_loop);
> >
> > /* Out of the main loop, clean up nicely */
> > g_print ("Returned, stopping listening\n");
> > gst_element_set_state (_pipeline, GST_STATE_NULL);
> >
> > g_print ("Deleting pipeline\n");
> > gst_object_unref (GST_OBJECT (_pipeline));
> > }
> >
> > Here's il_new_pad implementation:
> >
> >
> > int _channels=0;
>
> The global channels variable is a bit ugly (and might even be racy)..
>
> > void il_new_pad (GstElement *decodebin, GstPad *pad, gpointer data)
> > {
> > GstElement* element=0;
> > if (_pipeline)
> > {
> > GstElement *queue, *aconv, *ares, *appsink;
> >
> > char* num=itoa(_channels,num,10);
> >
> > char* name="queue";
> > strcat(name,num);
> > queue = gst_element_factory_make("queue", name);
>
> There is no need to do that.
> queue = gst_element_factory_make("queue", NULL);
> will make a unique name.
>
> > char* name="aconv";
> > strcat(name,num);
> > aconv = gst_element_factory_make("audioconvert", name);
> >
> > char* name="sink";
> > strcat(name,num);
> > appsink = gst_element_factory_make("fakesink", name);
> >
> > gst_bin_add_many (GST_BIN (_pipeline), queue, aconv, appsink, NULL);
>
> Do gst_element_sync_state_with_parent() for each of the new elements.
> That hopefully fixes the warnings you see.
>
> Stefan
>
> > link_two_elements(queue, aconv);
> > link_two_elements(aconv,appsink);
> >
> > g_object_set(G_OBJECT (appsink), "sync", FALSE, NULL);
> >
> > element=queue;
> >
> > ++_channels;
> > }
> >
> > GstCaps *caps;
> > GstStructure *str;
> > GstPad *audiopad;
> >
> > /* only link once */
> > audiopad = gst_element_get_static_pad (element, "sink");
> > if (GST_PAD_IS_LINKED (audiopad))
> > {
> > g_object_unref (audiopad);
> > }
> >
> > /* check media type */
> > caps = gst_pad_get_caps (pad);
> > str = gst_caps_get_structure (caps, 0);
> > if (!g_strrstr (gst_structure_get_name (str), "audio"))
> > {
> > std::cerr<<"won't connect!"<<std::endl;
> > gst_caps_unref (caps);
> > gst_object_unref (audiopad);
> > }
> > gst_caps_unref (caps);
> >
> > /* link'n'play */
> > gst_pad_link (pad, audiopad);
> > }
> >
> > Everything seem to start OK, il_new_pad procedure works two times (for
> > stereo file), but then I've got the following messages in console:
> >
> > 0:00:01.703963841 5174 0x1d712a0 INFO GST_EVENT
> > gstpad.c:4675:gst_pad_send_event:<queue0:sink> Received event on flushing
> > pad. Discarding
> >
> > 0:00:01.703978717 5174 0x1d712a0 INFO GST_EVENT
> > gstpad.c:4675:gst_pad_send_event:<queue1:sink> Received event on flushing
> > pad. Discarding
> >
> > 0:00:01.703995479 5174 0x1d712a0 INFO GST_EVENT
> > gstpad.c:4675:gst_pad_send_event:<queue0:sink> Received event on flushing
> > pad. Discarding
> >
> > 0:00:01.704007213 5174 0x1d712a0 INFO GST_EVENT
> > gstpad.c:4675:gst_pad_send_event:<queue1:sink> Received event on flushing
> > pad. Discarding
> >
> > 0:00:01.704021111 5174 0x1d712a0 INFO GST_EVENT
> > gstpad.c:4675:gst_pad_send_event:<queue0:sink> Received event on flushing
> > pad. Discarding
> >
> > 0:00:01.704032565 5174 0x1d712a0 INFO GST_EVENT
> > gstpad.c:4675:gst_pad_send_event:<queue1:sink> Received event on flushing
> > pad. Discarding
> >
> > 0:00:01.704047371 5174 0x1d712a0 INFO GST_EVENT
> > gstpad.c:4675:gst_pad_send_event:<queue0:sink> Received event on flushing
> > pad. Discarding
> >
> > 0:00:01.704058825 5174 0x1d712a0 INFO GST_EVENT
> > gstpad.c:4675:gst_pad_send_event:<queue1:sink> Received event on flushing
> > pad. Discarding
> >
> > 0:00:01.704073143 5174 0x1d712a0 WARN deinterleave
> > deinterleave.c:810:gst_deinterleave_process: gst_pad_alloc_buffer()
> > returned wrong-state
> >
> > 0:00:01.704371435 5174 0x1d712a0 WARN deinterleave
> > deinterleave.c:810:gst_deinterleave_process: gst_pad_alloc_buffer()
> > returned wrong-state
> >
> > 0:00:01.704564057 5174 0x1d712a0 WARN deinterleave
> > deinterleave.c:810:gst_deinterleave_process: gst_pad_alloc_buffer()
> > returned wrong-state
> >
> > 0:00:01.704730419 5174 0x1d712a0 WARN deinterleave
> > deinterleave.c:810:gst_deinterleave_process: gst_pad_alloc_buffer()
> > returned wrong-state
> >
> > 0:00:01.704894197 5174 0x1d712a0 WARN deinterleave
> > deinterleave.c:810:gst_deinterleave_process: gst_pad_alloc_buffer()
> > returned wrong-state
> >
> > 0:00:01.704937428 5174 0x1d712a0 INFO basesrc
> > gstbasesrc.c:2278:gst_base_src_loop:<filesrc> pausing after
> > gst_pad_push() = wrong-state
> >
> > What was the wrong in my setup? Could you please suggest how can I fix it
> > to get the proper behavior (that new branch with appsink (fakesink) is
> > added to pipeline when the new channel is recognized).
> >
> > Thank you very much in advance!
> >
> > Alexey Chernov
> >
> > -------------------------------------------------------------------------
> >----- Come build with us! The BlackBerry® Developer Conference in SF,
> > CA is the only developer event you need to attend this year. Jumpstart
> > your developing skills, take BlackBerry mobile applications to market and
> > stay ahead of the curve. Join us from November 9-12, 2009. Register
> > now! http://p.sf.net/sfu/devconf
> > _______________________________________________
> > gstreamer-devel mailing list
> > gstreamer-devel at lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>
More information about the gstreamer-devel
mailing list