diff --git a/.gitignore b/.gitignore index ea8c4bf..ae4d0ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +/result \ No newline at end of file diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..46af1ef --- /dev/null +++ b/default.nix @@ -0,0 +1,21 @@ +let + pkgs = import {}; +in +with pkgs; +stdenv.mkDerivation { + pname = "triav1c"; + version = "0.0.0-20200715-0"; + + src = ./. ; + + nativeBuildInputs = [ makeWrapper ]; + + installPhase = '' + mkdir -p $out/bin + cp src/static/triav1c.sh $out/bin/triav1c + chmod +x $out/bin/triav1c + + wrapProgram $out/bin/triav1c \ + --prefix PATH : ${lib.makeBinPath [ ffmpeg libaom ]} + ''; +} \ No newline at end of file diff --git a/src/static/triav1c.sh b/src/static/triav1c.sh new file mode 100644 index 0000000..f928625 --- /dev/null +++ b/src/static/triav1c.sh @@ -0,0 +1,81 @@ +#! /usr/bin/env bash +############################################################ +# A simpler rewrite of av1master client.sh for prototyping # +############################################################ +set -euo pipefail +IFS=$'\n\t' + + +####################### +# $1 - file # +# $2 - AOM Options # +# $3 - FFMPEG Options # +# $4 - do VMAF? # +####################### +encode_aomenc_two_pass() { + file="$1" + aom_options="$2" + # Remove any character that isn't a letter, an underscore, a dash, or = + # Hopefully "cleans" the commandline + # so that you can't just take over a system + # Still possible to misuse ffmpeg and aomenc to overwrite any file + # the user running the program has access to. + # THIS IS NOT SAFE + # But it's something + aom_options=${aom_options//[^a-zA-Z0-9_\- =]/} + # Same story as above but also + ffmpeg_options="$3" + ffmpeg_options=${ffmpego//[^a-zA-Z0-9_\- =:]/} + # set to boolean + doVMAF=$4 + + set +e + ffmpeg -nostats -hide_banner -loglevel warning \ + -i "$file" "$ffmpeg_options" -f yuv4mpegpipe - | aomenc - "$aom_options" \ + --pass=1 --passes=2 --fpf="$file".fpf --ivf -o "$file".out.ivf + retval=$? + if [[ $retval -ne 0 ]]; then + echo "Error running aomenc pass 1 of 2" >&2 + curl -s -L "$base_url"/edit_status/"$job_id"/error || true + echo "" >&2 + return 1 + fi + + ffmpeg -nostats -hide_banner -loglevel warning \ + -i "$file" "$ffmpeg_options" -f yuv4mpegpipe - | aomenc - "$aom_options" \ + --pass=1 --passes=2 --fpf="$file".fpf --ivf -o "$file".out.ivf + retval=$? + if [ $retval -ne 0 ]; then + echo "Error running aomenc pass 2 of 2" >&2 + curl -s -L "$base_url"/edit_status/"$job_id"/error || true + echo "" >&2 + return 2 + fi + + + # This probably needs to be improved as well, so that it scales + # and sets the framerate automatically. This will likely never + # Actually get used though, so it's fine. + if [[ doVMAF -eq true ]]; then + ffmpeg -nostats -hide_banner -loglevel warning \ + -r 24 -i "$file".out.ivf -r 24 "$file" -filter_complex \ + "[0:v][1:v]libvmaf=log_fmt=json:log_path=$file.vmaf.json" -f null - >/dev/null + retval=$? + if [ $retval -ne 0 ]; then + echo "Error running VMAF scan" >&2 + curl -s -L "$base_url"/edit_status/"$job_id"/error || true + echo "" >&2 + return 3 + fi + cat "$file".vmaf.json + fi + set -e + + rm -f \ + "$file" \ + "$file".fpf \ + "$file".vmaf.json + + return 0 +} +