summaryrefslogtreecommitdiff
path: root/voctocore/experiments/intervideo.py
blob: ac5cac1c70bab86d2d6ef88bb6b56a352c060c7c (plain)
  1. #!/usr/bin/python3
  2. import gi, time
  3. import socket
  4. # import GStreamer and GTK-Helper classes
  5. gi.require_version('Gst', '1.0')
  6. from gi.repository import GLib, Gst, GObject
  7. # init GObject before importing local classes
  8. GObject.threads_init()
  9. Gst.init(None)
  10. class Example:
  11. def __init__(self):
  12. self.mainloop = GObject.MainLoop()
  13. self.vsink = Gst.parse_launch('intervideosrc channel=video ! video/x-raw,height=600,width=800,format=I420,framerate=25/1 ! timeoverlay ! videoconvert ! ximagesink')
  14. self.vsource = None
  15. self.asink = Gst.parse_launch('interaudiosrc channel=audio ! audio/x-raw,format=S16LE,layout=interleaved,rate=48000,channels=2 ! autoaudiosink')
  16. self.asource = None
  17. # Create the server, binding to localhost on port 5000
  18. vsock = socket.socket(socket.AF_INET6)
  19. vsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  20. vsock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, False)
  21. vsock.bind(('::', 5000))
  22. vsock.listen(1)
  23. # register socket for callback inside the GTK-Mainloop
  24. GObject.io_add_watch(vsock, GObject.IO_IN, self.connection_handler_video)
  25. # Create the server, binding to localhost on port 6000
  26. asock = socket.socket(socket.AF_INET6)
  27. asock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  28. asock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, False)
  29. asock.bind(('::', 6000))
  30. asock.listen(1)
  31. # register socket for callback inside the GTK-Mainloop
  32. GObject.io_add_watch(asock, GObject.IO_IN, self.connection_handler_audio)
  33. def connection_handler_video(self, sock, *args):
  34. '''Asynchronous connection listener. Starts a handler for each connection.'''
  35. if self.vsource:
  36. return False
  37. conn, addr = sock.accept()
  38. print("Connection from", addr)
  39. self.vsource = Gst.parse_launch('appsrc name=a ! gdpdepay ! video/x-raw,height=600,width=800,format=I420,framerate=25/1 ! timeoverlay halignment=right ! intervideosink channel=video')
  40. self.vsource.set_state(Gst.State.PLAYING)
  41. # register data-received handler inside the GTK-Mainloop
  42. GObject.io_add_watch(conn, GObject.IO_IN, self.data_handler_video)
  43. return True
  44. def data_handler_video(self, conn, *args):
  45. '''Asynchronous data handler. Processes data-blocks line from the socket.'''
  46. blob = conn.recv(10000000) # >1920x1080x3
  47. if not len(blob):
  48. print("Connection closed.")
  49. self.vsource.set_state(Gst.State.NULL)
  50. self.vsource = None
  51. return False
  52. print("Video-Blob of %u bytes" % len(blob))
  53. buf = Gst.Buffer.new_wrapped(blob)
  54. self.vsource.get_by_name('a').emit('push-buffer', buf)
  55. return True
  56. def connection_handler_audio(self, sock, *args):
  57. '''Asynchronous connection listener. Starts a handler for each connection.'''
  58. if self.asource:
  59. return False
  60. conn, addr = sock.accept()
  61. print("Connection from", addr)
  62. self.asource = Gst.parse_launch('appsrc name=a ! gdpdepay ! audio/x-raw,format=S16LE,layout=interleaved,rate=48000,channels=2 ! interaudiosink channel=audio')
  63. self.asource.set_state(Gst.State.PLAYING)
  64. # register data-received handler inside the GTK-Mainloop
  65. GObject.io_add_watch(conn, GObject.IO_IN, self.data_handler_audio)
  66. return True
  67. def data_handler_audio(self, conn, *args):
  68. '''Asynchronous data handler. Processes data-blocks line from the socket.'''
  69. blob = conn.recv(10000000) # >1920x1080x3
  70. if not len(blob):
  71. print("Connection closed.")
  72. self.asource.set_state(Gst.State.NULL)
  73. self.asource = None
  74. return False
  75. print("Audio-Blob of %u bytes" % len(blob))
  76. buf = Gst.Buffer.new_wrapped(blob)
  77. self.asource.get_by_name('a').emit('push-buffer', buf)
  78. return True
  79. def run(self):
  80. self.vsink.set_state(Gst.State.PLAYING)
  81. self.asink.set_state(Gst.State.PLAYING)
  82. self.mainloop.run()
  83. def kill(self):
  84. self.vsink.set_state(Gst.State.NULL)
  85. self.asink.set_state(Gst.State.NULL)
  86. self.mainloop.quit()
  87. def on_eos(self, bus, msg):
  88. print('on_eos()')
  89. #self.kill()
  90. def on_error(self, bus, msg):
  91. print('on_error():', msg.parse_error())
  92. #self.kill()
  93. example = Example()
  94. example.run()