creating bins and ghostpads

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

creating bins and ghostpads

Rohan-14

Hi all,

I am obviously doing something wrong here, but cannot figure out
what.

Essentially the pipeline is the same as the receiver but I have broken
it into bins.  I seem to be having problems with the ghostpad, because
I get this error:

(stream_receiver.py:1914): GStreamer-WARNING **: Trying to connect elements that
don't share a common ancestor: vidsource and vidbin

Traceback (most recent call last):
   File "stream_receiver.py", line 118, in <module>
     server()
   File "stream_receiver.py", line 27, in __init__
     vidsource.link(vidbin)
gst.LinkError: failed to link vidsource with vidbin

Here is the code:

----------------------------------------------------------------------
#!/bin/env python

# The gst pipeline
# pipe="udpsrc port=5000 ! smokedec ! autovideosink"
# # audio
# pipe="$pipe tcpclientsrc host=127.0.0.1 port=5001 ! "
# pipe="$pipe speexdec ! queue ! alsasink sync=false "

import sys,os
import gobject
import pygst
pygst.require("0.10")
import gst

class server (object):
     def __init__(self):
         # start with video

         self.pipe = gst.Pipeline("player")

         # video source
         vidsource = gst.element_factory_make("udpsrc", "vidsource")
         vidsource.set_property("port", 5000)

         vidbin = self.buildvid()
         self.pipe.add(vidbin)
         vidsource.link(vidbin)


         self.pipe.set_state(gst.STATE_PLAYING)

     def buildvid(self):
         bin = gst.Bin("vidbin")
         queue = gst.element_factory_make("queue")
         smokedec = gst.element_factory_make("smokedec")
         vidsink = gst.element_factory_make("autovideosink")
         bin.add(queue, smokedec, vidsink)
         gst.element_link_many(queue, smokedec, vidsink)

         # ghostpad
         binsink = gst.GhostPad("binsink", queue.get_pad("sink"))
         bin.add_pad(binsink)
         return bin

if __name__ == "__main__":
     server()
     loop = gobject.MainLoop()
     loop.run()

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

What is driving me slightly nuts is that if I put all the buildvid code
into init and have a long series of object instatiations with add to
pipeline and link it works, but as soon as I started messing with
ghostpads and bin (which makes the code much more manageable when
adding functionality for windows and macs) this messed up.  Below is
more code that works, and I cannot figure out why this and why not
that.

And the other thing is this does work in a commandline pipeline such
as the one sitting at the top of the script in comments.

I am using the same system for the sender, but I'll only include the
local display.  This sends an image happily, using the build_localvid
bin, and linking it to the camera.

-----------------------------------------------------------------------------
#!/bin/env python

import sys, os
import gobject
import pygst
pygst.require("0.10")
import gst

class client(object):

     def __init__(self):
         self.pipe = gst.Pipeline("sender")

         # Initial video input
         camera = gst.element_factory_make("v4l2src", "camera")
         vidtee = gst.element_factory_make("tee", "vidtee")
         self.pipe.add(camera, vidtee)
         camera.link(vidtee)

         # local video
         localvidbin = self.build_localvid()
         self.pipe.add(localvidbin)
         vidtee.link(localvidbin)

         self.pipe.set_state(gst.STATE_PLAYING)

     def build_localvid(self):
         """This bin takes a camera (video) stream and produces a live image
locally."""
         bin = gst.Bin("localvid")
         queue = gst.element_factory_make("queue")
         out = gst.element_factory_make("xvimagesink")
         bin.add(out, queue)
         queue.link_pads("src", out, "sink")
         binsink = gst.GhostPad("binsink", queue.get_pad("sink"))
         bin.add_pad(binsink)
         return bin

if __name__ == '__main__':
     client()
     loop = gobject.MainLoop()
     loop.run()

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

This does the correct thing, and I get a live image from the camera.

I am completely stumped on this one, and have resorted to using
gst.parse_bin_from_description() with the gst-launch pipeline, but
this is far from ideal from a maintenance perspective. :)

I am sure I am missing something pretty obvious, but so far flailing
around in my ignorance has not let me stumble on a solution.

Thanks for any help,

Rohan


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: creating bins and ghostpads

Aurelien Grimaud (elzz)
Add vidsource in pipeline ?

Rohan a écrit :

> Hi all,
>
> I am obviously doing something wrong here, but cannot figure out
> what.
>
> Essentially the pipeline is the same as the receiver but I have broken
> it into bins.  I seem to be having problems with the ghostpad, because
> I get this error:
>
> (stream_receiver.py:1914): GStreamer-WARNING **: Trying to connect elements that
> don't share a common ancestor: vidsource and vidbin
>
> Traceback (most recent call last):
>    File "stream_receiver.py", line 118, in <module>
>      server()
>    File "stream_receiver.py", line 27, in __init__
>      vidsource.link(vidbin)
> gst.LinkError: failed to link vidsource with vidbin
>
> Here is the code:
>
> ----------------------------------------------------------------------
> #!/bin/env python
>
> # The gst pipeline
> # pipe="udpsrc port=5000 ! smokedec ! autovideosink"
> # # audio
> # pipe="$pipe tcpclientsrc host=127.0.0.1 port=5001 ! "
> # pipe="$pipe speexdec ! queue ! alsasink sync=false "
>
> import sys,os
> import gobject
> import pygst
> pygst.require("0.10")
> import gst
>
> class server (object):
>      def __init__(self):
>          # start with video
>
>          self.pipe = gst.Pipeline("player")
>
>          # video source
>          vidsource = gst.element_factory_make("udpsrc", "vidsource")
>          vidsource.set_property("port", 5000)
>
>          vidbin = self.buildvid()
>          self.pipe.add(vidbin)
>          vidsource.link(vidbin)
>
>
>          self.pipe.set_state(gst.STATE_PLAYING)
>
>      def buildvid(self):
>          bin = gst.Bin("vidbin")
>          queue = gst.element_factory_make("queue")
>          smokedec = gst.element_factory_make("smokedec")
>          vidsink = gst.element_factory_make("autovideosink")
>          bin.add(queue, smokedec, vidsink)
>          gst.element_link_many(queue, smokedec, vidsink)
>
>          # ghostpad
>          binsink = gst.GhostPad("binsink", queue.get_pad("sink"))
>          bin.add_pad(binsink)
>          return bin
>
> if __name__ == "__main__":
>      server()
>      loop = gobject.MainLoop()
>      loop.run()
>
> ----------------------------------------------------------------------------
>
> What is driving me slightly nuts is that if I put all the buildvid code
> into init and have a long series of object instatiations with add to
> pipeline and link it works, but as soon as I started messing with
> ghostpads and bin (which makes the code much more manageable when
> adding functionality for windows and macs) this messed up.  Below is
> more code that works, and I cannot figure out why this and why not
> that.
>
> And the other thing is this does work in a commandline pipeline such
> as the one sitting at the top of the script in comments.
>
> I am using the same system for the sender, but I'll only include the
> local display.  This sends an image happily, using the build_localvid
> bin, and linking it to the camera.
>
> -----------------------------------------------------------------------------
> #!/bin/env python
>
> import sys, os
> import gobject
> import pygst
> pygst.require("0.10")
> import gst
>
> class client(object):
>
>      def __init__(self):
>          self.pipe = gst.Pipeline("sender")
>
>          # Initial video input
>          camera = gst.element_factory_make("v4l2src", "camera")
>          vidtee = gst.element_factory_make("tee", "vidtee")
>          self.pipe.add(camera, vidtee)
>          camera.link(vidtee)
>
>          # local video
>          localvidbin = self.build_localvid()
>          self.pipe.add(localvidbin)
>          vidtee.link(localvidbin)
>
>          self.pipe.set_state(gst.STATE_PLAYING)
>
>      def build_localvid(self):
>          """This bin takes a camera (video) stream and produces a live image
> locally."""
>          bin = gst.Bin("localvid")
>          queue = gst.element_factory_make("queue")
>          out = gst.element_factory_make("xvimagesink")
>          bin.add(out, queue)
>          queue.link_pads("src", out, "sink")
>          binsink = gst.GhostPad("binsink", queue.get_pad("sink"))
>          bin.add_pad(binsink)
>          return bin
>
> if __name__ == '__main__':
>      client()
>      loop = gobject.MainLoop()
>      loop.run()
>
> ---------------------------------------------------------------------------
>
> This does the correct thing, and I get a live image from the camera.
>
> I am completely stumped on this one, and have resorted to using
> gst.parse_bin_from_description() with the gst-launch pipeline, but
> this is far from ideal from a maintenance perspective. :)
>
> I am sure I am missing something pretty obvious, but so far flailing
> around in my ignorance has not let me stumble on a solution.
>
> Thanks for any help,
>
> Rohan
>
>
> ------------------------------------------------------------------------------
> Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
> is the only developer event you need to attend this year. Jumpstart your
> developing skills, take BlackBerry mobile applications to market and stay
> ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
> http://p.sf.net/sfu/devconf
> _______________________________________________
> gstreamer-devel mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>
>
>  


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: creating bins and ghostpads

Rohan-14
Aurelien Grimaud wrote:
> Add vidsource in pipeline ?
>

Oh lord, how embarrassing.

Thanks, that is exactly what the problem was.

Thanks again,

Rohan

> Rohan a écrit :
>> Hi all,
>>
>> I am obviously doing something wrong here, but cannot figure out
>> what.
>>
>> Essentially the pipeline is the same as the receiver but I have broken
>> it into bins.  I seem to be having problems with the ghostpad, because
>> I get this error:
>>
>> (stream_receiver.py:1914): GStreamer-WARNING **: Trying to connect elements that
>> don't share a common ancestor: vidsource and vidbin
>>
>> Traceback (most recent call last):
>>    File "stream_receiver.py", line 118, in <module>
>>      server()
>>    File "stream_receiver.py", line 27, in __init__
>>      vidsource.link(vidbin)
>> gst.LinkError: failed to link vidsource with vidbin
>>
>> Here is the code:
>>
>> ----------------------------------------------------------------------
>> #!/bin/env python
>>
>> # The gst pipeline
>> # pipe="udpsrc port=5000 ! smokedec ! autovideosink"
>> # # audio
>> # pipe="$pipe tcpclientsrc host=127.0.0.1 port=5001 ! "
>> # pipe="$pipe speexdec ! queue ! alsasink sync=false "
>>
>> import sys,os
>> import gobject
>> import pygst
>> pygst.require("0.10")
>> import gst
>>
>> class server (object):
>>      def __init__(self):
>>          # start with video
>>
>>          self.pipe = gst.Pipeline("player")
>>
>>          # video source
>>          vidsource = gst.element_factory_make("udpsrc", "vidsource")
>>          vidsource.set_property("port", 5000)
>>
>>          vidbin = self.buildvid()
>>          self.pipe.add(vidbin)
>>          vidsource.link(vidbin)
>>
>>
>>          self.pipe.set_state(gst.STATE_PLAYING)
>>
>>      def buildvid(self):
>>          bin = gst.Bin("vidbin")
>>          queue = gst.element_factory_make("queue")
>>          smokedec = gst.element_factory_make("smokedec")
>>          vidsink = gst.element_factory_make("autovideosink")
>>          bin.add(queue, smokedec, vidsink)
>>          gst.element_link_many(queue, smokedec, vidsink)
>>
>>          # ghostpad
>>          binsink = gst.GhostPad("binsink", queue.get_pad("sink"))
>>          bin.add_pad(binsink)
>>          return bin
>>
>> if __name__ == "__main__":
>>      server()
>>      loop = gobject.MainLoop()
>>      loop.run()
>>
>> ----------------------------------------------------------------------------
>>
>> What is driving me slightly nuts is that if I put all the buildvid code
>> into init and have a long series of object instatiations with add to
>> pipeline and link it works, but as soon as I started messing with
>> ghostpads and bin (which makes the code much more manageable when
>> adding functionality for windows and macs) this messed up.  Below is
>> more code that works, and I cannot figure out why this and why not
>> that.
>>
>> And the other thing is this does work in a commandline pipeline such
>> as the one sitting at the top of the script in comments.
>>
>> I am using the same system for the sender, but I'll only include the
>> local display.  This sends an image happily, using the build_localvid
>> bin, and linking it to the camera.
>>
>> -----------------------------------------------------------------------------
>> #!/bin/env python
>>
>> import sys, os
>> import gobject
>> import pygst
>> pygst.require("0.10")
>> import gst
>>
>> class client(object):
>>
>>      def __init__(self):
>>          self.pipe = gst.Pipeline("sender")
>>
>>          # Initial video input
>>          camera = gst.element_factory_make("v4l2src", "camera")
>>          vidtee = gst.element_factory_make("tee", "vidtee")
>>          self.pipe.add(camera, vidtee)
>>          camera.link(vidtee)
>>
>>          # local video
>>          localvidbin = self.build_localvid()
>>          self.pipe.add(localvidbin)
>>          vidtee.link(localvidbin)
>>
>>          self.pipe.set_state(gst.STATE_PLAYING)
>>
>>      def build_localvid(self):
>>          """This bin takes a camera (video) stream and produces a live image
>> locally."""
>>          bin = gst.Bin("localvid")
>>          queue = gst.element_factory_make("queue")
>>          out = gst.element_factory_make("xvimagesink")
>>          bin.add(out, queue)
>>          queue.link_pads("src", out, "sink")
>>          binsink = gst.GhostPad("binsink", queue.get_pad("sink"))
>>          bin.add_pad(binsink)
>>          return bin
>>
>> if __name__ == '__main__':
>>      client()
>>      loop = gobject.MainLoop()
>>      loop.run()
>>
>> ---------------------------------------------------------------------------
>>
>> This does the correct thing, and I get a live image from the camera.
>>
>> I am completely stumped on this one, and have resorted to using
>> gst.parse_bin_from_description() with the gst-launch pipeline, but
>> this is far from ideal from a maintenance perspective. :)
>>
>> I am sure I am missing something pretty obvious, but so far flailing
>> around in my ignorance has not let me stumble on a solution.
>>
>> Thanks for any help,
>>
>> Rohan
>>
>>
>> ------------------------------------------------------------------------------
>> Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
>> is the only developer event you need to attend this year. Jumpstart your
>> developing skills, take BlackBerry mobile applications to market and stay
>> ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
>> http://p.sf.net/sfu/devconf
>> _______________________________________________
>> gstreamer-devel mailing list
>> [hidden email]
>> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>>
>>
>>  
>
>
> ------------------------------------------------------------------------------
> Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
> is the only developer event you need to attend this year. Jumpstart your
> developing skills, take BlackBerry mobile applications to market and stay
> ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
> http://p.sf.net/sfu/devconf
> _______________________________________________
> gstreamer-devel mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel