xref: /aosp_15_r20/external/libdav1d/tests/dav1d_argon.bash (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
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