summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2018-01-27 03:08:28 +0100
committerChristian Pointner <equinox@spreadspace.org>2018-01-27 03:08:28 +0100
commitc8cbb765baf4f9cd0738fffa1f6d839d804eb040 (patch)
tree2a39d7007bb94e3c2f96464d6f936b0f19bca8a2 /src
parentcleanup (diff)
further cleanup and new example
Diffstat (limited to 'src')
-rw-r--r--src/examples/elevate2017.json139
-rwxr-xr-xsrc/flufigut.py39
2 files changed, 164 insertions, 14 deletions
diff --git a/src/examples/elevate2017.json b/src/examples/elevate2017.json
new file mode 100644
index 0000000..ae53362
--- /dev/null
+++ b/src/examples/elevate2017.json
@@ -0,0 +1,139 @@
+{
+ "globals":{
+ "templates": "default",
+ "version": "0.10.1",
+ "name": "elevate-live",
+ "description": "Live from Elevate Festival 2017",
+ "domain": "spreadspace.org",
+ "manager": {
+ "machine": "telesto",
+ "host": "109.73.158.69",
+ "port": 7531,
+ "transport": "ssl"
+ },
+ "admin": {
+ "username": "equinox",
+ "password": "whGCy0u8Cio7Ctzik8oq"
+ },
+ "stats": {
+ "rrd": {
+ "directory": "/var/lib/flumotion/rrd"
+ }
+ },
+ "resolutions": {
+ "720p25": { "width": 1280, "height": 720, "rate": "25/1" },
+ "480p25": { "width": 854, "height": 480, "rate": "25/1" },
+ "360p25": { "width": 640, "height": 360, "rate": "25/1" },
+ "240p25": { "width": 426, "height": 240, "rate": "25/1" }
+ },
+ "formats": {
+ "flash": { "muxer": "flv", "video": "h264", "audio": "aac", "samplerate": 44100 },
+ "webm": { "muxer": "webm", "video": "vp8", "audio": "vorbis" },
+ "ogg": { "muxer": "ogg", "video": "theora", "audio": "vorbis" },
+ "mp3": { "muxer": "mp3", "video": "null", "audio": "mp3" },
+ "rec": { "muxer": "mkv", "video": "mjpeg", "audio": "raw" }
+ },
+ "profiles": {
+ "high": { "video": "720p25", "audio": 160 },
+ "medium": { "video": "480p25", "audio": 128 },
+ "low": { "video": "360p25", "audio": 96 },
+ "mini": { "video": "240p25", "audio": 64 },
+ "full": { "video": "720p25", "audio": 0 }
+ },
+ "bitrates": {
+ "h264": { "720p25": 1800, "480p25": 1000, "360p25": 600, "240p25": 300 },
+ "vp8": { "720p25": 1800, "480p25": 1000, "360p25": 600, "240p25": 300 },
+ "mjpeg": { "720p25": 95 }
+ },
+ "workers": {
+ "telesto": [ "input-sdi-orig", "resize-sdi-orig", "resample-sdi-orig",
+ "encoder-sdi-orig-vorbis-160", "encoder-sdi-orig-vorbis-128", "encoder-sdi-orig-vorbis-96", "encoder-sdi-orig-vorbis-64",
+ "encoder-sdi-orig-aac-160", "encoder-sdi-orig-aac-128", "encoder-sdi-orig-aac-96", "encoder-sdi-orig-aac-64",
+ "encoder-sdi-orig-mp3-160", "encoder-sdi-orig-mp3-128", "encoder-sdi-orig-mp3-96", "encoder-sdi-orig-mp3-64",
+ "encoder-sdi-orig-h264-720p25", "encoder-sdi-orig-h264-480p25", "encoder-sdi-orig-h264-240p25",
+ "encoder-sdi-orig-mjpeg-720p25", "muxer-avr-rec-full", "encoder-sdi-orig-raw-0" ],
+ "calypso": [ "encoder-sdi-orig-vp8-720p25", "encoder-sdi-orig-vp8-480p25", "encoder-sdi-orig-vp8-360p25", "encoder-sdi-orig-vp8-240p25",
+ "encoder-sdi-orig-h264-360p25",
+ "muxer-av-orig-webm-high", "muxer-av-orig-webm-medium", "muxer-av-orig-webm-low", "muxer-av-orig-webm-mini",
+ "muxer-av-orig-flash-high", "muxer-av-orig-flash-medium", "muxer-av-orig-flash-low", "muxer-av-orig-flash-mini",
+ "muxer-audio-orig-ogg-high", "muxer-audio-orig-ogg-medium", "muxer-audio-orig-ogg-low", "muxer-audio-orig-ogg-mini",
+ "muxer-audio-orig-mp3-high", "muxer-audio-orig-mp3-medium", "muxer-audio-orig-mp3-low", "muxer-audio-orig-mp3-mini",
+ "streamer-local1", "recorder-av", "recorder-audio" ],
+ "elemc00": [ "repeater-pub" ],
+ "elemc01": [ "streamer-pub1" ],
+ "elemc02": [ "streamer-pub2" ]
+ }
+ },
+ "inputs": {
+ "sdi-orig": {
+ "type": "decklink",
+ "master": true,
+ "properties": {
+ "resolution": "720p25",
+ "samplerate": 48000,
+ "device": 0,
+ "connection": 0,
+ "audio-input": 0,
+ "mode": 10
+ }
+ }
+ },
+ "muxes": {
+ "av-orig": {
+ "video": "sdi-orig:video",
+ "audio": "sdi-orig:audio",
+ "formats": {
+ "flash": [ "high", "medium", "low", "mini" ],
+ "webm": [ "high", "medium", "low", "mini" ]
+ }
+ },
+ "avr": {
+ "video": "sdi-orig:video",
+ "audio": "sdi-orig:audio",
+ "formats": {
+ "rec": [ "full" ]
+ }
+ },
+ "audio-orig": {
+ "audio": "sdi-orig:audio",
+ "formats": {
+ "ogg": [ "high", "medium", "low", "mini" ],
+ "mp3": [ "high", "medium", "low", "mini" ]
+ }
+ }
+ },
+ "streams": {
+ "streamer-local": {
+ "muxes": [ "av-orig", "audio-orig" ],
+ "type": "http", "count": 1, "port": 8000,
+ "max-con": 100, "burst-on-connect": 5,
+ "hostname": "elevate-feed",
+ "localdup" : { "port": 8001, "formats": [ "flash" ], "burst-on-connect": 3 }
+ },
+ "streamer-pub": {
+ "muxes": [ "av-orig", "audio-orig" ],
+ "type": "http", "count": 2, "port": 8000,
+ "max-bw": 290000000, "burst-on-connect": 5,
+ "hostname": "elevate-live%i", "repeater": "repeater-pub",
+ "localdup" : { "port": 8001, "formats": [ "flash" ], "burst-on-connect": 3 }
+ }
+ },
+ "records": {
+ "av": {
+ "muxes": {
+ "avr": { "format": "rec", "profile": "full" }
+ },
+ "directory": "/srv/elevate2017/",
+ "filename": "av-orig %Y-%m-%d %H-%M-%S"
+ },
+ "audio": {
+ "muxes": {
+ "audio-orig": { "format": "ogg", "profile": "high" }
+ },
+ "directory": "/srv/elevate2017/",
+ "filename": "audio-orig %Y-%m-%d %H-%M-%S"
+ }
+
+ }
+
+}
diff --git a/src/flufigut.py b/src/flufigut.py
index 7901e9a..94166d0 100755
--- a/src/flufigut.py
+++ b/src/flufigut.py
@@ -103,9 +103,10 @@ class Planet:
master_cnt = 0
for source, input in inputs.items():
comp_name = 'input-%s' % source
+ comp_desc = 'capture raw data from %s' % (source)
self.flow['inputs'][comp_name] = {
'type': input['type'],
- 'desc': "capture raw data from %s" % (source),
+ 'desc': comp_desc,
'worker': None,
'master': input['master'],
'properties': {},
@@ -115,9 +116,9 @@ class Planet:
self.__set_input_properties(comp_name, input['properties'], globals)
if master_cnt == 0:
- raise exception("You have not configured any master clock device!")
+ raise Exception("You have not configured any master clock device!")
elif master_cnt > 1:
- raise exception("You have configured multiple master clock devices!")
+ raise Exception("You have configured multiple master clock devices!")
#
# muxes
@@ -131,11 +132,12 @@ class Planet:
if target_samplerate == input_samplerate:
return
- comp_name = 'resample-%s-%s' % (source, target_samplerate)
feeder = 'input-%s' % (mux['audio'])
+ comp_name = 'resample-%s-%s' % (source, target_samplerate)
+ comp_desc = 'resample audio from % s to % s Hz' % (source, target_samplerate)
self.flow['inputs'][comp_name] = {
'type': 'audio-resample',
- 'desc': "resample audio from %s to %s Hz" % (source, target_samplerate),
+ 'desc': comp_desc,
'worker': None,
'feeder': feeder,
'properties': {
@@ -150,21 +152,22 @@ class Planet:
return
if input_resolution == "":
- raise exception("format definition needs video but no video input given")
+ raise Exception("format definition needs video but no video input given")
target_resolution = globals['profiles'][profile]['video']
if target_resolution == input_resolution:
return
if globals['resolutions'][target_resolution]['rate'] != globals['resolutions'][input_resolution]['rate']:
- raise exception("ERROR: video rate conversion is not yet supported!!!")
+ raise Exception("ERROR: video rate conversion is not yet supported!!!")
- comp_name = 'resize-%s-%s' % (source, target_resolution)
feeder = 'input-%s' % (mux['video'])
+ comp_name = 'resize-%s-%s' % (source, target_resolution)
+ comp_desc = 'resize video from %s to %sx%s' % (source, globals['resolutions'][target_resolution]['width'],
+ globals['resolutions'][target_resolution]['height']),
self.flow['inputs'][comp_name] = {
'type': 'video-resize',
- 'desc': "resize video from %s to %sx%s" % (source, globals['resolutions'][target_resolution]['width'],
- globals['resolutions'][target_resolution]['height']),
+ 'desc': comp_desc,
'worker': None,
'feeder': feeder,
'properties': {
@@ -189,12 +192,17 @@ class Planet:
feeder = 'resample-%s-%s' % (source, target_samplerate)
comp_name = 'encode-%s-%s-%i-%i' % (source, encoder, bitrate, target_samplerate)
+ comp_desc = '%s encoder for %i kbit/s @ %i Hz, from %s' % (encoder, bitrate, target_samplerate, source),
+ if bitrate == 0:
+ comp_name = 'encode-%s-%s-%i' % (source, encoder, target_samplerate)
+ comp_desc = '%s encoder @ %i Hz, from %s' % (encoder, target_samplerate, source),
+
if comp_name in self.flow['encoders_audio']:
return comp_name
self.flow['encoders_audio'][comp_name] = {
'type': '%s-encode' % encoder,
- 'desc': "%s encoder for %i kbit/s @ %i Hz, from %s" % (encoder, bitrate, target_samplerate, source),
+ 'desc': comp_desc,
'worker': None,
'feeder': feeder,
'properties': {
@@ -216,13 +224,15 @@ class Planet:
feeder = 'resize-%s-%s' % (source, target_resolution)
comp_name = 'encode-%s-%s-%s' % (source, encoder, target_resolution)
+ comp_desc = '%s encoder for %sx%s, from %s' % (encoder, globals['resolutions'][target_resolution]['width'],
+ globals['resolutions'][target_resolution]['height'], source),
+
if comp_name in self.flow['encoders_video']:
return comp_name
self.flow['encoders_video'][comp_name] = {
'type': '%s-encode' % encoder,
- 'desc': "%s encoder for %sx%s, from %s" % (encoder, globals['resolutions'][target_resolution]['width'],
- globals['resolutions'][target_resolution]['height'], source),
+ 'desc': comp_desc,
'worker': None,
'feeder': feeder,
'properties': {
@@ -235,9 +245,10 @@ class Planet:
muxer = globals['formats'][format]['muxer']
comp_name = 'mux-%s-%s-%s' % (mux_name, format, profile)
+ comp_desc = '%s muxer for %s, profile %s' % (format, mux_name, profile),
self.flow['muxers'][comp_name] = {
'type': '%s-mux' % muxer,
- 'desc': "%s muxer for %s, profile %s" % (format, mux_name, profile),
+ 'desc': comp_desc,
'worker': None,
'feeder_audio': audio_encoder,
'feeder_video': video_encoder,