diff --git a/phase3_scripts/encode_all.sh b/phase3_scripts/encode_all.sh new file mode 100755 index 0000000..b7261fb --- /dev/null +++ b/phase3_scripts/encode_all.sh @@ -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 diff --git a/phase3_scripts/p3_bench.sh b/phase3_scripts/p3_bench.sh new file mode 100755 index 0000000..1847c44 --- /dev/null +++ b/phase3_scripts/p3_bench.sh @@ -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 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) ===" diff --git a/phase3_scripts/p3_bitexact.sh b/phase3_scripts/p3_bitexact.sh new file mode 100755 index 0000000..948acbd --- /dev/null +++ b/phase3_scripts/p3_bitexact.sh @@ -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 + + 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) ===" diff --git a/phase3_scripts/p3_engage.sh b/phase3_scripts/p3_engage.sh new file mode 100755 index 0000000..7f90547 --- /dev/null +++ b/phase3_scripts/p3_engage.sh @@ -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) ===" diff --git a/phase3_scripts/safe_probe.sh b/phase3_scripts/safe_probe.sh new file mode 100755 index 0000000..ea17fd2 --- /dev/null +++ b/phase3_scripts/safe_probe.sh @@ -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