#!/usr/bin/env bash
# gpu-full-encode.sh —— GPU 机上整片 AV1 编码（带进度文件、时长校验）
# 用法： bash gpu-full-encode.sh <源> <输出mp4> <ffmpeg> <preset> <crf> <threads>
set -uo pipefail
SRC="${1:?源}"; OUT="${2:?输出}"; FF="${3:-ffmpeg}"; PRESET="${4:-4}"; CRF="${5:-21}"; TH="${6:-14}"
PROG="${OUT%.mp4}.progress"
LOGF="${OUT%.mp4}.log"
mkdir -p "$(dirname "$OUT")"
SRC_DUR=$("${FF}probe" -v error -show_entries format=duration -of csv=p=0 "$SRC")
SRC_BYTES=$(stat -c%s "$SRC")
echo "开始整片编码：preset=$PRESET crf=$CRF 线程=$TH 源时长=${SRC_DUR%.*}s $(du -h "$SRC"|cut -f1)" | tee "$LOGF"
T0=$(date +%s)

nice -n 19 "$FF" -hide_banner -nostdin -loglevel warning -y -i "$SRC" \
  -map 0:v:0 -map "0:a:0?" -c:a copy -sn \
  -c:v libsvtav1 -preset "$PRESET" -crf "$CRF" \
  -svtav1-params "lp=$TH:enable-tf=0:tune=0" -threads "$TH" \
  -pix_fmt yuv420p10le -movflags +faststart \
  -progress "$PROG" -nostats "$OUT" >>"$LOGF" 2>&1
RC=$?
T1=$(date +%s); EL=$((T1-T0))

if [ $RC -ne 0 ] || [ ! -s "$OUT" ]; then
  echo "❌ 编码失败 rc=$RC（耗时 ${EL}s）；日志末尾：" | tee -a "$LOGF"
  tail -5 "$LOGF" | tee -a "$LOGF"
  exit 1
fi

OUT_DUR=$("${FF}probe" -v error -show_entries format=duration -of csv=p=0 "$OUT")
OUT_BYTES=$(stat -c%s "$OUT")
ok=$(awk -v a="$SRC_DUR" -v b="$OUT_DUR" 'BEGIN{d=a-b; if(d<0)d=-d; print (d<1.0)?"一致":"不一致"}')
echo "✅ 完成：耗时 ${EL}s（$(awk -v e=$EL -v d="$SRC_DUR" 'BEGIN{printf "%.2fx 实时", d/e}')）" | tee -a "$LOGF"
echo "   体积 $(du -h "$OUT"|cut -f1)（原 $(du -h "$SRC"|cut -f1)），码率 $((OUT_BYTES*8/${SRC_DUR%.*}/1000)) kbps（原 $((SRC_BYTES*8/${SRC_DUR%.*}/1000)) kbps）" | tee -a "$LOGF"
echo "   时长校验：源 ${SRC_DUR%.*}s → 输出 ${OUT_DUR%.*}s  $ok" | tee -a "$LOGF"
