GStreamer -Dynamic pipelines : Issue with adding a new element in the pipeline

vk_gst venkateshkuppan26 at gmail.com
Fri Aug 17 11:08:58 UTC 2018


Hi,

Below is my pipeline  :
v4l2src -> h264parse -> avdec_h264 -> identity ->glupload -> glcolorconvert
-> gltransformation -> glimagesink.

Based on the user input(keyboard input), I set the property
"drop-probability" to 1 or 0. Basically, just toggling it based on the count
of input. 
Now I want to modify the above pipeline, and insert/delete a  new element
'imagefreeze' based on the user input. So the new pipeline looks like this : 
v4l2src -> h264parse -> avdec_h264 -> identity -> imagefreeze -> glupload ->
glcolorconvert -> gltransformation -> glimagesink.


For this I did the following : 
1. I installed a IDLE probe on source pad of identity.
2.  And then in the callback, I unlink identity ->glupload, 
3. add new element identity and link source pad of identity to sink pad of
imagefreeze, 
4.  also  link srcpad of imagefreeze to sink pad of glimagesink.


However, I get the following error : 

    idsrcpad.link(ifreeze_sinkpad)
  File "/usr/lib/python3/dist-packages/gi/overrides/Gst.py", line 162, in
link
    raise LinkError(ret)
gi.overrides.Gst.LinkError: <enum GST_PAD_LINK_WRONG_HIERARCHY of type
Gst.PadLinkReturn>

idsrcpad - the source pad of identity
ifreeze_sinkpad - the sinkpad of imagefreeze

Here is a snippet from the code: 

class Thread

  def __init__(self):
        thread2 = threading.Thread(target=self.get)
        thread2.start()

  def get(self): 
        # apply gltransformation
        # if user input, && set = True, make "drop-probability = 1" 
        identity.set_property("drop-probability",1)
        idsrcpad = identity.get_static_pad("src")
        idsrcpad.add_probe (Gst.PadProbeType.IDLE,    self.modify_pipeline)
      
      #if user input && set = False, make "drop-probability = 0"
      ## add code to remove the imagefreeze element, and go back to old
pipeline.(pending)

  def modify_pipeline(pad,info,self):
         #1.get sink pad of glupload and unlink identity & glupload
        upload_sinkpad = upload.get_static_pad("sink")
        idsrcpad.unlink(upload_sinkpad)
        #2.get new src and sink pad of imagefreeze
        ifreeze_sinkpad = ifreeze.get_static_pad("sink")
        ifreeze_srcpad = ifreeze.get_static_pad("src")
        #3. link identity src pad to imagefreeze sinkpad
        idsrcpad = identity.get_static_pad("src")
        idsrcpad.link(ifreeze_sinkpad)
        #4. link imagefreeze src pad to upload sink pad
        ifreeze_srcpad.link(upload_sinkpad)        

        return Gst.PadProbeReturn.OK


1. I have tried different ways to solve this issue, but I am unable to find
a solution. Does anyone know where I am going wrong.

2. The callback function for add_probe, accepts 2 arguments as per the
documentation  here
<https://valadoc.org/gstreamer-1.0/Gst.PadProbeCallback.html>   . However,
if I define my callback with only 2 arguments (def
modify_pipeline(pad,info))- I get an error saying the callback accepts only
2 arguments, but 3 were provided. The C API of  add_probe
<https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-add-probe>   
defines 3 arguments anyhow. 

3. I am also unable to use class members using 'self' inside the callback
function. Does anyone have some suggestions? 


Regards.



--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/


More information about the gstreamer-devel mailing list