Name queue20 is not unique in bin , not adding - when connecting uridecodebin to queue2

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Name queue20 is not unique in bin , not adding - when connecting uridecodebin to queue2

stuart68
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
Reply | Threaded
Open this post in threaded view
|

Re: Name queue20 is not unique in bin , not adding - when connecting uridecodebin to queue2

Tim-Philipp Müller-2
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
Reply | Threaded
Open this post in threaded view
|

Re: Name queue20 is not unique in bin , not adding - when connecting uridecodebin to queue2

stuart68
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
       [hidden email]

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
       [hidden email]

You can reach the person managing the list at
       [hidden email]

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 <[hidden email]>
Subject: Re: Name queue20 is not unique in bin , not adding - when
       connecting uridecodebin to queue2
To: [hidden email]
Message-ID: <1317716752.4063.3.camel@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
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


End of gstreamer-devel Digest, Vol 9, Issue 8
*********************************************


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel