#!/usr/bin/env bash
# gpu-measure.sh —— 对 samples 目录里所有 av1-*.mp4 统一测：平均 SSIM + 码率 + 体积
# 平均 SSIM 取 ffmpeg ssim 滤镜汇总行（对全片段所有帧求平均），不是最后一帧
# 用法： bash gpu-measure.sh <源文件> <样本目录> <ffmpeg路径>
set -uo pipefail
SRC="${1:?源文件}"; DIR="${2:?样本目录}"; FF="${3:-ffmpeg}"
DUR=40
TSV="$DIR/measure.tsv"
SRC_KBPS=$(ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of csv=p=0 "$SRC")
SRC_BYTES=$(stat -c%s "$SRC")
SRC_DUR=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$SRC")

printf 'variant\tseg\tbytes\tkbps\tssim\n' > "$TSV"
echo "源：视频 $((SRC_KBPS/1000)) kbps，整片 $SRC_BYTES 字节 / ${SRC_DUR%.*}s"
echo
printf '%-18s %6s %10s %9s %9s\n' "档位" "片段" "体积" "码率kbps" "平均SSIM"
for f in "$DIR"/av1-*.mp4; do
  b=$(basename "$f" .mp4)
  name="${b#av1-}"; seg="${name##*-}"; name="${name%-*}"
  kbps=$(( $(stat -c%s "$f") * 8 / DUR / 1000 ))
  ssim=$(nice -n 19 "$FF" -hide_banner -nostdin -loglevel info \
      -ss "$seg" -t "$DUR" -i "$SRC" -i "$f" \
      -lavfi "[0:v][1:v]ssim" -f null - 2>&1 \
      | grep -oE 'All:[0-9.]+' | head -1 | cut -d: -f2)
  printf '%-18s %6s %10s %9s %9s\n' "$name" "$seg" "$(du -h "$f"|cut -f1)" "$kbps" "${ssim:-?}"
  printf '%s\t%s\t%s\t%s\t%s\n' "$name" "$seg" "$(stat -c%s "$f")" "$kbps" "${ssim:-?}" >> "$TSV"
done
echo
echo "═══ 各档平均（源码率 $((SRC_KBPS/1000)) kbps）═══"
awk -F'\t' -v sk="$((SRC_KBPS/1000))" -v sb="$SRC_BYTES" -v sd="$SRC_DUR" '
  NR>1 && $5!="?" { n[$1]++; s[$1]+=$5; k[$1]+=$4 }
  END{
    for (v in n) {
      avgk=k[v]/n[v]; avgs=s[v]/n[v];
      printf "  %-18s 平均SSIM %.5f  平均码率 %5d kbps（源码率 %d 的 %.0f%%）  整片预估 %.2f GiB（原 %.2f GiB，省 %.0f%%）\n", \
        v, avgs, avgk, sk, avgk*100/sk, sb*avgk/sk/1073741824, sb/1073741824, (1-avgk/sk)*100;
    }
  }' "$TSV" | sort
