Hi,
In trying to connect uridecodebin to queue2 I get the following output from gstreamer: (<unknown>:1363): GStreamer-WARNING **: Name queue20 is not unique in bin , not adding My gstreamer versions are as follows: gstreamer-0.10.31 gst-plugins-base-0.10.31 gst-plugins-good-0.10.26 gst-plugins-bad-0.10.20 My code is as follows: pipeline = gst_pipeline_new(""); uriDecodebin = gst_element_factory_make("uridecodebin", NULL); g_object_set(G_OBJECT(uriDecodebin), "buffer-size", 150000, NULL); g_object_set(G_OBJECT(uriDecodebin), "download", false, NULL); g_object_set(G_OBJECT(uriDecodebin), "use-buffering", false, NULL); g_signal_connect(G_OBJECT(uriDecodebin), "drained", G_CALLBACK(sourceDrainedCallback), this); /* connect uridecodebin to _sourceQ when it creates its output pad */ g_signal_connect(G_OBJECT(uriDecodebin), "pad-added", G_CALLBACK(callbackPadAdded), this); outputBin = gst_bin_new("output-bin"); ... _sourceQ = gst_element_factory_make("queue2", NULL); gst_bin_add_many(GST_BIN(outputBin), _sourceQ, _pcmSink, NULL); ... // link the static parts together gst_element_link_many(_sourceQ, _pcmSink, NULL); Stuart _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
On Tue, 2011-10-04 at 10:43 +0800, Stuart Gray wrote:
> In trying to connect uridecodebin to queue2 I get the following output > from gstreamer: > > (<unknown>:1363): GStreamer-WARNING **: Name queue20 is not unique in > bin , not adding > > My code is as follows: > > pipeline = gst_pipeline_new(""); > > uriDecodebin = gst_element_factory_make("uridecodebin", NULL); > > g_object_set(G_OBJECT(uriDecodebin), "buffer-size", 150000, > NULL); > g_object_set(G_OBJECT(uriDecodebin), "download", false, NULL); > g_object_set(G_OBJECT(uriDecodebin), "use-buffering", false, > NULL); > g_signal_connect(G_OBJECT(uriDecodebin), "drained", > G_CALLBACK(sourceDrainedCallback), this); > /* connect uridecodebin to _sourceQ when it creates its output > pad */ > g_signal_connect(G_OBJECT(uriDecodebin), "pad-added", > G_CALLBACK(callbackPadAdded), this); > > outputBin = gst_bin_new("output-bin"); > ... > _sourceQ = gst_element_factory_make("queue2", NULL); > gst_bin_add_many(GST_BIN(outputBin), _sourceQ, _pcmSink, > NULL); > ... What does your callbackPadAdded look like? I'm guessing you are creating "queue" elements in there. It's basically a bug in the way GStreamer creates default names for elements if you don't specify one. The first "queue2" instance will get named "queue20" and the twentieth "queue" instance will get named "queue20" as well, which may cause problems if you are using both at the same time. It's hard to change now though, because it would break code that relies on the the naming scheme. In this case, you could just use a normal queue instead of queue2 before the sink (or just not use a queue at all?). Cheers -Tim _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by stuart68
Hi Tim,
I had already begun to think of an alternative way to do this. I was thinking about using BINs. As I am running within an embedded system I need to queue2 to put the second part of the pipeline into a different thread and also to buffer data in a way that I can control. I have re-written the code as following: virtual bool init() { if (!GStreamerPlayerBase::init()) { return false; } pipeline = gst_pipeline_new(""); // Audio bin audiobin = gst_bin_new("audiobin"); qDebug() << "adding audiobin to pipeline"; gst_bin_add(GST_BIN(pipeline), audiobin); qDebug() << "adding elements"; _sourceQ = gst_element_factory_make("queue2", NULL); quint64 maxBufferTime = 0; // disable guint maxBufferBytes = Settings::getValue<int>(Settings::SECTION_RECEIVE + Settings::RECEIVE_MAX_BUFFER_SIZE); guint highPercent = Settings::getValue<int>(Settings::SECTION_RECEIVE + Settings::RECEIVE_BUFFER_HIGHPERC); guint lowPercent = Settings::getValue<int>(Settings::SECTION_RECEIVE + Settings::RECEIVE_BUFFER_LOWPERC); bool useBuffering = Settings::getValue<int>(Settings::SECTION_RECEIVE + Settings::RECEIVE_USE_BUFFER); //this queue is used to force buffering of more data, the intention //being to help with internet radio drop out g_object_set(G_OBJECT(_sourceQ), "max-size-buffers", 0, "max-size-time", maxBufferTime, "max-size-bytes", maxBufferBytes, "use-buffering", useBuffering, "high-percent", highPercent, "low-percent", lowPercent, NULL); qDebug() << "add source to bin elements"; gst_bin_add(GST_BIN(audiobin), _sourceQ); qDebug() << "create sourceQ sink pad"; GstPad* pad = gst_element_get_pad(_sourceQ, "sink"); gst_element_add_pad(audiobin, gst_ghost_pad_new("sink", pad)); gst_object_unref(pad); qDebug() << "init output stage"; initOutputStage(GST_BIN(pipeline)); qDebug() << "ref elements"; gst_object_ref(uriDecodebin); gst_object_ref(_sourceQ); return true; } my callbackPadAdded is: static void callbackPadAdded(GstElement *uriDecodebin, GstPad *pad, gpointer self) { GStreamerDecodebinPrivate* obj = reinterpret_cast<GStreamerDecodebinPrivate*>(self); GstPad* const audiopad = gst_element_get_pad(obj->audiobin, "sink"); qDebug() << "uridecodebin pad add started"; Q_UNUSED(uriDecodebin); if (GST_PAD_IS_LINKED(audiopad)) { qDebug() << "audiopad is already linked. Unlinking old pad."; gst_pad_unlink(audiopad, GST_PAD_PEER(audiopad)); } qDebug() << "uridecodebin pad added"; gst_pad_link(pad, audiopad); gst_object_unref(audiopad); } For the above I would like to add setting of caps to the uridecodebin. Setting of the output stage is: void initOutputStage(GstBin* outputBin) { QString dev = Settings::getValue<QString>( Settings::SECTION_DEVICES + Settings::AUDIO_OUTPUT ); _pcmSink = gst_element_factory_make("alsasink", NULL); g_object_set(G_OBJECT(_pcmSink), "device", dev.toLatin1().data(), NULL); GstBaseAudioSinkSlaveMethod slaveMethod = GST_BASE_AUDIO_SINK_SLAVE_NONE; g_object_set(G_OBJECT(_pcmSink), "sync", 0, "async", 0, "slave-method", slaveMethod, NULL); gst_bin_add(GST_BIN(outputBin), _pcmSink); // link the static parts together gst_element_link(_pcmSink, NULL); bool usePlayBin = Settings::getValue<bool>(Settings::SECTION_AUDIO + Settings::USE_PLAYBIN); } I get no audio from the code when I try to run this. I do not see how to link the BUN together and get it into the playing state. I have the following: gst_element_link_many(uriDecodebin, _sourceQ, _pcmSink, NULL); During initialization I get the following warning: ref elements (<unknown>:2847): GStreamer-CRITICAL **: gst_object_ref: assertion `object != NULL' failed When I try to link it all together I get: link many in streaming (<unknown>:2847): GStreamer-CRITICAL **: gst_element_link_many: assertion `GST_IS_ELEMENT (element_1)' failed Code: virtual void linkStreaming() { qDebug() << "linking in streaming"; gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); if (passThroughLinked) { gst_element_set_state(GST_ELEMENT(recPipeline), GST_STATE_NULL); // gst_bin_remove_many(GST_BIN(pipeline), passThroughFakeSource, passThroughCapsFilter, _audioResample, NULL); } qDebug() << "link many in streaming"; gst_element_link_many(uriDecodebin, _sourceQ, _pcmSink, NULL); passThroughLinked = false; } I think if I use the BIN to put _sourceQ into I can get the callBackPadAdded to work correctly. But with BINs I am unsure how to link them together correctly and I suspect this is where my error is. My goal is to have the very simple pipeline: uridecodebin ! queue2 ! alsasink Thanks, Stuart On 5 October 2011 03:00, <[hidden email]> wrote: Send gstreamer-devel mailing list submissions to _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |