#!/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 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 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) ==="