#!/bin/sh

# Receive RTP video and audio streams

set -e
CAMIP=${CAMIP:-$1} # origin host - default: use multicast group
VCOUNT=${VCOUNT:-$2} # number of video stream(s) to display - default: 1
ACOUNT=${ACOUNT:-$3} # number of audio stream(s) to play - default: 0
VFORMAT=${VFORMAT:-$4} # H264 VP8 RAW - default: H264
AFORMAT=${AFORMAT:-$5} # AMR OPUS RAW - default: AMR
set -u

# set multicast groups (also for recorder host) if camera host is wildcard
[ -n "$CAMIP" ] || RECMIP=239.255.0.1
[ -n "$CAMIP" ] || CAMMIP=239.255.0.2
RECHOST="${RECMIP:+address=$RECMIP auto-multicast=true}"
CAMHOST="${CAMIP:+host=$CAMIP}${CAMMIP:+host=$CAMMIP auto-multicast=true}"

case "$VFORMAT" in
 H264|'')
  VCAPS=application/x-rtp,media=video,clock-rate=90000,payload=96,encoding-name=H264
  VDEC="rtph264depay ! avdec_h264"
  ;;
 VP8)
  VCAPS=application/x-rtp,media=video,clock-rate=90000,payload=96,encoding-name=VP8
  VDEC="rtpvp8depay ! vp8dec"
  ;;
 RAW)
  VCAPS=application/x-rtp,media=video,clock-rate=90000,encoding-name=RAW,sampling=YCbCr-4:2:0,depth="(string)8",width="(string)432",height="(string)240",payload=96
  VDEC="rtpvrawdepay ! videoconvert ! queue"
  ;;
esac

case "$AFORMAT" in
 AMR|'')
  ACAPS=application/x-rtp,media=audio,clock-rate=8000,encoding-name=AMR,encoding-params="(string)1",octet-align="(string)1",payload=96
  ADEC="rtpamrdepay ! amrnbdec"
  ;;
 OPUS)
  ACAPS=audio/x-raw,rate=48000,channels=1,format=S16LE,layout=interleaved
  ADEC="rtpopusdepay ! opusdec"
  ;;
 RAW)
  ACAPS=application/x-rtp,media=audio,clock-rate=44100,encoding-name=L16,encoding-params=1,channels=1,payload=96
  ADEC="rtpL16depay"
  ;;
esac

stream() {
 ID=$1
 CAPS=$2
 SINK=$3
 echo \
 udpsrc port=$((5000+ID-1)) $RECHOST caps=\""$CAPS"\" \
  ! rtpbin."recv_rtp_sink_$ID" rtpbin. \
  ! $SINK \
 udpsrc port=$((5010+ID-1)) $RECHOST \
  ! rtpbin."recv_rtcp_sink_$ID" \
 rtpbin."send_rtcp_src_$ID" \
  ! udpsink port=$((5020+ID-1)) $CAMHOST sync=false async=false
}

gst-launch-1.0 -v \
 rtpbin name=rtpbin \
 $(for i in $(seq "${VCOUNT:-1}"); do stream "$i" "$VCAPS" "$VDEC ! autovideosink"; done) \
 $(for j in $(seq "${ACOUNT:-0}"); do stream $((VCOUNT+j)) "$ACAPS" "$ADEC ! autoaudiosink"; done)