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