Name queue20 is not unique in bin , not adding - when connecting uridecodebin to queue2
Stuart Gray
stuart68 at gmail.com
Wed Oct 5 01:15:50 PDT 2011
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, <gstreamer-devel-request at lists.freedesktop.org>wrote:
> Send gstreamer-devel mailing list submissions to
> gstreamer-devel at lists.freedesktop.org
>
> To subscribe or unsubscribe via the World Wide Web, visit
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
> or, via email, send a message with subject or body 'help' to
> gstreamer-devel-request at lists.freedesktop.org
>
> You can reach the person managing the list at
> gstreamer-devel-owner at lists.freedesktop.org
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of gstreamer-devel digest..."
>
>
> Today's Topics:
>
> 1. Re: Name queue20 is not unique in bin , not adding - when
> connecting uridecodebin to queue2 (Tim-Philipp M?ller)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Tue, 04 Oct 2011 09:25:52 +0100
> From: Tim-Philipp M?ller <t.i.m at zen.co.uk>
> Subject: Re: Name queue20 is not unique in bin , not adding - when
> connecting uridecodebin to queue2
> To: gstreamer-devel at lists.freedesktop.org
> Message-ID: <1317716752.4063.3.camel at zingle>
> Content-Type: text/plain; charset="UTF-8"
>
> 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
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>
> End of gstreamer-devel Digest, Vol 9, Issue 8
> *********************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111005/469630ca/attachment.html>
More information about the gstreamer-devel
mailing list