summaryrefslogtreecommitdiff
path: root/voctocore/experiments/failovertest2.py
blob: f7fae9e1857a1e683ace2dae2cf3f0a01bd10816 (plain)
  1. #!/usr/bin/python3
  2. from os import path
  3. import gi
  4. gi.require_version('Gst', '1.0')
  5. from gi.repository import GObject, Gst
  6. GObject.threads_init()
  7. Gst.init(None)
  8. class FramegrabberSource(Gst.Bin):
  9. def __init__(self, uri, caps):
  10. super().__init__()
  11. self.caps = caps
  12. # Create elements
  13. self.http = Gst.ElementFactory.make('souphttpsrc', None)
  14. self.demux = Gst.ElementFactory.make('multipartdemux', None)
  15. self.parse = Gst.ElementFactory.make('jpegparse', None)
  16. self.dec = Gst.ElementFactory.make('jpegdec', None)
  17. self.queue = Gst.ElementFactory.make('queue', None)
  18. # Add elements to Bin
  19. self.add(self.http)
  20. self.add(self.parse)
  21. self.add(self.demux)
  22. self.add(self.dec)
  23. self.add(self.queue)
  24. # Set properties
  25. self.http.set_property('location', uri)
  26. self.http.set_property('timeout', 5)
  27. #self.http.set_property('is-live', True)
  28. #self.http.set_property('do-timestamp', True)
  29. # Connect signal handlers
  30. self.demux.connect('pad-added', self.on_demux_pad_added)
  31. self.queue.connect('underrun', self.on_queue_underrun)
  32. self.queue.connect('running', self.on_queue_running)
  33. self.queue.connect('pushing', self.on_queue_pushing)
  34. # Link elements
  35. self.http.link(self.demux)
  36. # dynamic linked # self.demux.link(self.parse)
  37. self.parse.link(self.dec)
  38. self.dec.link(self.queue)
  39. # Add Ghost Pads
  40. self.add_pad(
  41. Gst.GhostPad.new('src', self.queue.get_static_pad('src'))
  42. )
  43. def on_demux_pad_added(self, element, pad):
  44. string = pad.query_caps(None).to_string()
  45. print('on_demux_pad_added():', string)
  46. if string.startswith('image/jpeg'):
  47. pad.link(self.parse.get_static_pad('sink'))
  48. def on_queue_underrun(self, queue):
  49. print('on_queue_underrun()')
  50. def on_queue_running(self, queue):
  51. print('on_queue_running()')
  52. def on_queue_pushing(self, queue):
  53. print('on_queue_pushing()')
  54. class VideomixerWithDisplay(Gst.Bin):
  55. def __init__(self):
  56. super().__init__()
  57. # Create elements
  58. self.secondsrc = Gst.ElementFactory.make('videotestsrc', None)
  59. self.mixer = Gst.ElementFactory.make('videomixer', None)
  60. self.display = Gst.ElementFactory.make('ximagesink', None)
  61. # Add elements to Bin
  62. self.add(self.secondsrc)
  63. self.add(self.mixer)
  64. self.add(self.display)
  65. # Set properties
  66. self.secondsrc.set_property('pattern', 'ball')
  67. # Request Pads
  68. self.firstpad = self.mixer.get_request_pad('sink_%u')
  69. self.secondpad = self.mixer.get_request_pad('sink_%u')
  70. # Set pad-properties
  71. self.secondpad.set_property('alpha', 0.7)
  72. self.secondpad.set_property('xpos', 50)
  73. self.secondpad.set_property('ypos', 50)
  74. # Link elements
  75. self.secondsrc.get_static_pad('src').link(self.secondpad)
  76. self.mixer.link(self.display)
  77. # Add Ghost Pads
  78. self.add_pad(
  79. Gst.GhostPad.new('sink', self.firstpad)
  80. )
  81. class Example:
  82. def __init__(self):
  83. self.mainloop = GObject.MainLoop()
  84. self.pipeline = Gst.Pipeline()
  85. self.bus = self.pipeline.get_bus()
  86. self.bus.add_signal_watch()
  87. self.bus.connect('message::eos', self.on_eos)
  88. self.bus.connect('message::error', self.on_error)
  89. # Create elements
  90. self.grabbersrc = FramegrabberSource(
  91. uri='http://beachcam.kdhnc.com/mjpg/video.mjpg?camera=1',
  92. caps=Gst.caps_from_string('image/jpeg,framerate=1/1'))
  93. self.mixdisplay = VideomixerWithDisplay()
  94. # Add elements to pipeline
  95. self.pipeline.add(self.grabbersrc)
  96. self.pipeline.add(self.mixdisplay)
  97. self.grabbersrc.link(self.mixdisplay)
  98. def run(self):
  99. self.pipeline.set_state(Gst.State.PLAYING)
  100. self.mainloop.run()
  101. def kill(self):
  102. self.pipeline.set_state(Gst.State.NULL)
  103. self.mainloop.quit()
  104. def on_eos(self, bus, msg):
  105. print('on_eos()')
  106. self.kill()
  107. def on_error(self, bus, msg):
  108. print('on_error():', msg.parse_error())
  109. self.kill()
  110. example = Example()
  111. example.run()