6aef03df8d
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
69 lines
3.1 KiB
Bash
Executable File
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) ==="
|