#!/bin/sh

set -e

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

while getopts 'am' arg
do
    case ${arg} in
        a) MIC=1; ;;
        m) MON=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<c0+c1\|c1<c0+c1 \
        -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}"

printf 'Press q to stop.\n'
set -x
ffmpeg ${_head_param} ${_ffmpeg_param} "${_vidfile}"
set +x

if [ ${MON} ] || [ ${MIC} ]; then
    _audio_encode_param="-c:a aac -b:a 160k -ac 2 -filter_complex amerge=inputs=${_ffmpeg_map}"
fi

printf 'Encoding...\n'
set -x
ffmpeg -hide_banner -y \
    -i "${_vidfile}" \
    -c:v libx265 \
    -crf 21 \
    -s 1920x1080 \
    -preset medium \
    -movflags faststart \
    -threads 8 \
    ${_audio_encode_param} \
    "${_outfile}"
set +x
printf '%s\n' "${_outfile}"
