blob: fdaa4b4e84c791700223495167b649ddcc3cbaee [file] [log] [blame]
#!/bin/sh
#
# Generate one or more settings files for codec comparision tests.
#
# Usage:
#
# generate-settings [--list]
#
# With --list, will list the config directories that would be generated.
# Without --list, will create the config directories and put an encoder
# and a measurer within each.
set -e
list=0
finished=0
while [ $finished == 0 ]; do
case $1 in
--list)
list=1
shift
;;
--*)
echo "Unknown option $1"
exit 1
;;
*)
finished=1
;;
esac
done
TEMPFILE=$(mktemp ./tempXXXXencoder)
extension() {
if [ $CODEC == "vp8" ]; then
echo "webm"
elif [ $CODEC == "h264" ]; then
echo "mkv"
else
echo "Unknown codec $CODEC"
exit 1
fi
}
vp8encoder() {
# Generate the encoder file. Note that the fingerprint on this is the ID of the
# encoder instance, so don't make changes here lightly!
cat << EoF > $TEMPFILE
#!/bin/sh
# Generated encoder for encoding VP8 at $rate kbps.
# Command line format: ./encoder <filename> <framerate> <width> <height>
# The script must be executed within the directory it's placed in.
filename=\$1
frame_rate=\$2
width=\$3
height=\$4
rate=$rate
basename=\$(basename \$filename .yuv)
../../bin/vpxenc --lag-in-frames=0 --target-bitrate=\${rate} --kf-min-dist=3000 \
--kf-max-dist=3000 --cpu-used=0 --fps=\${frame_rate}/1 --static-thresh=0 \
--token-parts=1 --drop-frame=0 --end-usage=cbr --min-q=2 --max-q=56 \
--undershoot-pct=100 --overshoot-pct=15 --buf-sz=1000 \
--buf-initial-sz=800 --buf-optimal-sz=1000 --max-intra-rate=1200 \
--resize-allowed=0 --drop-frame=0 --passes=1 --good --noise-sensitivity=0 \
-w \${width} -h \${height} \${filename} --codec=vp8 \
-o ./\$basename.webm \
EoF
}
h264encoder() {
# Generate the encoder file. Note that the fingerprint on this is the ID of the
# encoder instance, so don't make changes here lightly!
cat << EoF > $TEMPFILE
#!/bin/sh
# Generated encoder for encoding H.264 at $rate kbps.
# Command line format: ./encoder <filename> <framerate> <width> <height>
# The script must be executed within the directory it's placed in.
filename=\$1
frame_rate=\$2
width=\$3
height=\$4
rate=$rate
basename=\$(basename \$filename .yuv)
../../bin/x264 --vbv-maxrate \${rate} --vbv-bufsize \${rate} \
--vbv-init 0.8 --bitrate \${rate} --fps \${frame_rate} \
--profile baseline --no-scenecut --keyint infinite --preset veryslow \
--input-res \${width}x\${height} \
--tune psnr \
-o ./\$basename.mkv \$filename
EoF
}
encoder() {
if [ $CODEC == "vp8" ]; then
vp8encoder
else
h264encoder
fi
}
measurer() {
cat << EoF > $1/measurer
#!/bin/sh
# Generated measurer for an encode of $CODEC at target rate $rate kbps.
# Command line format: measurer filename framerate width heigth
#
set -e
filename=\$1
frame_rate=\$2
width=\$3
height=\$4
extension=$(extension)
basename=\$(basename \$filename .yuv)
rm -f tempyuvfile.yuv
encoded_rate=( \$(../../bin/ffmpeg -i ./\$basename.\$extension \
tempyuvfile.yuv 2>&1 | awk '/bitrate:/ { print \$6 }') )
psnr=\$(../../bin/psnr \$filename tempyuvfile.yuv \$width \$height 9999)
cat << EoF2 > \$basename.results
target_rate=$rate
encoded_rate=\$encoded_rate
psnr=\$psnr
EoF2
EoF
}
# Generate a template file for each of the rates in the ISO CFP.
# Not all rates make sense for all files.
for rate in 256 384 512 850 1200 1500 1600 2000 2500 3000 \
3500 4500 5000 6000 7000 8000 10000 14000; do
echo "Rate $rate"
for CODEC in "vp8" "h264"; do
if [ ! -d $CODEC ]; then
mkdir $CODEC
fi
encoder
DIR=$(md5sum $TEMPFILE | cut -b1-12)
if [ $list == 1 ]; then
# List the dirs that would be generated
echo $CODEC/$DIR
else
# Move the encoder file into the workdir for this encoding.
if [ ! -d $CODEC/$DIR ]; then
mkdir $CODEC/$DIR
fi
mv $TEMPFILE $CODEC/$DIR/encoder
measurer $CODEC/$DIR
chmod +x $CODEC/$DIR/encoder
chmod +x $CODEC/$DIR/measurer
fi
done
done