#!/bin/sh

set -e

_outfile="/home/sdk/rec-encoded-$(date "+%Y%m%d_%H%M%S").mp4"

while getopts 'ame' arg
do
    case ${arg} in
        a) MIC=1; ;;
        m) MON=1; ;;
        e) EONLY=1; ;;
    esac
done

_head_param="\
    -y \
    -loglevel error \
    -hide_banner"

_mon_in="\
        -thread_queue_size 16 \
        -f sndio \
        -i snd/mon"

_mon_proc="\
        -c:a pcm_s16le"

_mic_in="\
        -thread_queue_size 16 \
        -f sndio \
        -i snd/default"

_mic_proc="\
        -af pan='stereo|c0=FL|c1=FL' \
        -c:a pcm_s16le"

_vid_in="\
        -probesize 10000000 \
        -f x11grab \
        -i :0.0"

_vid_proc="\
        -framerate 30 \
        -c:v libx264rgb \
        -crf 0 \
        -qp 0 \
        -framerate 30 \
        -sws_flags neighbor \
        -preset ultrafast \
        -tune zerolatency"

_map=0;

_ffmpeg_map=0
_ffmpeg_param_input="${_vid_in}"
_ffmpeg_param_procs="-map ${_ffmpeg_map}:v ${_vid_proc}"

if [ "${MIC}" ]; then
    _ffmpeg_map=$(( _ffmpeg_map + 1 ))
    _ffmpeg_param_input="${_ffmpeg_param_input} ${_mic_in}"
    _ffmpeg_param_procs="${_ffmpeg_param_procs} -map ${_ffmpeg_map}:a ${_mic_proc}"
fi

if [ "${MON}" ]; then
    _ffmpeg_map=$(( _ffmpeg_map + 1 ))
    _ffmpeg_param_input="${_ffmpeg_param_input} ${_mon_in}"
    _ffmpeg_param_procs="${_ffmpeg_param_procs} -map ${_ffmpeg_map}:a ${_mon_proc}"
fi

_ffmpeg_param="${_ffmpeg_param_input} ${_ffmpeg_param_procs}"

if [ ${MON} ] || [ ${MIC} ]; then
    _audio_encode_param="-filter_complex amix=inputs=${_ffmpeg_map},stereotools=phase=5,compand=attacks=0:points=-80/-115|-35.1/-80|-35/-35|20/20 -c:a aac -b:a 160k"
fi

printf 'Press q to stop.\n'
set -x

ffmpeg \
    ${_head_param} \
    ${_ffmpeg_param} \
    -f nut pipe: \
        | ffmpeg \
            -hide_banner \
            -y \
            -i pipe: \
            -c:v libx265 \
            -crf 28 \
            -s 1920x1080 \
            -preset veryfast \
            -movflags faststart \
            -threads 8 \
            ${_audio_encode_param} \
            "${_outfile}"

set +x
printf '%s\n' "${_outfile}"