From 4c9bb43819a0084c2b4a9de9e352a4de888988c7 Mon Sep 17 00:00:00 2001
From: Jonas Smedegaard <dr@jones.dk>
Date: Fri, 28 Apr 2017 00:29:01 +0200
Subject: Refactor to flexibly support inputs, and make logo optional.

---
 bin/captureDVCAM+edit+encode+stream | 65 ++++++++++++++++++++++++++++++++-----
 1 file changed, 56 insertions(+), 9 deletions(-)

diff --git a/bin/captureDVCAM+edit+encode+stream b/bin/captureDVCAM+edit+encode+stream
index 4bf2e4d..0e99129 100755
--- a/bin/captureDVCAM+edit+encode+stream
+++ b/bin/captureDVCAM+edit+encode+stream
@@ -2,18 +2,64 @@
 
 set -e
 
-AINPUT=hw:0
-VINPUT=/dev/fw1
-LOGO=../../content/icon_small.png
+# TODO: Externalize to site-specific configfile
+[ $# -gt 0 ] || set -- morla 5002 -- dvcam ../../content/icon_small.png
 
-HOST=${1:-morla}
+exit1() {
+	echo >&2 "ERROR: $1"
+	exit 1
+}
+
+while [ $# -gt 0 ]; do
+	case $1 in
+	  --)
+		shift; break;;
+	  *)
+		if [ -z "$HOST" ]; then
+			HOST=$1
+		elif [ -z "$FIRSTPORT" ]; then
+			FIRSTPORT=$1
+		else
+			exit1 "Too many arguments: Max. 2 about target"
+		fi
+		;;
+	esac
+	shift
+done
+
+# TODO: Externalize to site-specific configfile
+[ $# -gt 0 ] || set -- dvcam ../../content/icon_small.png
+
+while [ $# -gt 0 ]; do
+	case $1 in
+		alsa=*) ALSA=${1#*=}; AINPUT=$((AINPUT+1));;
+		alsa) ALSA=default; AINPUT=$((AINPUT+1));;
+		dvcam=*) DVCAM=${1#*=}; XINPUT=$((XINPUT+1));;
+		dvcam) DVCAM=auto; XINPUT=$((XINPUT+1));;
+		*.png) LOGO=$1; WINPUT=$((WINPUT+1));;
+		--) shift; break;;
+		*) exit1 "Unsupported input: $1";;
+	esac
+	shift
+done
+
+HOST=${HOST:-127.0.0.1}
 if [ "$HOST" = "$(hostname --short)" ]; then
 	IP=127.0.0.1
 else
 	IP=$(host "$HOST" | grep -Po 'address \K\S+')
 fi
 
-FIRSTPORT=${2:-5002} # even number - next 3 ports used too
+[ -n "$AINPUT$VINPUT$XINPUT" ] || exit1 "Too few arguments: Min. 1 A/V source"
+[ -z "$AINPUT" ] || [ -z "$VINPUT" ] || [ -z "$XINPUT" ] || exit1 "Too many arguments: Max. 2 A/V sources"
+[ -z "$AINPUT" ] || [ $AINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 audio source"
+[ -z "$VINPUT" ] || [ $VINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 video source"
+[ -z "$WINPUT" ] || [ $WINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 watermark source"
+[ -z "$XINPUT" ] || [ $XINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 multimedia source"
+VSTREAMINDEX=1
+[ -n "$AINPUT" ] || VSTREAMINDEX=0
+
+FIRSTPORT=${FIRSTPORT:-5002} # even number - next 3 ports used too
 
 ACHANNELS=2
 AFRAMERATE=48000
@@ -27,11 +73,12 @@ VBITRATE=256000
 # + Add 1s latency (deadline)
 # + Use same RTP payload types as GStreamer
 ffmpeg -hide_banner -threads auto -re \
- -f iec61883 -i auto \
- -i "$LOGO" \
+ ${ALSA:+-f alsa -sample_rate "$AFRAMERATE" -channels "$ACHANNELS" -thread_queue_size 1024 -i "$ALSA"} \
+ ${DVCAM:+-f iec61883 -i $DVCAM} \
+ ${LOGO:+-i "$LOGO"} \
  -filter_complex \
- "[0:v]scale=-1:$HEIGHT[bg];
-  [bg][1:v]overlay=main_w-overlay_w-20:main_h-overlay_h-20[v]" \
+ "[$VSTREAMINDEX:v]scale=-1:$HEIGHT[bg]${LOGO:+;
+  [bg][$((VSTREAMINDEX+1)):v]overlay=main_w-overlay_w-20:main_h-overlay_h-20[v]}" \
  -map '0:a' \
  -codec:a libopus -ac "$ACHANNELS" -ar "$AFRAMERATE" -b:a "$ABITRATE" \
  -f rtp -payload_type 111 "rtp://$IP:$FIRSTPORT?pkt_size=1200" \
-- 
cgit v1.2.3