]> Git — Sourcephile - julm/camera.git/blob - reencode.sh
reencode: fast-decode=3 only available on newer svt-av1
[julm/camera.git] / reencode.sh
1 #!/usr/bin/env bash
2 # Copyright: Julien Moutinho <julm+camera@sourcephile.fr>
3 # License: AGPL-3.0-or-later
4 #
5
6 cd "${0%/*}"
7 set -eu
8 shopt -s nullglob
9
10 ffmpeg_ () { local -; set -x; nice -19 ffmpeg </dev/null -hide_banner -loglevel warning -stats -y "$@"; }
11 mv_ () { local -; mv -i >&2 "$@"; }
12 set -x
13 for dir in "$@"; do
14 IFS=/ read -r user year x month x <<<"$dir"
15 test -n "$year" || exec "$0" "$user"/2*/src/*/
16 test -n "$month" || exec "$0" "$user"/"$year"/src/*/
17 pushd "$user/$year" >/dev/null
18 test -d src/"$month" || { popd; continue; }
19 (cd src; find -L "$month" -type f -size +200M -printf '%f %p\n') | sort -t/ -k1.5 | cut -f2 -d ' ' |
20 while read -r src; do
21 echo >&2 "$dir: processing $year/src/$src"
22 base=${src%.*}
23 name=${base#*/}
24 id=${name%%.*}
25 mkdir -p {tmp,wip,old}/reencode/"${base%/*}"
26 case "$src" in
27 *.mp4)
28 # Slow, but needed to make wide videos span two columns of the CSS grid
29 orient=$(ffprobe -v 0 -select_streams v:0 -show_entries stream_side_data=rotation -of default=nw=1:nk=1 src/"$src")
30 psize=720
31 crf=40
32 preset=7
33 ext="preset=$preset.crf=$crf.${psize}p.av1.webm"
34 if [ -z "$orient" ]; then scale="-2:${psize}"; else scale="${psize}:-2"; fi
35 need_opus () {
36 test tmp/reencode/"$base".opus -nt src/"$src" || {
37 ffmpeg_ -i src/"$src" \
38 -map 0:a -c:a libopus -b:a 64k -application voip \
39 wip/reencode/"$base".opus
40 mv_ {wip,tmp}/reencode/"$base".opus
41 }
42 }
43 test src/"$base.$ext" -nt src/"$src" || {
44 need_opus
45 # See https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/CommonQuestions.md
46 # See https://gist.github.com/BlueSwordM/86dfcb6ab38a93a524472a0cbe4c4100
47 # See https://www.streamingmediaglobal.com/Articles/ReadArticle.aspx?ArticleID=154488
48 # -preset Range from 0 to 13, with higher numbers providing a higher encoding speed;
49 # -crf Range is 0-63, with the default being 50.
50 # Lower values correspond to higher quality and greater file size
51 # yuv420p
52 # yuv420p10le can represent more shades of grey and colors
53 # and is less prone to certain artifacts, such as color
54 # banding and loss of detail in low luma areas,
55 # cost in terms of resulting file size (~5%),
56 # can also be more compute-intensive than 8-bit in some decoders
57 # tune=0 subjective mode often results in an image with greater
58 # sharpness and is intended to produce a result that appears to humans
59 # to be of high quality (as opposed to doing well on basic objective measures,
60 # such as PSNR)
61 # scd=1 biases the encoders' scene detection to insert more intra refreshes if needed,
62 # and reduce temporal dependencies around scene-changes.
63 # scm=0 screen content mode decision making. 0 is best for live-action.
64 # fast-decode=3 trade compression efficiency for less CPU time when decoding
65 # for preset 5-7: levels 1-3 (3 being faster) are supported.
66 # FIXME: set fast-decode to 3 available on newer svt-av1
67 ffmpeg_ -i src/"$src" -i tmp/reencode/"$base".opus \
68 -map 0:v \
69 -filter:v format=yuv420p,scale="$scale" \
70 -c:v libsvtav1 -preset "$preset" -crf "$crf" \
71 -svtav1-params tune=0:enable-overlays=1:scd=1:scm=0:fast-decode=1 \
72 -map 1:a -c:a copy \
73 wip/reencode/"$base.$ext"
74 mv_ {wip/reencode,src}/"$base.$ext"
75 mv_ {src,old/reencode}/"$src"
76 }
77 ;;
78 esac
79 done
80 rm -vrf {tmp,wip}/reencode
81 popd >/dev/null
82 done