Files

69 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
# C3 + C4: per-codec frame-0 byte-compare + frame-30s SSIM Y, both against SW reference.
set -u
OUT=$HOME/measurements/p3
mkdir -p $OUT
codecs=("h264:h264.mp4" "vp8:vp8.webm" "mpeg2:mpeg2.ts")
W=1280; H=720
for spec in "${codecs[@]}"; do
codec=${spec%%:*}; ext=${spec#*:}
cf=$HOME/measurements/encoded/bbb_60s_720p.${ext}
log=$OUT/bitexact_${codec}
> $log
echo "=== $codec ===" | tee $log
# Frame 0 SW
ffmpeg -hide_banner -loglevel error -y -i "$cf" \
-frames:v 1 -f rawvideo -pix_fmt yuv420p $OUT/sw_${codec}_f0.yuv </dev/null
# Frame 0 HW
LIBVA_DRIVER_NAME=v4l2_request ffmpeg -hide_banner -loglevel error -y \
-hwaccel vaapi -hwaccel_output_format vaapi \
-i "$cf" -vf "hwdownload,format=nv12,format=yuv420p" \
-frames:v 1 -f rawvideo -pix_fmt yuv420p $OUT/hw_${codec}_f0.yuv </dev/null 2>/dev/null
sz_sw=$(stat -c%s $OUT/sw_${codec}_f0.yuv 2>/dev/null || echo 0)
sz_hw=$(stat -c%s $OUT/hw_${codec}_f0.yuv 2>/dev/null || echo 0)
sha_sw=$(sha256sum $OUT/sw_${codec}_f0.yuv 2>/dev/null | cut -c1-16)
sha_hw=$(sha256sum $OUT/hw_${codec}_f0.yuv 2>/dev/null | cut -c1-16)
diff_bytes=$(cmp -l $OUT/sw_${codec}_f0.yuv $OUT/hw_${codec}_f0.yuv 2>/dev/null | wc -l)
expected=$((W * H * 3 / 2))
c3_status=$([ "$sw_sw" = "$sha_hw" ] || [ "$diff_bytes" = "0" ] && echo "byte-identical" || echo "diff=$diff_bytes")
echo " C3 frame-0:" | tee -a $log
echo " sw size=$sz_sw sha=$sha_sw" | tee -a $log
echo " hw size=$sz_hw sha=$sha_hw" | tee -a $log
echo " diff_bytes=$diff_bytes expected_size=$expected" | tee -a $log
if [ "$diff_bytes" = "0" ] && [ "$sz_sw" = "$expected" ]; then
echo " -> C3 PASS (byte-identical)" | tee -a $log
else
# Compute SSIM on frame 0 as fallback
ssim_f0=$(ffmpeg -hide_banner -loglevel info -nostats \
-s ${W}x${H} -pix_fmt yuv420p -i $OUT/hw_${codec}_f0.yuv \
-s ${W}x${H} -pix_fmt yuv420p -i $OUT/sw_${codec}_f0.yuv \
-lavfi "[0:v][1:v]ssim" -f null - 2>&1 | grep -oE "Y:[0-9.]+" | head -1)
echo " -> C3 byte diff present, frame-0 SSIM ${ssim_f0}" | tee -a $log
fi
# Frame 30s SW
ffmpeg -hide_banner -loglevel error -y -i "$cf" \
-vf "select=eq(n\,720)" -vsync 0 -frames:v 1 -f rawvideo -pix_fmt yuv420p $OUT/sw_${codec}_f720.yuv </dev/null
# Frame 30s HW
LIBVA_DRIVER_NAME=v4l2_request ffmpeg -hide_banner -loglevel error -y \
-hwaccel vaapi -hwaccel_output_format vaapi \
-i "$cf" -vf "hwdownload,format=nv12,format=yuv420p,select=eq(n\,720)" \
-vsync 0 -frames:v 1 -f rawvideo -pix_fmt yuv420p $OUT/hw_${codec}_f720.yuv </dev/null 2>/dev/null
diff720=$(cmp -l $OUT/sw_${codec}_f720.yuv $OUT/hw_${codec}_f720.yuv 2>/dev/null | wc -l)
ssim=$(ffmpeg -hide_banner -loglevel info -nostats \
-s ${W}x${H} -pix_fmt yuv420p -i $OUT/hw_${codec}_f720.yuv \
-s ${W}x${H} -pix_fmt yuv420p -i $OUT/sw_${codec}_f720.yuv \
-lavfi "[0:v][1:v]ssim" -f null - 2>&1 | grep -oE "[YUV All]:[0-9.()+ ]+" | tr "\n" " ")
echo " C4 frame-720 (t=30s):" | tee -a $log
echo " diff_bytes=$diff720 ssim: $ssim" | tee -a $log
done
echo "=== done $(date -Iseconds) ==="