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