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

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

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

stuart68
Hi

When chaning the code yo improve my debug output I mis-takenly removed my uridecodebin.

Here is the code now, but it still does not link correctly and I get no audio out.

    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() << "cret 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);

        uriDecodebin = gst_element_factory_make("uridecodebin", NULL);
        gst_bin_add(GST_BIN(pipeline), uriDecodebin);

        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 */
        qDebug() << "adding uriDeecode callback";
        g_signal_connect(G_OBJECT(uriDecodebin), "pad-added", G_CALLBACK(callbackPadAdded), this);

        qDebug() << "init output stage";
        initOutputStage(GST_BIN(pipeline));

        qDebug() << "ref elements";
        gst_object_ref(uriDecodebin);
        gst_object_ref(_sourceQ);

        return true;
    }


Cheers,
Stuart
Message: 5
Date: Wed, 5 Oct 2011 16:15:50 +0800
From: Stuart Gray <[hidden email]>
Subject: Re: Name queue20 is not unique in bin , not adding - when
       connecting      uridecodebin to queue2
To: [hidden email]
Message-ID:
       <[hidden email]>
Content-Type: text/plain; charset="iso-8859-1"

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
> *********************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111005/469630ca/attachment.htm>

------------------------------

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


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


_______________________________________________
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 (Stuart Gray)

stuart68
No matter how I try this, I never see my alsasink linking in the debug.

I have tried putting queue2 into a bin, creating a ghost pad and linking to the bin.

I have also tried keeping it all as elements and linking uridecodebin, audioconvert, audioresample and then queue2, but each time I still do not see alsasink being linked.

Using the queueBin just to hold queue2:

        gst_bin_add_many(GST_BIN(pipeline), uriDecodebin, queueBin, NULL);
        qDebug() << "link many in streaming";
        gst_element_link_many(uriDecodebin, queueBin, _pcmSink, NULL);

Others seemed to have ad issues linking uridecodebin to queue2, but this part seems to be fine, it is linking the queueBin to the alsasink, _psmSink that I cannot get to work.

Do I need to create a src pad on the queueBin? Then add a callBackPadAdded on _pcmSink and when this gets called link it to a src pad on queueBin?

I have debug.txttried using queue, but again it is the alsasink that does not get linked.

My ideal pipeline would be:

uridecodebin ! queue2 ! alsasink

Using gst-launch this works really well, but I cannot code it up and get it to produce audio.

Stuart



Reply | Threaded
Open this post in threaded view
|

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

Luciana Fujii Pontello-2
In reply to this post by stuart68
On Wed, 2011-10-05 at 16:37 +0800, Stuart Gray wrote:
> Hi
>
> When chaning the code yo improve my debug output I mis-takenly removed
> my uridecodebin.

Didn't you also remove the code to link the queue to the sink? In the
callback you were linking the uridecodebin to the queue, before that you
should link the queue to the audiosink.

Regards,

Luciana Fujii

> Here is the code now, but it still does not link correctly and I get
> no audio out.
>
>     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() << "cret 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);
>
>         uriDecodebin = gst_element_factory_make("uridecodebin", NULL);
>         gst_bin_add(GST_BIN(pipeline), uriDecodebin);
>
>         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 */
>         qDebug() << "adding uriDeecode callback";
>         g_signal_connect(G_OBJECT(uriDecodebin), "pad-added",
> G_CALLBACK(callbackPadAdded), this);
>
>         qDebug() << "init output stage";
>         initOutputStage(GST_BIN(pipeline));
>
>         qDebug() << "ref elements";
>         gst_object_ref(uriDecodebin);
>         gst_object_ref(_sourceQ);
>
>         return true;
>     }
>
>
> Cheers,
> Stuart



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