summaryrefslogtreecommitdiff
path: root/clients
diff options
context:
space:
mode:
authorCarl Karsten <carl@personnelware.com>2016-04-19 16:48:24 -0500
committerCarl Karsten <carl@personnelware.com>2016-04-19 16:48:24 -0500
commitabad5efe4e1665bc6e49fb69684db1fc183dee5e (patch)
treee69cc49d7076534ce2c6d49d80524f7b10ac29c7 /clients
parent302e9d304e0e59c17b201e8e7d78f913433eaa6a (diff)
Added some #comments.
Diffstat (limited to 'clients')
-rwxr-xr-xclients/source/ingest.py306
1 files changed, 0 insertions, 306 deletions
diff --git a/clients/source/ingest.py b/clients/source/ingest.py
deleted file mode 100755
index 2b63dde..0000000
--- a/clients/source/ingest.py
+++ /dev/null
@@ -1,306 +0,0 @@
-#!/usr/bin/env python3
-
-# ingest.py
-# source client for Voctomix
-
-import sys
-
-import gi
-import signal
-import os
-import socket
-
-import argparse
-
-gi.require_version('Gst', '1.0')
-from gi.repository import Gst, GstNet, GObject
-
-# init GObject & Co. before importing local classes
-GObject.threads_init()
-Gst.init([])
-
-# this is kinda icky.
-sys.path.insert(0, '../..' )
-sys.path.insert(0, '.' )
-
-import voctogui.lib.connection as Connection
-# import lib.clock as ClockManager
-
-
-def mk_video_src(args, videocaps):
- # make video soure part of pipeline
-
- video_device = "device={}".format(args.video_dev) \
- if args.video_dev else ""
-
- monitor = """tee name=t ! queue !
- videoconvert ! fpsdisplaysink sync=false
- t. ! queue !""" \
- if args.monitor else ""
-
-
- if args.video_source == 'dv':
- video_src = """
- dv1394src name=videosrc {video_device}!
- dvdemux name=demux !
- queue !
- dvdec !
- {monitor}
- deinterlace mode=1 !
- videoconvert !
- videorate !
- videoscale !
- """
-
- elif args.video_source == 'hdv':
- video_src = """
- hdv1394src {video_device} do-timestamp=true name=videosrc !
- tsdemux name=demux!
- queue !
- decodebin !
- {monitor}
- deinterlace mode=1 !
- videorate !
- videoscale !
- videoconvert !
- """
-
- elif args.video_source == 'hdmi2usb':
- video_src = """
- v4l2src {video_device} name=videosrc !
- queue !
- image/jpeg,width=1280,height=720 !
- jpegdec !
- {monitor}
- videoconvert !
- videorate !
- """
-
- elif args.video_source == 'ximage':
- video_src = """
- ximagesrc name=videosrc
- use-damage=false !
- {monitor}
- videoconvert !
- videorate !
- videoscale !
- """
- # startx=0 starty=0 endx=1919 endy=1079 !
-
- elif args.video_source == 'blackmagichdmi':
- video_src = """
- decklinkvideosrc mode=17 connection=2 !
- {monitor}
- videoconvert !
- videorate !
- videoscale !
- """
-
- elif args.video_source == 'test':
- video_src = """
- videotestsrc name=videosrc
- pattern=ball
- foreground-color=0x00ff0000 background-color=0x00440000 !
- {monitor}
- """
-
- video_src = video_src.format(
- video_device=video_device,
- monitor=monitor)
-
- video_src += videocaps + "!\n"
-
- return video_src
-
-def mk_audio_src(args, audiocaps):
-
- audio_device = "device={}".format(args.audio_dev) \
- if args.audio_dev else ""
-
- if args.audio_source in [ 'dv', 'hdv' ]:
- # this only works if video is from DV also.
- # or some gst source that gets demux ed
- audio_src = """
- demux. !
- audioconvert !
- """
-
- elif args.audio_source == 'pulse':
- audio_src = """
- pulsesrc {audio_device} name=audiosrc !
- """.format(audio_device=audio_device)
-
- elif args.audio_source == 'blackmagichdmi':
- audio_src = """
- decklinkaudiosrc !
- """
-
- elif args.audio_source == 'test':
- audio_src = """
- audiotestsrc name=audiosrc freq=330 !
- """
- audio_src += audiocaps + "!\n"
-
- return audio_src
-
-def mk_mux(args):
-
- mux = """
- mux.
- matroskamux name=mux !
- """
- return mux
-
-def mk_client(args):
- core_ip = socket.gethostbyname(args.host)
- client = """
- tcpclientsink host={host} port={port}
- """.format(host=core_ip, port=args.port)
-
- return client
-
-
-def mk_pipeline(args, server_caps):
-
- video_src = mk_video_src(args, server_caps['videocaps'])
- audio_src = mk_audio_src(args, server_caps['audiocaps'])
- mux = mk_mux(args)
- client = mk_client(args)
-
- pipeline = video_src + "mux.\n" + audio_src + mux + client
-
- # remove blank lines to make it more human readable
- pipeline = pipeline.replace("\n\n","\n")
-
- return pipeline
-
-def get_server_caps():
-
-
- # fetch config from server
- server_config = Connection.fetchServerConfig()
- server_caps = {'videocaps': server_config['mix']['videocaps'],
- 'audiocaps': server_config['mix']['audiocaps']}
-
- return server_caps
-
- # obtain network-clock
- ClockManager.obtainClock(Connection.ip)
-
-
-def run_pipeline(pipeline, args):
-
- core_ip = socket.gethostbyname(args.host)
-
- clock = GstNet.NetClientClock.new('voctocore', core_ip, 9998, 0)
- print('obtained NetClientClock from host', clock)
-
- print('waiting for NetClientClock to sync…')
- clock.wait_for_sync(Gst.CLOCK_TIME_NONE)
-
- print('starting pipeline')
- senderPipeline = Gst.parse_launch(pipeline)
- senderPipeline.use_clock(clock)
- src = senderPipeline.get_by_name('src')
-
- def on_eos(self, bus, message):
- print('Received EOS-Signal')
- sys.exit(1)
-
- def on_error(self, bus, message):
- print('Received Error-Signal')
- (error, debug) = message.parse_error()
- print('Error-Details: #%u: %s' % (error.code, debug))
- sys.exit(1)
-
-
- # Binding End-of-Stream-Signal on Source-Pipeline
- senderPipeline.bus.add_signal_watch()
- senderPipeline.bus.connect("message::eos", on_eos)
- senderPipeline.bus.connect("message::error", on_error)
-
- print("playing")
- senderPipeline.set_state(Gst.State.PLAYING)
-
- mainloop = GObject.MainLoop()
- try:
- mainloop.run()
- except KeyboardInterrupt:
- print('Terminated via Ctrl-C')
-
- print('Shutting down...')
- senderPipeline.set_state(Gst.State.NULL)
- print('Done.')
-
- return
-
-def get_args():
-
- parser = argparse.ArgumentParser(
- description='''Vocto-ingest Client with Net-time support.
- Gst caps are retrieved from the server.
- Run without parameters: send test av to localhost:10000
- ''')
-
- parser.add_argument('-v', '--verbose', action='count', default=0,
- help="Also print INFO and DEBUG messages.")
-
- parser.add_argument( '--video-source', action='store',
- choices=[
- 'dv', 'hdv', 'hdmi2usb', 'blackmagichdmi',
- 'ximage',
- 'test', ],
- default='test',
- help="Where to get video from")
-
- parser.add_argument( '--video-dev', action='store',
- help="video device")
-
- parser.add_argument( '--audio-source', action='store',
- choices=['dv', 'alsa', 'pulse', 'blackmagichdmi', 'test'],
- default='test',
- help="Where to get audio from")
-
- parser.add_argument( '--audio-dev', action='store',
- default='hw:CARD=CODEC',
- help="for alsa/pulse, audio device")
- # maybe hw:1,0
-
- parser.add_argument( '--audio-delay', action='store',
- default='10',
- help="ms to delay audio")
-
- parser.add_argument('-m', '--monitor', action='store_true',
- help="fps display sink")
-
- parser.add_argument( '--host', action='store',
- default='localhost',
- help="hostname of vocto core")
-
- parser.add_argument( '--port', action='store',
- default='10000',
- help="port of vocto core")
-
- args = parser.parse_args()
-
- return args
-
-
-def main():
-
- args = get_args()
-
- core_ip = socket.gethostbyname(args.host)
- # establish a synchronus connection to server
- Connection.establish(core_ip)
-
- server_caps = get_server_caps()
-
- pipeline = mk_pipeline(args, server_caps)
- print(pipeline)
- run_pipeline(pipeline, args)
-
-
-
-if __name__ == '__main__':
- main()