1*c0909341SAndroid Build Coastguard Worker#!/usr/bin/env bash 2*c0909341SAndroid Build Coastguard Worker 3*c0909341SAndroid Build Coastguard WorkerDAV1D="tools/dav1d" 4*c0909341SAndroid Build Coastguard WorkerARGON_DIR='.' 5*c0909341SAndroid Build Coastguard WorkerFILMGRAIN=1 6*c0909341SAndroid Build Coastguard WorkerCPUMASK=-1 7*c0909341SAndroid Build Coastguard WorkerTHREADS=1 8*c0909341SAndroid Build Coastguard WorkerJOBS=0 9*c0909341SAndroid Build Coastguard WorkerWRAP="" 10*c0909341SAndroid Build Coastguard WorkerFAIL_FAST=0 11*c0909341SAndroid Build Coastguard Worker 12*c0909341SAndroid Build Coastguard Worker 13*c0909341SAndroid Build Coastguard Workerusage() { 14*c0909341SAndroid Build Coastguard Worker NAME=$(basename "$0") 15*c0909341SAndroid Build Coastguard Worker { 16*c0909341SAndroid Build Coastguard Worker printf "Usage: %s [-d dav1d] [-a argondir] [-g \$filmgrain] [-c \$cpumask] [-t threads] [-j jobs] [DIRECTORY]...\n" "$NAME" 17*c0909341SAndroid Build Coastguard Worker printf "Example: %s -d /path/to/dav1d -a /path/to/argon/ -g 0 -c avx2 profile0_core\n" "$NAME" 18*c0909341SAndroid Build Coastguard Worker printf "Used to verify that dav1d can decode the Argon AV1 test vectors correctly.\n\n" 19*c0909341SAndroid Build Coastguard Worker printf " DIRECTORY one or more dirs in the argon folder to check against\n" 20*c0909341SAndroid Build Coastguard Worker printf " (default: everything except large scale tiles and stress files)\n" 21*c0909341SAndroid Build Coastguard Worker printf " -f fail fast\n" 22*c0909341SAndroid Build Coastguard Worker printf " -d dav1d path to dav1d executable (default: tools/dav1d)\n" 23*c0909341SAndroid Build Coastguard Worker printf " -a dir path to argon dir (default: 'tests/argon' if found; '.' otherwise)\n" 24*c0909341SAndroid Build Coastguard Worker printf " -g \$num enable filmgrain (default: 1)\n" 25*c0909341SAndroid Build Coastguard Worker printf " -c \$mask use restricted cpumask (default: -1)\n" 26*c0909341SAndroid Build Coastguard Worker printf " -t \$num number of threads per dav1d (default: 1)\n" 27*c0909341SAndroid Build Coastguard Worker printf " -j \$num number of parallel dav1d processes (default: 0)\n" 28*c0909341SAndroid Build Coastguard Worker printf " -w tool execute dav1d with a wrapper tool\n\n" 29*c0909341SAndroid Build Coastguard Worker } >&2 30*c0909341SAndroid Build Coastguard Worker exit 1 31*c0909341SAndroid Build Coastguard Worker} 32*c0909341SAndroid Build Coastguard Worker 33*c0909341SAndroid Build Coastguard Workererror() { 34*c0909341SAndroid Build Coastguard Worker printf "\033[1;91m%s\033[0m\n" "$*" >&2 35*c0909341SAndroid Build Coastguard Worker exit 1 36*c0909341SAndroid Build Coastguard Worker} 37*c0909341SAndroid Build Coastguard Worker 38*c0909341SAndroid Build Coastguard Workerfail() { 39*c0909341SAndroid Build Coastguard Worker printf "\033[1K\rMismatch in %s\n" "$1" 40*c0909341SAndroid Build Coastguard Worker [[ $FAIL_FAST = 1 ]] && exit 1 41*c0909341SAndroid Build Coastguard Worker (( failed++ )) 42*c0909341SAndroid Build Coastguard Worker} 43*c0909341SAndroid Build Coastguard Worker 44*c0909341SAndroid Build Coastguard Workercheck_pids() { 45*c0909341SAndroid Build Coastguard Worker new_pids=() 46*c0909341SAndroid Build Coastguard Worker done_pids=() 47*c0909341SAndroid Build Coastguard Worker for p in "${pids[@]}"; do 48*c0909341SAndroid Build Coastguard Worker if kill -0 "$p" 2>/dev/null; then 49*c0909341SAndroid Build Coastguard Worker new_pids+=("$p") 50*c0909341SAndroid Build Coastguard Worker else 51*c0909341SAndroid Build Coastguard Worker done_pids+=("$p") 52*c0909341SAndroid Build Coastguard Worker fi 53*c0909341SAndroid Build Coastguard Worker done 54*c0909341SAndroid Build Coastguard Worker pids=("${new_pids[@]}") 55*c0909341SAndroid Build Coastguard Worker} 56*c0909341SAndroid Build Coastguard Worker 57*c0909341SAndroid Build Coastguard Workerwait_pids() { 58*c0909341SAndroid Build Coastguard Worker pid_list=("$@") 59*c0909341SAndroid Build Coastguard Worker for p in "${pid_list[@]}"; do 60*c0909341SAndroid Build Coastguard Worker if ! wait "$p"; then 61*c0909341SAndroid Build Coastguard Worker local file_varname="file$p" 62*c0909341SAndroid Build Coastguard Worker fail "${!file_varname}" 63*c0909341SAndroid Build Coastguard Worker fi 64*c0909341SAndroid Build Coastguard Worker done 65*c0909341SAndroid Build Coastguard Worker} 66*c0909341SAndroid Build Coastguard Worker 67*c0909341SAndroid Build Coastguard Workerblock_pids() { 68*c0909341SAndroid Build Coastguard Worker while [ ${#pids[@]} -ge "$JOBS" ]; do 69*c0909341SAndroid Build Coastguard Worker check_pids 70*c0909341SAndroid Build Coastguard Worker if [ ${#done_pids} -eq 0 ]; then 71*c0909341SAndroid Build Coastguard Worker sleep 0.2 72*c0909341SAndroid Build Coastguard Worker else 73*c0909341SAndroid Build Coastguard Worker wait_pids "${done_pids[@]}" 74*c0909341SAndroid Build Coastguard Worker fi 75*c0909341SAndroid Build Coastguard Worker done 76*c0909341SAndroid Build Coastguard Worker} 77*c0909341SAndroid Build Coastguard Worker 78*c0909341SAndroid Build Coastguard Workerwait_all_pids() { 79*c0909341SAndroid Build Coastguard Worker wait_pids "${pids[@]}" 80*c0909341SAndroid Build Coastguard Worker} 81*c0909341SAndroid Build Coastguard Worker 82*c0909341SAndroid Build Coastguard Worker# find tests/argon 83*c0909341SAndroid Build Coastguard Workertests_dir=$(dirname "$(readlink -f "$0")") 84*c0909341SAndroid Build Coastguard Workerif [ -d "$tests_dir/argon" ]; then 85*c0909341SAndroid Build Coastguard Worker ARGON_DIR="$tests_dir/argon" 86*c0909341SAndroid Build Coastguard Workerfi 87*c0909341SAndroid Build Coastguard Worker 88*c0909341SAndroid Build Coastguard Workerwhile getopts ":d:a:g:c:t:j:w:f" opt; do 89*c0909341SAndroid Build Coastguard Worker case "$opt" in 90*c0909341SAndroid Build Coastguard Worker f) 91*c0909341SAndroid Build Coastguard Worker FAIL_FAST=1 92*c0909341SAndroid Build Coastguard Worker ;; 93*c0909341SAndroid Build Coastguard Worker d) 94*c0909341SAndroid Build Coastguard Worker DAV1D="$OPTARG" 95*c0909341SAndroid Build Coastguard Worker ;; 96*c0909341SAndroid Build Coastguard Worker a) 97*c0909341SAndroid Build Coastguard Worker ARGON_DIR="$OPTARG" 98*c0909341SAndroid Build Coastguard Worker ;; 99*c0909341SAndroid Build Coastguard Worker g) 100*c0909341SAndroid Build Coastguard Worker FILMGRAIN="$OPTARG" 101*c0909341SAndroid Build Coastguard Worker ;; 102*c0909341SAndroid Build Coastguard Worker c) 103*c0909341SAndroid Build Coastguard Worker CPUMASK="$OPTARG" 104*c0909341SAndroid Build Coastguard Worker ;; 105*c0909341SAndroid Build Coastguard Worker t) 106*c0909341SAndroid Build Coastguard Worker THREADS="$OPTARG" 107*c0909341SAndroid Build Coastguard Worker ;; 108*c0909341SAndroid Build Coastguard Worker j) 109*c0909341SAndroid Build Coastguard Worker JOBS="$OPTARG" 110*c0909341SAndroid Build Coastguard Worker ;; 111*c0909341SAndroid Build Coastguard Worker w) 112*c0909341SAndroid Build Coastguard Worker WRAP="$OPTARG" 113*c0909341SAndroid Build Coastguard Worker ;; 114*c0909341SAndroid Build Coastguard Worker \?) 115*c0909341SAndroid Build Coastguard Worker printf "Error! Invalid option: -%s\n" "$OPTARG" >&2 116*c0909341SAndroid Build Coastguard Worker usage 117*c0909341SAndroid Build Coastguard Worker ;; 118*c0909341SAndroid Build Coastguard Worker *) 119*c0909341SAndroid Build Coastguard Worker usage 120*c0909341SAndroid Build Coastguard Worker ;; 121*c0909341SAndroid Build Coastguard Worker esac 122*c0909341SAndroid Build Coastguard Workerdone 123*c0909341SAndroid Build Coastguard Workershift $((OPTIND-1)) 124*c0909341SAndroid Build Coastguard Worker 125*c0909341SAndroid Build Coastguard Workerif [ "$JOBS" -eq 0 ]; then 126*c0909341SAndroid Build Coastguard Worker if [ "$THREADS" -gt 0 ]; then 127*c0909341SAndroid Build Coastguard Worker JOBS="$((($( (nproc || sysctl -n hw.logicalcpu || getconf _NPROCESSORS_ONLN || echo 1) 2>/dev/null)+THREADS-1)/THREADS))" 128*c0909341SAndroid Build Coastguard Worker else 129*c0909341SAndroid Build Coastguard Worker JOBS=1 130*c0909341SAndroid Build Coastguard Worker fi 131*c0909341SAndroid Build Coastguard Workerfi 132*c0909341SAndroid Build Coastguard Worker 133*c0909341SAndroid Build Coastguard Workerif [ "$#" -eq 0 ]; then 134*c0909341SAndroid Build Coastguard Worker # Everything except large scale tiles and stress files. 135*c0909341SAndroid Build Coastguard Worker dirs=("$ARGON_DIR/profile0_core" "$ARGON_DIR/profile0_core_special" 136*c0909341SAndroid Build Coastguard Worker "$ARGON_DIR/profile0_not_annexb" "$ARGON_DIR/profile0_not_annexb_special" 137*c0909341SAndroid Build Coastguard Worker "$ARGON_DIR/profile1_core" "$ARGON_DIR/profile1_core_special" 138*c0909341SAndroid Build Coastguard Worker "$ARGON_DIR/profile1_not_annexb" "$ARGON_DIR/profile1_not_annexb_special" 139*c0909341SAndroid Build Coastguard Worker "$ARGON_DIR/profile2_core" "$ARGON_DIR/profile2_core_special" 140*c0909341SAndroid Build Coastguard Worker "$ARGON_DIR/profile2_not_annexb" "$ARGON_DIR/profile2_not_annexb_special" 141*c0909341SAndroid Build Coastguard Worker "$ARGON_DIR/profile_switching") 142*c0909341SAndroid Build Coastguard Workerelse 143*c0909341SAndroid Build Coastguard Worker mapfile -t dirs < <(printf "${ARGON_DIR}/%s\n" "$@" | sort -u) 144*c0909341SAndroid Build Coastguard Workerfi 145*c0909341SAndroid Build Coastguard Worker 146*c0909341SAndroid Build Coastguard Workerver_info="dav1d $("$DAV1D" --filmgrain "$FILMGRAIN" --cpumask "$CPUMASK" --threads "$THREADS" -v 2>&1) filmgrain=$FILMGRAIN cpumask=$CPUMASK" || error "Error! Can't run $DAV1D" 147*c0909341SAndroid Build Coastguard Workerfiles=() 148*c0909341SAndroid Build Coastguard Worker 149*c0909341SAndroid Build Coastguard Workerfor d in "${dirs[@]}"; do 150*c0909341SAndroid Build Coastguard Worker if [ -d "$d/streams" ]; then 151*c0909341SAndroid Build Coastguard Worker files+=("${d/%\//}"/streams/*.obu) 152*c0909341SAndroid Build Coastguard Worker fi 153*c0909341SAndroid Build Coastguard Workerdone 154*c0909341SAndroid Build Coastguard Worker 155*c0909341SAndroid Build Coastguard Workernum_files="${#files[@]}" 156*c0909341SAndroid Build Coastguard Workerif [ "$num_files" -eq 0 ]; then 157*c0909341SAndroid Build Coastguard Worker error "Error! No files found at ${dirs[*]}" 158*c0909341SAndroid Build Coastguard Workerfi 159*c0909341SAndroid Build Coastguard Worker 160*c0909341SAndroid Build Coastguard Workerfailed=0 161*c0909341SAndroid Build Coastguard Workerpids=() 162*c0909341SAndroid Build Coastguard Workerfor i in "${!files[@]}"; do 163*c0909341SAndroid Build Coastguard Worker f="${files[i]}" 164*c0909341SAndroid Build Coastguard Worker if [ "$FILMGRAIN" -eq 0 ]; then 165*c0909341SAndroid Build Coastguard Worker md5=${f/\/streams\//\/md5_no_film_grain\/} 166*c0909341SAndroid Build Coastguard Worker else 167*c0909341SAndroid Build Coastguard Worker md5=${f/\/streams\//\/md5_ref\/} 168*c0909341SAndroid Build Coastguard Worker fi 169*c0909341SAndroid Build Coastguard Worker md5=$(<"${md5/%obu/md5}") || error "Error! Can't read md5 ${md5} for file ${f}" 170*c0909341SAndroid Build Coastguard Worker md5=${md5/ */} 171*c0909341SAndroid Build Coastguard Worker 172*c0909341SAndroid Build Coastguard Worker printf '\033[1K\r[%3d%% %*d/%d] Verifying %s' "$(((i+1)*100/num_files))" "${#num_files}" "$((i+1))" "$num_files" "${f#"$ARGON_DIR"/}" 173*c0909341SAndroid Build Coastguard Worker cmd=($WRAP "$DAV1D" -i "$f" --filmgrain "$FILMGRAIN" --verify "$md5" --cpumask "$CPUMASK" --threads "$THREADS" -q) 174*c0909341SAndroid Build Coastguard Worker if [ "$JOBS" -gt 1 ]; then 175*c0909341SAndroid Build Coastguard Worker "${cmd[@]}" 2>/dev/null & 176*c0909341SAndroid Build Coastguard Worker p=$! 177*c0909341SAndroid Build Coastguard Worker pids+=("$p") 178*c0909341SAndroid Build Coastguard Worker declare "file$p=${f#"$ARGON_DIR"/}" 179*c0909341SAndroid Build Coastguard Worker block_pids 180*c0909341SAndroid Build Coastguard Worker else 181*c0909341SAndroid Build Coastguard Worker if ! "${cmd[@]}" 2>/dev/null; then 182*c0909341SAndroid Build Coastguard Worker fail "${f#"$ARGON_DIR"/}" 183*c0909341SAndroid Build Coastguard Worker fi 184*c0909341SAndroid Build Coastguard Worker fi 185*c0909341SAndroid Build Coastguard Workerdone 186*c0909341SAndroid Build Coastguard Worker 187*c0909341SAndroid Build Coastguard Workerwait_all_pids 188*c0909341SAndroid Build Coastguard Worker 189*c0909341SAndroid Build Coastguard Workerif [ "$failed" -ne 0 ]; then 190*c0909341SAndroid Build Coastguard Worker printf "\033[1K\r%d/%d files \033[1;91mfailed\033[0m to verify" "$failed" "$num_files" 191*c0909341SAndroid Build Coastguard Workerelse 192*c0909341SAndroid Build Coastguard Worker printf "\033[1K\r%d files \033[1;92msuccessfully\033[0m verified" "$num_files" 193*c0909341SAndroid Build Coastguard Workerfi 194*c0909341SAndroid Build Coastguard Workerprintf " in %dm%ds (%s)\n" "$((SECONDS/60))" "$((SECONDS%60))" "$ver_info" 195*c0909341SAndroid Build Coastguard Worker 196*c0909341SAndroid Build Coastguard Workerexit $failed 197