[gst-devel] Problems with deinterleave plugin

Alexey Chernov 4ernov at gmail.com
Tue Sep 29 00:06:38 CEST 2009


Thank you very much! I've added gst_element_sync_state_with_parent() and now 
it works perfect without such warnings. Thank you, Stefan!

В сообщении от Понедельник 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&reg; 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&#45;12, 2009. Register
> > now&#33; 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