#!/usr/bin/env bash
# encode.sh - turn frames/%04d.png into GIF/MP4 variants and print sizes. ffmpeg 9.0.1
set -euo pipefail
IN=frames/%04d.png
mkdir -p gif
run() { # name, then ffmpeg args
  local name=$1; shift
  local t0=$(date +%s.%N)
  ffmpeg -v error -y -framerate 15 -i "$IN" "$@" "gif/$name"
  local t1=$(date +%s.%N)
  printf '%-34s %10d bytes  %5.2fs\n' "$name" "$(wc -c < "gif/$name")" "$(echo "$t1 - $t0" | bc)"
}
run 01-naive-640.gif -vf "scale=640:-1"
run 02-palette-1280-15fps.gif -vf "split[a][b];[a]palettegen[p];[b][p]paletteuse"
run 03-palette-640-15fps.gif -vf "scale=640:-1:flags=lanczos,split[a][b];[a]palettegen[p];[b][p]paletteuse"
run 04-diff-bayer-640-15fps.gif -vf "scale=640:-1:flags=lanczos,split[a][b];[a]palettegen=stats_mode=diff[p];[b][p]paletteuse=dither=bayer:bayer_scale=3:diff_mode=rectangle"
run 05-diff-bayer-640-10fps.gif -vf "fps=10,scale=640:-1:flags=lanczos,split[a][b];[a]palettegen=stats_mode=diff[p];[b][p]paletteuse=dither=bayer:bayer_scale=3:diff_mode=rectangle"
run 06-diff-bayer-480-10fps-128c.gif -vf "fps=10,scale=480:-1:flags=lanczos,split[a][b];[a]palettegen=max_colors=128:stats_mode=diff[p];[b][p]paletteuse=dither=bayer:bayer_scale=3:diff_mode=rectangle"
run 07-nodither-640-10fps.gif -vf "fps=10,scale=640:-1:flags=lanczos,split[a][b];[a]palettegen=stats_mode=diff[p];[b][p]paletteuse=dither=none:diff_mode=rectangle"
run 08-h264-640.mp4 -vf "scale=640:-2:flags=lanczos,format=yuv420p" -c:v libx264 -crf 26 -preset slow -movflags +faststart
run 09-h264-1280.mp4 -vf "format=yuv420p" -c:v libx264 -crf 26 -preset slow -movflags +faststart
