Gstreamer:当动态添加管道中的元素之一时,“ src”元素任务进入暂停状态

时间:2018-08-28 13:31:46

标签: gstreamer v4l2 python-gstreamer

我有以下管道:

libdrmaa.so
  1. 我在元素v4l2src -> queue -> h264parse -> avdec_h264 -> identity -> imagefreeze(added/removed dynamically) -> glupload -> glcolorconvert -> gltransformation -> glimagesink srcpad上添加了一个探针。
  2. 基于用户输入,我动态添加或删除元素identity

这是伪代码:

imagefreeze
  1. 插入#show live video on rendering window till no user input #if user_input == 1: insert_imagefreeze #analogous to image being displayed on rendering window #if user_input == 2: delete_imagefreeze #resume back showing live video as before 没问题,可以正常工作。我可以使用imagefreeze
  2. 观察我想要的结果
  3. 但是,在添加元素imagefreeze之后,元素imagefreeze任务进入暂停状态。这是信息日志:

    v4l2src

任何人都可以解释一下,一旦将新元素添加到管道中,为什么管道的源元素会进入暂停状态。

以及实际代码段:

0:03:39.608226968 [333m29510[00m      0x1561c00 [36mINFO   [00m [00m             v4l2src gstv4l2src.c:949:gst_v4l2src_create:<source>[00m sync to 0:03:39.066664476 out ts 0:03:39.375180156
0:03:39.608449406 [333m29510[00m      0x1561c00 [36mINFO   [00m [00m             basesrc gstbasesrc.c:2965:gst_base_src_loop:<source>[00m pausing after gst_pad_push() = eos
0:03:39.608561724 [333m29510[00m      0x1561c00 [36mINFO   [00m [00m                task gsttask.c:316:gst_task_func:<source:src>[00m Task going to paused.

功能def add_delete(self): if ui_input_cnt = 1 #updated based on user input self.idsrcpad = self.identity.get_static_pad("src") self.in_idle_probe = False self.probeID = self.idsrcpad.add_probe(Gst.PadProbeType.IDLE,self.lengthen_pipeline) if ui_input_cnt = 2 self.probeID2 = self.idsrcpad.add_probe(Gst.PadProbeType.IDLE,self.shorten_pipeline) def lengthen_pipeline(self,pad,info): print("entered callback") global pipeline #restrict only 1 call to this callback if self.in_idle_probe == True: print("callback for now restricted to one call per thread") return Gst.PadProbeReturn.OK if self.in_idle_probe == False: self.in_idle_probe == True #create image freze element self.ifreeze = Gst.ElementFactory.make("imagefreeze","ifreeze") # increment reference self.ifreeze.ref() #add imagefreze to pipeline pipeline.add(self.ifreeze) #sync image freeze state to main pipeline self.ifreeze.sync_state_with_parent() #unlink identity and upload #1.get sink pad of upload and srcpad of identity sinkpad = self.upload.get_static_pad("sink") srcpad = self.identity.get_static_pad("src") print("unlinking identit srcpad - uplaod sinkpad") if self.check_and_unlink(srcpad,sinkpad): #2.get sink pad of imagefreeze sinkpad = self.ifreeze.get_static_pad("sink") #3. link identity src pad to image freeze sinkpad print("linking identity srcpad - ifreeze sinkpad") self.check_and_link(srcpad,sinkpad) #4. link imagefreeze src pad to upload sink pad #get image freeze srcpad and sinkpad of upload srcpad = self.ifreeze.get_static_pad("src") sinkpad = self.upload.get_static_pad("sink") print("linking ifreeze srcpad - upload sinkpad") if self.check_and_link(srcpad,sinkpad): return Gst.PadProbeReturn.REMOVE else: print("ERORR : unlinking") return -1 check_and_link(srcpad,sinkpad)的作用不仅仅在于检查check_and_unlink(srcpad,sinkpad)src垫,然后进行相应的链接和取消链接。

1 个答案:

答案 0 :(得分:0)

当动态添加imagefreeze时,接收器发送一个EOS事件。这使管道进入PAUSED状态。但是,接收器为何收到EOS事件的原因仍不清楚,需要进一步调查。 here提供了观测的更多信息。