iter1 phase3: archive helper scripts used during baseline measurement

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 07:24:25 +00:00
parent b5fdb5e854
commit 6aef03df8d
5 changed files with 224 additions and 0 deletions
+25
View File
@@ -0,0 +1,25 @@
#!/bin/bash
SRC=$HOME/measurements/source/bbb_720p.mov
OUT=$HOME/measurements/encoded
LOG=$HOME/measurements/logs
mkdir -p "$OUT" "$LOG"
: > $LOG/encode.log
encode() {
local label=$1; shift
local t0=$(date +%s)
echo "=== $label START $(date -Iseconds) ===" | tee -a $LOG/encode.log
ffmpeg -hide_banner -ss 0 -t 60 -i "$SRC" -pix_fmt yuv420p -an -y "$@" > $LOG/encode_$label.log 2>&1
local rc=$?
local t1=$(date +%s)
echo "=== $label END $(date -Iseconds) elapsed=$((t1-t0))s rc=$rc ===" | tee -a $LOG/encode.log
}
encode h264 -c:v libx264 -preset medium -crf 23 $OUT/bbb_60s_720p.h264.mp4
encode hevc -c:v libx265 -preset fast -crf 28 $OUT/bbb_60s_720p.hevc.mp4
encode mpeg2 -c:v mpeg2video -qscale:v 4 -f mpegts $OUT/bbb_60s_720p.mpeg2.ts
encode vp8 -c:v libvpx -crf 30 -b:v 1500k -threads 8 -cpu-used 4 $OUT/bbb_60s_720p.vp8.webm
encode vp9 -c:v libvpx-vp9 -crf 30 -b:v 0 -threads 8 -cpu-used 4 -row-mt 1 -tile-columns 2 $OUT/bbb_60s_720p.vp9.webm
echo "=== ALL ENCODES DONE $(date -Iseconds) ===" | tee -a $LOG/encode.log
ls -la $OUT/ | tee -a $LOG/encode.log
+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
# C5: per-codec FPS at N=3 runs. Wall-time measurement, no output file written.
set -u
OUT=$HOME/measurements/p3
mkdir -p $OUT
codecs=("h264:h264.mp4" "vp8:vp8.webm" "mpeg2:mpeg2.ts")
for spec in "${codecs[@]}"; do
codec=${spec%%:*}; ext=${spec#*:}
cf=$HOME/measurements/encoded/bbb_60s_720p.${ext}
log=$OUT/bench_${codec}.log
> $log
echo "=== $codec ===" | tee $log
for run in 1 2 3; do
t0=$(date +%s.%N)
out=$(LIBVA_DRIVER_NAME=v4l2_request timeout 30 ffmpeg -hide_banner -benchmark -loglevel error \
-hwaccel vaapi -hwaccel_output_format vaapi \
-i "$cf" -vf "hwdownload,format=nv12" -f null - 2>&1 </dev/null)
t1=$(date +%s.%N)
el=$(awk "BEGIN { printf \"%.3f\", $t1-$t0 }")
fps_calc=$(awk "BEGIN { printf \"%.2f\", 1440.0 / ($t1-$t0) }")
fps_self=$(echo "$out" | grep -oE "fps=[ ]*[0-9.]+" | tail -1 | awk -F= "{print \$2}" | tr -d " ")
frames=$(echo "$out" | grep -oE "frame=[ ]*[0-9]+" | tail -1 | awk -F= "{print \$2}" | tr -d " ")
bench=$(echo "$out" | grep "^bench:" | tail -1)
echo " run $run: elapsed=${el}s fps_calc=$fps_calc fps_self=$fps_self frames=$frames" | tee -a $log
[ -n "$bench" ] && echo " $bench" | tee -a $log
done
# Compute mean and stddev
awk '/^ run/ { gsub("elapsed=","",$3); gsub("s","",$3); el[NR]=$3; sum+=$3; n++ }
END {
if (n>0) {
mean=sum/n
for (i in el) ss += (el[i]-mean)^2
sd=sqrt(ss/n)
printf " N=%d mean=%.3fs sigma=%.3fs fps=%.2f±%.2f\n", n, mean, sd, 1440/mean, 1440*sd/(mean*mean)
}
}' $log | tee -a $log
done
echo "=== done $(date -Iseconds) ==="
+68
View File
@@ -0,0 +1,68 @@
#!/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) ==="
+63
View File
@@ -0,0 +1,63 @@
#!/bin/bash
# C1 + C2 + C6 instrumentation: per-codec decode with strace (ioctl) + lsof (fds) + dmesg before/after.
# Decodes 30 frames into a tmp file to verify HW engagement; doesn't measure FPS.
set -u
OUT=$HOME/measurements/p3
mkdir -p $OUT
codecs=("h264:rkvdec:h264.mp4" "vp8:hantro:vp8.webm" "mpeg2:hantro:mpeg2.ts")
# C6 pre: dmesg snapshot
sudo dmesg --time-format=ctime > $OUT/dmesg.pre.txt
for spec in "${codecs[@]}"; do
codec=${spec%%:*}; route=$(echo $spec | cut -d: -f2); ext=${spec##*:}
cf=$HOME/measurements/encoded/bbb_60s_720p.${ext}
log=$OUT/engage_${codec}
rm -f $log.{strace,lsof,stderr,nv12} 2>/dev/null
echo "=== $codec ($route) ===" | tee $log.summary
# Launch in background, track PID; lsof+strace alongside
LIBVA_DRIVER_NAME=v4l2_request strace -ff -o $log.strace -e trace=ioctl,openat \
ffmpeg -hide_banner -loglevel error \
-hwaccel vaapi -hwaccel_output_format vaapi \
-i "$cf" -vf "hwdownload,format=nv12" -frames:v 30 \
-f rawvideo -pix_fmt nv12 -y $log.nv12 \
> $log.stderr 2>&1 &
pid=$!
# Wait briefly then lsof
sleep 0.6
if kill -0 $pid 2>/dev/null; then
lsof -p $pid 2>/dev/null | grep -E "/dev/(video|media|dri)" > $log.lsof
fi
wait $pid; rc=$?
# Aggregate
size=$(stat -c%s $log.nv12 2>/dev/null || echo 0)
expected=$((30 * 1280 * 720 * 3 / 2)) # 30 frames yuv420p 720p
size_ok=$([ "$size" = "$expected" ] && echo "ok" || echo "MISMATCH (expected=$expected)")
vidioc=$(grep -h "VIDIOC_S_EXT_CTRLS\|VIDIOC_QUERYCAP\|VIDIOC_QBUF\|VIDIOC_DQBUF" $log.strace.* 2>/dev/null | wc -l)
media_q=$(grep -h "MEDIA_REQUEST_IOC_QUEUE\|MEDIA_REQUEST_IOC_REINIT" $log.strace.* 2>/dev/null | wc -l)
fd_count=$(wc -l < $log.lsof 2>/dev/null || echo 0)
{
echo " rc=$rc size=$size size_ok=$size_ok"
echo " ioctl V4L2 (S_EXT_CTRLS+Q/DQBUF+QUERYCAP)=$vidioc"
echo " ioctl MEDIA_REQUEST_*=$media_q"
echo " open V4L2/media/DRI fds=$fd_count"
if [ -s $log.lsof ]; then
echo " fds:"
awk '{print " " $9}' $log.lsof | sort -u
fi
} | tee -a $log.summary
done
# C6 post
sudo dmesg --time-format=ctime > $OUT/dmesg.post.txt
echo
echo "=== dmesg diff (new lines since pre) ==="
diff $OUT/dmesg.pre.txt $OUT/dmesg.post.txt | head -20
echo "=== done $(date -Iseconds) ==="
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
# Safe baseline probe — only the 3 codecs that should work on this kernel.
# HEVC SKIPPED (oopses kernel rkvdec_hevc_prepare_hw_st_rps).
# VP9 SKIPPED (mainline-rc3 RK3588 rkvdec doesn't expose V4L2_PIX_FMT_VP9_FRAME).
# AV1 SKIPPED (libva backend iter38b only probes 2 fds, not the av1-vpu-dec at /dev/media3).
echo "=== ampere baseline: libva HW decode probe (H.264 + VP8 + MPEG-2) ==="
for codec in h264 vp8 mpeg2; do
case $codec in
h264) cf=$HOME/measurements/encoded/bbb_60s_720p.h264.mp4 ; route="rkvdec /dev/video1" ;;
mpeg2) cf=$HOME/measurements/encoded/bbb_60s_720p.mpeg2.ts ; route="hantro /dev/video2" ;;
vp8) cf=$HOME/measurements/encoded/bbb_60s_720p.vp8.webm ; route="hantro /dev/video2" ;;
esac
t0=$(date +%s.%N)
out=$(LIBVA_DRIVER_NAME=v4l2_request timeout 12 ffmpeg -hide_banner -loglevel error \
-hwaccel vaapi -hwaccel_output_format vaapi \
-i "$cf" -vf "hwdownload,format=nv12" -f null - 2>&1 </dev/null)
rc=$?
t1=$(date +%s.%N)
el=$(awk "BEGIN { printf \"%.2f\", $t1-$t0 }")
status=$([ $rc -eq 0 ] && echo "OK" || echo "FAIL rc=$rc")
fps=$(echo "$out" | grep -oE "fps=[ ]*[0-9.]+" | tail -1)
frames=$(echo "$out" | grep -oE "frame=[ ]*[0-9]+" | tail -1)
err=$(echo "$out" | grep -iE "error|invalid|failed|not supported|unable" | head -1)
printf " %-6s %-25s %s elapsed=%ss %s %s %s\n" "$codec" "$route" "$status" "$el" "${frames}" "${fps}" "$err"
done
echo "=== done $(date -Iseconds) ==="