Files

64 lines
2.3 KiB
Bash
Executable File

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