diff --git a/vrecord b/vrecord
index ef7d3155..6961c456 100755
--- a/vrecord
+++ b/vrecord
@@ -496,6 +496,7 @@ _setup_vrecord_input(){
GRAB_INPUT+=("${TIME_LIMIT[@]}")
GRAB_INPUT+=(-f lavfi -i sine=440:r=48000)
GRAB_INPUT+=(-pix_fmt yuv422p10le)
+ AUDIOMAP=$(sed "s/0:a:0/1:a:0/g" <<< "$AUDIOMAP")
elif [[ "${DEVICE_INPUT_CHOICE}" = 0 ]] ; then
_set_ffmpeg_loglevel
GRAB_INPUT+=(-f decklink)
@@ -586,12 +587,89 @@ _setup_vrecord_process(){
fi
RECORD_COMMAND+=("${MIDDLEOPTIONS_PRES[@]}" "${MIDDLEOPTIONS_ALL[@]}")
if [[ "${RUNTYPE}" = "record" ]] ; then
- RECORD_COMMAND+=(-filter_complex "[0:v:0]${RECORDINGFILTER#,*}${TC_WRITE}${CAPTION_WRITE}[vout];${AUDIOMAP}" -map "[vout]" "${AUDIO_CHANNEL_MAP[@]}")
- RECORD_COMMAND+=(-f tee [f=${FORMAT}:select=v,${AUDIO_TEE_SELECT_MAP}]"${VRECORD_OUTPUT}"\|[f=nut:onfail=abort:select=v,${AUDIO_TEE_SELECT_MAP},a\\\\:0]pipe:1)
- RECORD_COMMAND+=("${EXTRAOUTPUTS[@]}")
+
+ # construct the video stream processing
+ MAIN_V_PADNAME="MAIN_V"
+ SPLIT_PADS=()
+ SPLIT_MAPS=(-map "[${MAIN_V_PADNAME}]")
+ VIDEO_STREAM_IDX=1
+ if [[ "${FRAMEMD5_CHOICE}" = "true" ]] ; then
+ FRAMEMD5_V_IDX="${VIDEO_STREAM_IDX}"
+ FRAMEMD5NAME="${LOGDIR}/${FULL_OUTPUT_ID}.framemd5"
+ FRAMEMD5_PADNAME="MD5_V"
+ SPLIT_PADS+=("${FRAMEMD5_PADNAME}")
+ SPLIT_MAPS+=(-map "[${FRAMEMD5_PADNAME}]")
+ (( VIDEO_STREAM_IDX++ ))
+ EXTRAOPTIONS+=(-c:v:"${FRAMEMD5_V_IDX}" rawvideo)
+ fi
+ RECORD_COMMAND_MP4_FILTER=""
+ if [[ "${MP4_CHOICE}" = "true" ]] ; then
+ MP4_V_IDX="${VIDEO_STREAM_IDX}"
+ MP4NAME="${DIR}/${FULL_OUTPUT_ID}.mp4"
+ MP4_V_PADNAME="MP4_V"
+ SPLIT_PADS+=("${MP4_V_PADNAME}")
+ RECORD_COMMAND_MP4_FILTER=";[MP4_V]${RECORDINGFILTER_MP4#,},bwdif[${MP4_V_PADNAME}]"
+ SPLIT_MAPS+=(-map "[${MP4_V_PADNAME}]")
+ (( VIDEO_STREAM_IDX++ ))
+ EXTRAOPTIONS+=(-c:v:"${MP4_V_IDX}" h264 -pix_fmt:v:"${MP4_V_IDX}" yuv420p -g:v:"${MP4_V_IDX}" 12 -profile:v:"${MP4_V_IDX}" main -level:v:"${MP4_V_IDX}" "${ACCESS_MP4_LEVEL}" -b:v:"${MP4_V_IDX}" "${ACCESS_MP4_BITRATE}")
+ fi
+
+ # construct end of video filterchain
+ SPLIT_COUNT=$(( 1 + ${#SPLIT_PADS[@]} ))
+ if [[ "${SPLIT_COUNT}" -gt 1 ]] ; then
+ RECORD_COMMAND_SPLIT=",split=${SPLIT_COUNT}[${MAIN_V_PADNAME}]"
+ for OUTPUT_PAD_NAME in "${SPLIT_PADS[@]}" ; do
+ RECORD_COMMAND_SPLIT+="[${OUTPUT_PAD_NAME}]"
+ done
+ else
+ RECORD_COMMAND_SPLIT="[${MAIN_V_PADNAME}]"
+ fi
+
+ # map of the output mapping to the names, used in the benchmark summary
+ OUTPUT_LABELS=""
+ MAP_IDX="0"
+ for PAD in "${SPLIT_MAPS[@]}" "${AUDIO_CHANNEL_MAP[@]}" "${AUDIO_MP4_MAP[@]}" ; do
+ if [[ "${PAD:0:1}" == "[" ]] ; then
+ OUTPUT_LABELS+="${OUTPUT_LABELS:+,}0.${MAP_IDX}=${PAD//[\[\]]/}"
+ ((MAP_IDX++))
+ fi
+ done
+ echo "HEYYYY ${OUTPUT_LABELS}"
+
+ # construct the audio stream processing
+ AUDIO_TEE_SELECT_MAP=""
+ EXTRAOPTIONS+=(-c:a:0 pcm_s24le)
+ AUDIO_STREAM_N=$(( 1 + ${#AUDIO_CHANNEL_IDX[@]} ))
+ MP4_A_TEE_SELECT=""
+ for AUD_IDX in "${AUDIO_CHANNEL_IDX[@]}" ; do
+ AUDIO_TEE_SELECT_MAP+="${AUDIO_TEE_SELECT_MAP:+,}a\\\\:${AUD_IDX}"
+ # fill out audio template per stream
+ for OPTION in "${AUDIO_MIDDLEOPTIONS_TEMPLATE[@]}" ; do
+ RECORD_COMMAND+=("${OPTION//:X/:${AUD_IDX}}")
+ done
+ done
+ if [[ "${MP4_CHOICE}" = "true" ]] ; then
+ for (( MAP_N=0; MAP_N<${#AUDIO_MP4_MAP[@]}/2; MAP_N++ )) ; do
+ MP4_A_TEE_SELECT+=",a\\\\:${AUDIO_STREAM_N}"
+ EXTRAOPTIONS+=(-c:a:"${AUDIO_STREAM_N}" aac)
+ (( AUDIO_STREAM_N++ ))
+ done
+ fi
+
+ RECORD_COMMAND+=(-filter_complex "[0:v:0]${RECORDINGFILTER#,*}${TC_WRITE}${CAPTION_WRITE}${RECORD_COMMAND_SPLIT};${AUDIOMAP}${RECORD_COMMAND_MP4_FILTER}" "${SPLIT_MAPS[@]}" "${AUDIO_CHANNEL_MAP[@]}" $([[ "${MP4_CHOICE}" = "true" ]] && echo "${AUDIO_MP4_MAP[@]}") "${EXTRAOPTIONS[@]}")
+
+ # Build tee string
+ RECORD_COMMAND_TEE_STR="[f=${FORMAT}:select=v\\\\:0,${AUDIO_TEE_SELECT_MAP}]${VRECORD_OUTPUT}"
+ RECORD_COMMAND_TEE_STR+="|[f=nut:onfail=abort:select=v\\\\:0,${AUDIO_TEE_SELECT_MAP},a\\\\:0]pipe:1"
+ if [[ "${FRAMEMD5_CHOICE}" = "true" ]] ; then
+ RECORD_COMMAND_TEE_STR+="|[f=framemd5:hash=MD5:select=v\\\\:${FRAMEMD5_V_IDX}]${FRAMEMD5NAME}"
+ fi
+ if [[ "${MP4_CHOICE}" = "true" ]] ; then
+ RECORD_COMMAND_TEE_STR+="|[f=mp4:onfail=ignore:movflags=write_colr+faststart:select=v\\\\:${MP4_V_IDX}${MP4_A_TEE_SELECT}]${MP4NAME}"
+ fi
+ RECORD_COMMAND+=(-f tee "${RECORD_COMMAND_TEE_STR}")
else
if [[ "${SIGNAL_INPUT}" = 'true' ]] ; then
- PIPE_OUTPUT=(-c:v ffv1)
AUD_PIPE_MAP='1:a'
else
AUD_PIPE_MAP='0:a'
@@ -637,7 +715,7 @@ _setup_vrecord_process(){
VRECORD_STEPS="2" # Steps: record | player (record is adjusted if actually recording)
RECORD_COMMAND=("${FFMPEG_BIN}")
RECORD_COMMAND+=(-nostdin -nostats "${TIME_LIMIT[@]}" "${GRAB_INPUT[@]}")
- RECORD_COMMAND+=("${MIDDLEOPTIONS_PRES[@]}" "${MIDDLEOPTIONS_ALL[@]}")
+ RECORD_COMMAND+=("${MIDDLEOPTIONS_PRES_AUDIO[@]}" "${MIDDLEOPTIONS_ALL[@]}")
if [[ "${RUNTYPE}" = "record" ]] ; then
RECORD_COMMAND+=(-f "${FORMAT}" -filter_complex "${AUDIOMAP}" "${AUDIO_CHANNEL_MAP[@]}" "${VRECORD_OUTPUT}")
fi
@@ -695,6 +773,17 @@ _setup_vrecord_process(){
fi
PLAYER_COMMAND=("${FFPLAY_BIN}" "${FFPLAY_OPTIONS[@]}")
fi
+ if [[ "${VERBOSE_GTKDIALOG}" = "Y" ]] ; then
+ echo "RUNTYPE ${RUNTYPE}"
+ echo "STEPS ${VRECORD_STEPS}"
+ echo "PLAY ${PLAYER_COMMAND[@]}"
+ echo "RECORD ${RECORD_COMMAND[@]}"
+ echo "QCLI ${QCLI_COMMAND_PIPE[@]}"
+ echo "SPLIT_PADS ${SPLIT_PADS[@]}"
+ echo "SPLIT_MAPS ${SPLIT_MAPS[@]}"
+ echo "RECORD_COMMAND_SPLIT ${RECORD_COMMAND_SPLIT[@]}"
+ echo "EXTRAOPTIONS ${EXTRAOPTIONS[@]}"
+ fi
}
_get_inputs(){
@@ -1616,12 +1705,6 @@ _edit_mode(){
# passthrough and audiopassthrough modes
_passthrough_mode(){
_setup_vrecord_process
- if [[ "${VERBOSE_GTKDIALOG}" = "Y" ]] ; then
- echo "RUNTYPE ${RUNTYPE}"
- echo "STEPS ${VRECORD_STEPS}"
- echo "PLAY ${PLAYER_COMMAND[@]}"
- echo "RECORD ${RECORD_COMMAND[@]}"
- fi
if [[ "${PLAYBACKVIEW_CHOICE_PASS}" == "Captions" ]] && [[ "${RUNTYPE}" == "passthrough" ]] ; then
"${SCRIPTDIR}/cchex_to_display" "${FFREPORT_TMP}" "${CAP_DISPLAY_TMP}" > /dev/null 2> /dev/null &
@@ -1962,38 +2045,38 @@ _lookup_choice(){
_add_mediaconch_rule_set "${CODEC_UNCOMPRESSED_TEST}"
if [[ "${PIXEL_FORMAT}" = "yuv422p10" ]] ; then
VIDEOCODECNAME="Uncompressed 10-bit 4:2:2"
- MIDDLEOPTIONS_PRES+=(-c:v v210)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 v210)
elif [[ "${PIXEL_FORMAT}" = "uyvy422" ]] ; then
VIDEOCODECNAME="Uncompressed 8-bit 4:2:2"
- MIDDLEOPTIONS_PRES+=(-c:v rawvideo -pix_fmt uyvy422 -tag:v 2vuy)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 rawvideo -pix_fmt:v:0 uyvy422 -tag:v:0 2vuy)
fi ;;
"FFV1 version 3")
_add_mediaconch_rule_set "${CODEC_FFV1_TEST}"
VIDEOCODECNAME="FFV1 version 3"
- MIDDLEOPTIONS_PRES+=(-c:v ffv1 -level 3 -g 1 -slices "${FFV1_SLICES}" -slicecrc 1)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 ffv1 -level:v:0 3 -g:v:0 1 -slices:v:0 "${FFV1_SLICES}" -slicecrc:v:0 1)
SUFFIX="_ffv1" ;;
"JPEG2000")
VIDEOCODECNAME="JPEG2000"
- MIDDLEOPTIONS_PRES+=(-c:v libopenjpeg)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 libopenjpeg)
SUFFIX="_j2k" ;;
"ProRes")
VIDEOCODECNAME="Apple ProRes 422"
- MIDDLEOPTIONS_PRES+=(-c:v prores_ks -flags +ildct -profile:v 2)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 prores_ks -flags:v:0 +ildct -profile:v:0 2)
SUFFIX="_prores" ;;
"ProRes (HQ)")
VIDEOCODECNAME="Apple ProRes 422 HQ"
- MIDDLEOPTIONS_PRES+=(-c:v prores_ks -flags +ildct -profile:v 3)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 prores_ks -flags:v:0 +ildct -profile:v:0 3)
SUFFIX="_prores" ;;
"h264")
VIDEOCODECNAME="H.264"
- MIDDLEOPTIONS_PRES+=(-c:v h264 -pix_fmt yuv420p)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 h264 -pix_fmt:v:0 yuv420p)
SUFFIX="_h264" ;;
"HuffYUV")
VIDEOCODECNAME="HuffYUV"
if [[ "${PIXEL_FORMAT}" = "yuv422p10" ]] ; then
- MIDDLEOPTIONS_PRES+=(-c:v ffvhuff -pix_fmt yuv422p10le -pred median -context 1)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 ffvhuff -pix_fmt:v:0 yuv422p10le -pred:v:0 median -context:v:0 1)
elif [[ "${PIXEL_FORMAT}" = "uyvy422" ]] ; then
- MIDDLEOPTIONS_PRES+=(-c:v ffvhuff -pix_fmt yuv422p -pred median -context 1)
+ MIDDLEOPTIONS_PRES+=(-c:v:0 ffvhuff -pix_fmt:v:0 yuv422p -pred:v:0 median -context:v:0 1)
fi
SUFFIX="_huff" ;;
@@ -2003,86 +2086,86 @@ _lookup_choice(){
# audio codec
"24-bit PCM")
- MIDDLEOPTIONS_PRES+=(-c:a pcm_s24le)
- MIDDLEOPTIONS_PRES+=(-rf64 auto)
+ MIDDLEOPTIONS_PRES_AUDIO+=(-c:a pcm_s24le)
+ MIDDLEOPTIONS_PRES_AUDIO+=(-rf64 auto)
+ AUDIO_MIDDLEOPTIONS_TEMPLATE+=(-c:a:X pcm_s24le)
AUDIO_EXT='wav' ;;
"24-bit FLAC")
- MIDDLEOPTIONS_PRES+=(-c:a flac)
- MIDDLEOPTIONS_PRES+=(-sample_fmt s32)
- MIDDLEOPTIONS_PRES+=(-bits_per_raw_sample:a 24)
+ MIDDLEOPTIONS_PRES_AUDIO+=(-c:a flac)
+ MIDDLEOPTIONS_PRES_AUDIO+=(-sample_fmt s32)
+ MIDDLEOPTIONS_PRES_AUDIO+=(-bits_per_raw_sample:a 24)
+ AUDIO_MIDDLEOPTIONS_TEMPLATE+=(-c:a:X flac -sample_fmt:a:X s32 -bits_per_raw_sample:a:X 24)
AUDIO_EXT='flac' ;;
"AAC")
- MIDDLEOPTIONS_PRES+=(-c:a aac) ;;
+ MIDDLEOPTIONS_PRES_AUDIO+=(-c:a aac)
+ AUDIO_MIDDLEOPTIONS_TEMPLATE+=(-c:a:X aac) ;;
# audio mappings
"2 Stereo Tracks (Channels 1 & 2 -> 1st Track Stereo, Channels 3 & 4 -> 2nd Track Stereo)")
- AUDIOMAP="[0:a:0]asplit[orig],pan=stereo| c0=c0 | c1=${PHASE_VALUE_2}c1[stereo1];[0:a:0]pan=stereo| c0=c2 | c1=${PHASE_VALUE_4}c3[stereo2]"
- AUDIOMAP_MP4="[0:a:0]pan=stereo| c0=c0 | c1=${PHASE_VALUE_2}c1[stereo1];[0:a:0]pan=stereo| c0=c2 | c1=${PHASE_VALUE_4}c3[stereo2]"
+ ASPLIT_N=$([[ "${MP4_CHOICE}" = "true" ]] && echo 2 || echo 1)
+ AUDIOMAP="[0:a:0]asplit=2[ORIG_A][ORIG_A2];[ORIG_A2]pan=stereo|c0=c0|c1=${PHASE_VALUE_2}c1,asplit=${ASPLIT_N}[MAIN_STEREO_A1]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A1]");[0:a:0]pan=stereo|c0=c2|c1=${PHASE_VALUE_4}c3,asplit=${ASPLIT_N}[MAIN_STEREO_A2]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A2]")"
AUDIO_PLAY_MAP="pan=4c|c0=c0|c1=${PHASE_VALUE_2}c1|c2=c2|c3=${PHASE_VALUE_4}c3"
AUDIO_PLAY_LABELS=",drawtext=fontfile=${DEFAULTFONT}:text='L(1)':fontcolor=white:fontsize=18:x=0:y=0,drawtext=fontfile=${DEFAULTFONT}:text='R(1)':fontcolor=white:fontsize=18:x=0:y=20,drawtext=fontfile=${DEFAULTFONT}:text='L(2)':fontcolor=white:fontsize=18:x=0:y=40,drawtext=fontfile=${DEFAULTFONT}:text='R(2)':fontcolor=white:fontsize=18:x=0:y=60"
- AUDIO_CHANNEL_MAP+=(-map "[orig]")
- AUDIO_CHANNEL_MAP+=(-map "[stereo1]")
- AUDIO_CHANNEL_MAP+=(-map "[stereo2]")
- AUDIO_TEE_SELECT_MAP="a\\\\:1,a\\\\:2" ;;
+ AUDIO_CHANNEL_MAP+=(-map "[ORIG_A]" -map "[MAIN_STEREO_A1]" -map "[MAIN_STEREO_A2]")
+ [[ "${MP4_CHOICE}" = "true" ]] && AUDIO_MP4_MAP+=(-map "[MP4_A1]" -map "[MP4_A2]")
+ AUDIO_CHANNEL_IDX=(1 2) ;;
"1 Stereo Track (From Channels 1 & 2)")
- AUDIOMAP="[0:a:0]asplit[orig],pan=stereo| c0=c0 | c1=${PHASE_VALUE_2}c1[stereo1]"
- AUDIOMAP_MP4="[0:a:0]pan=stereo| c0=c0 | c1=${PHASE_VALUE_2}c1[stereo1]"
+ ASPLIT_N=$([[ "${MP4_CHOICE}" = "true" ]] && echo 2 || echo 1)
+ AUDIOMAP="[0:a:0]asplit=2[ORIG_A][ORIG_A2];[ORIG_A2]pan=stereo|c0=c0|c1=${PHASE_VALUE_2}c1,asplit=${ASPLIT_N}[MAIN_STEREO_A1]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A1]")"
AUDIO_PLAY_MAP="pan=stereo|c0=c0|c1=${PHASE_VALUE_2}c1"
AUDIO_PLAY_LABELS=",drawtext=fontfile=${DEFAULTFONT}:text='L(1)':fontcolor=white:fontsize=18:x=0:y=0,drawtext=fontfile=${DEFAULTFONT}:text='R(1)':fontcolor=white:fontsize=18:x=0:y=20"
- AUDIO_CHANNEL_MAP+=(-map "[orig]")
- AUDIO_CHANNEL_MAP+=(-map "[stereo1]")
- AUDIO_TEE_SELECT_MAP="a\\\\:1" ;;
+ AUDIO_CHANNEL_MAP+=(-map "[ORIG_A]" -map "[MAIN_STEREO_A1]")
+ [[ "${MP4_CHOICE}" = "true" ]] && AUDIO_MP4_MAP+=(-map "[MP4_A1]")
+ AUDIO_CHANNEL_IDX=(1) ;;
"1 Stereo Track (From Channels 3 & 4)")
- AUDIOMAP="[0:a:0]asplit[orig],pan=stereo| c0=c2 | c1=${PHASE_VALUE_2}c3[stereo1]"
- AUDIOMAP_MP4="[0:a:0]pan=stereo| c0=c2 | c1=${PHASE_VALUE_2}c3[stereo1]"
+ ASPLIT_N=$([[ "${MP4_CHOICE}" = "true" ]] && echo 2 || echo 1)
+ AUDIOMAP="[0:a:0]asplit=2[ORIG_A][ORIG_A2];[ORIG_A2]pan=stereo|c0=c2|c1=${PHASE_VALUE_2}c3,asplit=${ASPLIT_N}[MAIN_STEREO_A1]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A1]")"
AUDIO_PLAY_MAP="pan=stereo|c0=c2|c1=${PHASE_VALUE_2}c3"
AUDIO_PLAY_LABELS=",drawtext=fontfile=${DEFAULTFONT}:text='L(1)':fontcolor=white:fontsize=18:x=0:y=40,drawtext=fontfile=${DEFAULTFONT}:text='R(1)':fontcolor=white:fontsize=18:x=0:y=60"
- AUDIO_CHANNEL_MAP+=(-map "[orig]")
- AUDIO_CHANNEL_MAP+=(-map "[stereo1]")
- AUDIO_TEE_SELECT_MAP="a\\\\:1" ;;
+ AUDIO_CHANNEL_MAP+=(-map "[ORIG_A]" -map "[MAIN_STEREO_A1]")
+ [[ "${MP4_CHOICE}" = "true" ]] && AUDIO_MP4_MAP+=(-map "[MP4_A1]")
+ AUDIO_CHANNEL_IDX=(1) ;;
"Channel 1 -> 1st Track Mono, Channel 2 -> 2nd Track Mono")
- AUDIOMAP="[0:a:0]asplit[orig],pan=mono| c0=c0[mono1];[0:a:0]pan=mono| c0=${PHASE_VALUE_2}c1[mono2]"
- AUDIOMAP_MP4="[0:a:0]pan=mono| c0=c0[mono1];[0:a:0]pan=mono| c0=${PHASE_VALUE_2}c1[mono2]"
+ ASPLIT_N=$([[ "${MP4_CHOICE}" = "true" ]] && echo 2 || echo 1)
+ AUDIOMAP="[0:a:0]asplit=2[ORIG_A][ORIG_A2];[ORIG_A2]pan=mono|c0=c0,asplit=${ASPLIT_N}[MAIN_MONO_A1]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A1]");[0:a:0]pan=mono| c0=${PHASE_VALUE_2}c1,asplit=${ASPLIT_N}[MAIN_MONO_A2]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A2]")"
AUDIO_PLAY_MAP="pan=stereo|c0=c0|c1=${PHASE_VALUE_2}c1"
AUDIO_PLAY_LABELS=",drawtext=fontfile=${DEFAULTFONT}:text='M(1)':fontcolor=white:fontsize=18:x=0:y=0,drawtext=fontfile=${DEFAULTFONT}:text='M(2)':fontcolor=white:fontsize=18:x=0:y=20"
- AUDIO_CHANNEL_MAP+=(-map "[orig]")
- AUDIO_CHANNEL_MAP+=(-map "[mono1]")
- AUDIO_CHANNEL_MAP+=(-map "[mono2]")
- AUDIO_TEE_SELECT_MAP="a\\\\:1,a\\\\:2" ;;
+ AUDIO_CHANNEL_MAP+=(-map "[ORIG_A]" -map "[MAIN_MONO_A1]" -map "[MAIN_MONO_A2]")
+ [[ "${MP4_CHOICE}" = "true" ]] && AUDIO_MP4_MAP+=(-map "[MP4_A1]" -map "[MP4_A2]")
+ AUDIO_CHANNEL_IDX=(1 2) ;;
"Channel 2 -> 1st Track Mono, Channel 1 -> 2nd Track Mono")
- AUDIOMAP="[0:a:0]asplit[orig],pan=mono| c0=${PHASE_VALUE_2}c1[mono1];[0:a:0]pan=mono| c0=c0[mono2]"
- AUDIOMAP_MP4="[0:a:0]pan=mono| c0=${PHASE_VALUE_2}c1[mono1];[0:a:0]pan=mono| c0=c0[mono2]"
+ ASPLIT_N=$([[ "${MP4_CHOICE}" = "true" ]] && echo 2 || echo 1)
+ AUDIOMAP="[0:a:0]asplit=2[ORIG_A][ORIG_A2];[ORIG_A2]pan=mono|c0=${PHASE_VALUE_2}c1,asplit=${ASPLIT_N}[MAIN_MONO_A1]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A1]");[0:a:0]pan=mono| c0=c0,asplit=${ASPLIT_N}[MAIN_MONO_A2]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A2]")"
AUDIO_PLAY_MAP="pan=stereo|c0=${PHASE_VALUE_2}c1|c1=c0"
AUDIO_PLAY_LABELS=",drawtext=fontfile=${DEFAULTFONT}:text='M(2)':fontcolor=white:fontsize=18:x=0:y=0,drawtext=fontfile=${DEFAULTFONT}:text='M(1)':fontcolor=white:fontsize=18:x=0:y=20"
- AUDIO_CHANNEL_MAP+=(-map "[orig]")
- AUDIO_CHANNEL_MAP+=(-map "[mono1]")
- AUDIO_CHANNEL_MAP+=(-map "[mono2]")
- AUDIO_TEE_SELECT_MAP="a\\\\:1,a\\\\:2" ;;
+ AUDIO_CHANNEL_MAP+=(-map "[ORIG_A]" -map "[MAIN_MONO_A1]" -map "[MAIN_MONO_A2]")
+ [[ "${MP4_CHOICE}" = "true" ]] && AUDIO_MP4_MAP+=(-map "[MP4_A1]" -map "[MP4_A2]")
+ AUDIO_CHANNEL_IDX=(1 2) ;;
"Channel 1 -> Single Track Mono")
- AUDIOMAP="[0:a:0]asplit[orig],pan=mono| c0=c0[mono1]"
- AUDIOMAP_MP4="[0:a:0]pan=mono| c0=c0[mono1]"
+ ASPLIT_N=$([[ "${MP4_CHOICE}" = "true" ]] && echo 2 || echo 1)
+ AUDIOMAP="[0:a:0]asplit=2[ORIG_A][ORIG_A2];[ORIG_A2]pan=mono|c0=c0,asplit=${ASPLIT_N}[MAIN_MONO_A1]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A1]")"
AUDIO_PLAY_MAP="pan=mono| c0=c0"
AUDIO_PLAY_LABELS=",drawtext=fontfile=${DEFAULTFONT}:text='M(1)':fontcolor=white:fontsize=18:x=0:y=0"
- AUDIO_CHANNEL_MAP+=(-map "[orig]")
- AUDIO_CHANNEL_MAP+=(-map "[mono1]")
- AUDIO_TEE_SELECT_MAP="a\\\\:1" ;;
+ AUDIO_CHANNEL_MAP+=(-map "[ORIG_A]" -map "[MAIN_MONO_A1]")
+ [[ "${MP4_CHOICE}" = "true" ]] && AUDIO_MP4_MAP+=(-map "[MP4_A1]")
+ AUDIO_CHANNEL_IDX=(1) ;;
"Channel 2 -> Single Track Mono")
- AUDIOMAP="[0:a:0]asplit[orig],pan=mono| c0=c1[mono1]"
- AUDIOMAP_MP4="[0:a:0]pan=mono| c0=c1[mono1]"
+ ASPLIT_N=$([[ "${MP4_CHOICE}" = "true" ]] && echo 2 || echo 1)
+ AUDIOMAP="[0:a:0]asplit=2[ORIG_A][ORIG_A2];[ORIG_A2]pan=mono|c0=c1,asplit=${ASPLIT_N}[MAIN_MONO_A1]$([[ "${MP4_CHOICE}" = "true" ]] && echo "[MP4_A1]")"
AUDIO_PLAY_MAP="pan=mono| c0=c1"
AUDIO_PLAY_LABELS=",drawtext=fontfile=${DEFAULTFONT}:text='M(1)':fontcolor=white:fontsize=18:x=0:y=20"
- AUDIO_CHANNEL_MAP+=(-map "[orig]")
- AUDIO_CHANNEL_MAP+=(-map "[mono1]")
- AUDIO_TEE_SELECT_MAP="a\\\\:1" ;;
+ AUDIO_CHANNEL_MAP+=(-map "[ORIG_A]" -map "[MAIN_MONO_A1]")
+ [[ "${MP4_CHOICE}" = "true" ]] && AUDIO_MP4_MAP+=(-map "[MP4_A1]")
+ AUDIO_CHANNEL_IDX=(1) ;;
# Audio mode channel options
"Mono")
- AUDIOMAP="[0:a:0]pan=mono| c0=c0[mono1]"
+ AUDIOMAP="[0:a:0]pan=mono| c0=c0[MAIN_MONO_A1]"
PASSTHROUGH_MAP="pan=mono|c0=c0"
- AUDIO_CHANNEL_MAP+=(-map "[mono1]") ;;
+ AUDIO_CHANNEL_MAP+=(-map "[MAIN_MONO_A1]") ;;
"Stereo")
- AUDIOMAP="[0:a:0]pan=stereo| c0=c0 | c1=${PHASE_VALUE_2}c1[stereo1]"
+ AUDIOMAP="[0:a:0]pan=stereo| c0=c0 | c1=${PHASE_VALUE_2}c1[MAIN_STEREO_A1]"
PASSTHROUGH_MAP="pan=stereo|c0=c0|c1=${PHASE_VALUE_2}c1"
- AUDIO_CHANNEL_MAP+=(-map "[stereo1]") ;;
+ AUDIO_CHANNEL_MAP+=(-map "[MAIN_STEREO_A1]") ;;
# Audio mode sample rate options
"96 kHz")
S_RATE='-ar 96k'
@@ -2107,11 +2190,9 @@ _lookup_choice(){
_add_mediaconch_rule_set "${STANDARD_NTSC_TEST}"
fi
RECORDINGFILTER_MP4+=",crop=w=720:h=480:x=0:y=4"
- _set_some_params
SET_COLOR_PRIMARIES="smpte170m"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="smpte170m"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="smpte170m" ;;
"PAL")
STANDARD="pal "
DECKLINK_FPS="25000/1000"
@@ -2119,132 +2200,108 @@ _lookup_choice(){
FFV1_SLICES=24
SIG_INTERLACEMENT="tff"
_add_mediaconch_rule_set "${STANDARD_PAL_TEST}"
- _set_some_params
SET_COLOR_PRIMARIES="bt470bg"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt470bg"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt470bg" ;;
"23ps - 1080p23.98")
STANDARD="23ps"
DECKLINK_FPS="24000/1001"
SIG_GEN_SIZE="1920x1080"
FFV1_SLICES=128
SIG_INTERLACEMENT="prog"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"24ps - 1080p24")
STANDARD="24ps"
DECKLINK_FPS="24000/1000"
SIG_GEN_SIZE="1920x1080"
FFV1_SLICES=128
SIG_INTERLACEMENT="prog"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"Hp25 - 1080p25")
STANDARD="Hp25"
DECKLINK_FPS="25000/1000"
SIG_GEN_SIZE="1920x1080"
FFV1_SLICES=128
SIG_INTERLACEMENT="prog"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"Hp29 - 1080p29.97")
STANDARD="Hp29"
DECKLINK_FPS="30000/1001"
SIG_GEN_SIZE="1920x1080"
FFV1_SLICES=128
SIG_INTERLACEMENT="prog"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"Hp30 - 1080p30")
STANDARD="Hp30"
DECKLINK_FPS="30000/1000"
SIG_GEN_SIZE="1920x1080"
FFV1_SLICES=128
SIG_INTERLACEMENT="prog"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"Hi50 - 1080i50")
STANDARD="Hi50"
DECKLINK_FPS="25000/1000"
SIG_GEN_SIZE="1920x1080"
FFV1_SLICES=128
SIG_INTERLACEMENT="tff"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"Hi59 - 1080i59.94")
STANDARD="Hi59"
DECKLINK_FPS="30000/1001"
SIG_GEN_SIZE="1920x1080"
FFV1_SLICES=128
SIG_INTERLACEMENT="tff"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"Hi60 - 1080i60")
STANDARD="Hi60"
DECKLINK_FPS="30000/1000"
SIG_GEN_SIZE="1920x1080"
FFV1_SLICES=128
SIG_INTERLACEMENT="tff"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"hp50 - 720p50")
STANDARD="hp50"
DECKLINK_FPS="50000/1000"
SIG_GEN_SIZE="1280x720"
FFV1_SLICES=64
SIG_INTERLACEMENT="prog"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"hp59 - 720p59.94")
STANDARD="hp59"
DECKLINK_FPS="60000/1001"
SIG_GEN_SIZE="1280x720"
FFV1_SLICES=64
SIG_INTERLACEMENT="prog"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
"hp60 - 720p60")
STANDARD="hp60"
DECKLINK_FPS="60000/1000"
SIG_GEN_SIZE="1280x720"
FFV1_SLICES=64
SIG_INTERLACEMENT="prog"
- _set_some_params
SET_COLOR_PRIMARIES="bt709"
SET_COLOR_TRC="bt709"
- SET_COLORSPACE="bt709"
- RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}" ;;
+ SET_COLORSPACE="bt709" ;;
# aspect ratio options
"4/3")
if [[ "${STANDARD}" = "ntsc" ]] ; then
@@ -2710,6 +2767,8 @@ _review_all_options(){
_review_option "VIDEO_BIT_DEPTH_CHOICE" "${VIDEO_BITDEPTH_OPTIONS[@]}"
_review_option "AUDIO_MAPPING_CHOICE" "${CHANNEL_MAPPING_OPTIONS[@]}"
_review_option "STANDARD_CHOICE" "${STANDARD_OPTIONS[@]}"
+ _set_some_params
+ RECORDINGFILTER+=",setparams=range=${SET_RANGE}:color_primaries=${SET_COLOR_PRIMARIES}:color_trc=${SET_COLOR_TRC}:colorspace=${SET_COLORSPACE}:field_mode=${SET_FIELD_MODE}"
_review_option -d "4/3" "ASPECT_RATIO_CHOICE" "${ASPECT_RATIO_OPTIONS[@]}"
_review_option -n -d "10/11" "NTSC_43_SAR_CHOICE" "${NTSC_43_SAR_OPTIONS[@]}"
_review_option -n -d "40/33" "NTSC_169_SAR_CHOICE" "${NTSC_169_SAR_OPTIONS[@]}"
@@ -2810,6 +2869,7 @@ CODEC_GENERAL_TEST='
YUV
CFR
YUV
+ 4:2:2
2vuy
@@ -3197,6 +3257,15 @@ if [[ "${DEVICE_INPUT_CHOICE}" = "0" ]] ; then
_review_option "CONTAINER_CHOICE" "${CONTAINER_OPTIONS[@]}"
_review_option "VIDEO_CODEC_CHOICE" "${VIDEO_CODEC_OPTIONS[@]}"
_review_option "AUDIO_CODEC_CHOICE" "${AUDIO_CODEC_OPTIONS[@]}"
+ _review_option "QCTOOLSXML_CHOICE" "${QCTOOLSXML_OPTIONS[@]}"
+ if [[ "${QCTOOLSXML_CHOICE}" != "No" && ! "$(command -v qcli)" ]] ; then
+ _report -w "Please install qcli to use the qctools reporting option."
+ _report -w "Such as \`brew install qcli\`."
+ exit 1
+ fi
+ if [[ "${FORMAT}" = "matroska" ]] ; then
+ _review_option "EMBED_LOGS_CHOICE" "${EMBED_LOGS_OPTIONS[@]}"
+ fi
elif [[ "${DEVICE_INPUT_CHOICE}" = "1" ]] ; then
_review_option "DV_CONTAINER_CHOICE" "${DV_CONTAINER_OPTIONS[@]}"
FORMAT="rawvideo"
@@ -3231,31 +3300,6 @@ if [[ -f "${VRECORD_OUTPUT}" ]] ; then
exit
fi
-if [[ "${DEVICE_INPUT_CHOICE}" = "0" ]] ; then
- _review_option "QCTOOLSXML_CHOICE" "${QCTOOLSXML_OPTIONS[@]}"
- if [[ "${QCTOOLSXML_CHOICE}" != "No" && ! "$(command -v qcli)" ]] ; then
- _report -w "Please install qcli to use the qctools reporting option."
- _report -w "Such as \`brew install qcli\`."
- exit 1
- fi
- if [[ "${FRAMEMD5_CHOICE}" = "true" ]] ; then
- FRAMEMD5NAME="${LOGDIR}/${FULL_OUTPUT_ID}.framemd5"
- EXTRAOUTPUTS+=(-an -f framemd5 "${FRAMEMD5NAME}")
- fi
- if [[ "${SIGNAL_INPUT}" = 'true' ]] ; then
- AUDIOMAP=$(sed "s/0:a:0/1:a:0/g" <<< "$AUDIOMAP")
- fi
- if [[ "${MP4_CHOICE}" = "true" ]] ; then
- RECORDINGFILTER_MP4+=",bwdif,format=yuv420p"
- RECORD_COMMAND_MP4+=(-filter_complex "[0:v:0]${RECORDINGFILTER_MP4#,*}[mp4_v_out];${AUDIOMAP_MP4}")
- MP4NAME="${DIR}/${FULL_OUTPUT_ID}.mp4"
- EXTRAOUTPUTS+=("${MIDDLEOPTIONS_ALL[@]}" -movflags write_colr+faststart "${RECORD_COMMAND_MP4[@]}" -c:v h264 -g 12 -profile:v main -level "${ACCESS_MP4_LEVEL}" -b:v "${ACCESS_MP4_BITRATE}" -c:a aac -map "[mp4_v_out]" "${AUDIO_CHANNEL_MAP[@]:2}" "${MP4NAME}")
- fi
- if [[ "${FORMAT}" = "matroska" ]] ; then
- _review_option "EMBED_LOGS_CHOICE" "${EMBED_LOGS_OPTIONS[@]}"
- fi
-fi
-
if [[ -n "${DURATION}" ]] ; then
DUR_SECONDS=$(bc <<< "${DURATION} * 60" | sed "s/^\./0./")
TIME_LIMIT=(-t "${DUR_SECONDS}")
@@ -3366,12 +3410,6 @@ _report -d "Close the playback window to stop recording."
# vrecord process!
_setup_vrecord_process
-if [[ "${VERBOSE_GTKDIALOG}" = "Y" ]] ; then
- echo "STEPS ${VRECORD_STEPS}"
- echo "PLAY ${PLAYER_COMMAND[@]}"
- echo "RECORD ${RECORD_COMMAND[@]}"
- echo "QCLI ${QCLI_COMMAND_PIPE[@]}"
-fi
if [[ "${VRECORD_STEPS}" = "2" ]] ; then
_writeingestlog "Record command" "${RECORD_COMMAND[@]}"
_writeingestlog "Playback command" "${PLAYER_COMMAND[@]}"
@@ -3424,8 +3462,14 @@ if [[ "${DEVICE_INPUT_CHOICE}" = 0 ]] ; then
grep " bench: " "${FULL_CAPTURE_LOG}" > "${BENCHMARK_DETAILS_NAME}"
grep -v " bench: " "${FULL_CAPTURE_LOG}" > "${FULL_CAPTURE_LOG}.tmp"
mv "${FULL_CAPTURE_LOG}.tmp" "${FULL_CAPTURE_LOG}"
- awk 'BEGIN { printf "%-8s %-6s %-8s %-12s %-5s %-10s %-10s %-10s %-10s %-10s %-8s %-10s\n", "action","media","stream","label","n","user","sys","real","real/user","sys/user","%user","avg_us"
- CEIL = 10000000 }
+ awk -v labels="${OUTPUT_LABELS}" 'BEGIN { printf "%-8s %-6s %-8s %-16s %-5s %-10s %-10s %-10s %-10s %-10s %-8s %-10s\n", "action","media","stream","label","n","user","sys","real","real/user","sys/user","%user","avg_us"
+ CEIL = 10000000
+ nlbl = split(labels, pairs, ",")
+ for (i = 1; i <= nlbl; i++) {
+ split(pairs[i], kv, "=")
+ label[kv[1]] = kv[2]
+ }
+ }
$1 == "#label" { label[$2] = $3; next }
$2 == "bench:" && $4 == "user" && $6 == "sys" && $8 == "real" {
if ($3 !~ /^[0-9]+$/ || $5 !~ /^[0-9]+$/ || $7 !~ /^[0-9]+$/ ||
@@ -3444,7 +3488,7 @@ if [[ "${DEVICE_INPUT_CHOICE}" = 0 ]] ; then
sysratio = (u[k] > 0) ? s[k] / u[k] : 0
share = (TOTAL_U > 0) ? 100 * u[k] / TOTAL_U : 0
avgus = (n[k] > 0) ? r[k] / n[k] : 0
- printf "%-8s %-6s %-8s %-12s %-5d %-10d %-10d %-10d %-10.3f %-10.3f %-8.2f %-10.1f\n", \
+ printf "%-8s %-6s %-8s %-16s %-5d %-10d %-10d %-10d %-10.3f %-10.3f %-8.2f %-10.1f\n", \
f[1], f[2], f[3], lbl[k], n[k], u[k], s[k], r[k], ratio, sysratio, share, avgus
}
if (bad > 0) printf "\n[skipped %d malformed/out-of-range bench line(s)]\n", bad