You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
videostation-ffmpeg-patcher/wrappers/ffmpeg.sh

148 lines
2.6 KiB
Bash

#!/bin/bash
#########################
# VARS
#########################
ffmpeg_version=@ffmpeg_version@
pid=$$
child=""
stderrfile="/tmp/ffmpeg-$pid.stderr"
errcode=0
path=$(realpath "$0")
args=()
#########################
# UTILS
#########################
log() {
local now
now=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$now] [$1] $2" >> "$stderrfile"
}
newline() {
echo "" >> "$stderrfile"
}
info() {
log "INFO" "$1"
}
kill_child() {
if [[ "$child" != "" ]]; then
kill "$child" > /dev/null 2> /dev/null || :
fi
}
endprocess() {
info "========================================[end $0 $pid]"
newline
if [[ $errcode -eq 1 ]]; then
cp "$stderrfile" "$stderrfile.prev"
fi
kill_child
rm -f "$stderrfile"
exit "$errcode"
}
handle_error() {
log "ERROR" "An error occurred"
newline
errcode=1
kill_child
}
fix_args() {
while [[ $# -gt 0 ]]; do
case "$1" in
-ss)
shift
args+=("-ss" "$1" "-noaccurate_seek")
;;
-acodec)
shift
if [[ "$1" = "libfaac" ]]; then
args+=("-acodec" "aac")
else
args+=("-acodec" "libfdk_aac")
fi
;;
-vf)
shift
arg="$1"
if [[ "$arg" =~ "scale_vaapi" ]]; then
scale_w=$(echo "$arg" | sed -n 's/.*w=\([0-9]\+\):h=\([0-9]\+\).*/\1/p')
scale_h=$(echo "$arg" | sed -n 's/.*w=\([0-9]\+\):h=\([0-9]\+\).*/\2/p')
if (( scale_w && scale_h )); then
arg="format=nv12|vaapi,hwupload,scale_vaapi=w=$scale_w:h=$scale_h:format=nv12"
else
arg="format=nv12|vaapi,hwupload,scale_vaapi=format=nv12"
fi
fi
args+=("-vf" "$arg")
;;
-r)
shift
;;
*) args+=("$1") ;;
esac
shift
done
}
#########################
# ENTRYPOINT
#########################
trap endprocess SIGINT SIGTERM
trap handle_error ERR
rm -f /tmp/ffmpeg*.stderr.prev
fix_args "$@"
newline
info "========================================[start $0 $pid]"
info "DEFAULT ARGS: $*"
info "UPDATED ARGS: ${args[*]}"
info "Trying fixed args with $path.orig ..."
"${path}.orig" "${args[@]}" <&0 2>> $stderrfile &
child=$!
wait "$child"
if [[ $errcode -eq 0 ]]; then
endprocess
fi
errcode=0
info "Trying default args with $path.orig ..."
"${path}.orig" "$@" <&0 2>> $stderrfile &
child=$!
wait "$child"
if [[ $errcode -eq 0 ]]; then
endprocess
fi
errcode=0
info "Trying with SC's $ffmpeg_version and fixed args..."
"/var/packages/${ffmpeg_version}/target/bin/ffmpeg" "${args[@]}" <&0 2>> $stderrfile &
child=$!
wait "$child"
endprocess