xref: /aosp_15_r20/external/libvpx/test/stress.sh (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker#!/bin/sh
2*fb1b10abSAndroid Build Coastguard Worker##
3*fb1b10abSAndroid Build Coastguard Worker##  Copyright (c) 2016 The WebM project authors. All Rights Reserved.
4*fb1b10abSAndroid Build Coastguard Worker##
5*fb1b10abSAndroid Build Coastguard Worker##  Use of this source code is governed by a BSD-style license
6*fb1b10abSAndroid Build Coastguard Worker##  that can be found in the LICENSE file in the root of the source
7*fb1b10abSAndroid Build Coastguard Worker##  tree. An additional intellectual property rights grant can be found
8*fb1b10abSAndroid Build Coastguard Worker##  in the file PATENTS.  All contributing project authors may
9*fb1b10abSAndroid Build Coastguard Worker##  be found in the AUTHORS file in the root of the source tree.
10*fb1b10abSAndroid Build Coastguard Worker##
11*fb1b10abSAndroid Build Coastguard Worker##  This file performs a stress test. It runs (STRESS_ONEPASS_MAX_JOBS,
12*fb1b10abSAndroid Build Coastguard Worker##  default=5) one, (STRESS_TWOPASS_MAX_JOBS, default=5) two pass &
13*fb1b10abSAndroid Build Coastguard Worker##  (STRESS_RT_MAX_JOBS, default=5) encodes and (STRESS_<codec>_DECODE_MAX_JOBS,
14*fb1b10abSAndroid Build Coastguard Worker##  default=30) decodes in parallel.
15*fb1b10abSAndroid Build Coastguard Worker
16*fb1b10abSAndroid Build Coastguard Worker. $(dirname $0)/tools_common.sh
17*fb1b10abSAndroid Build Coastguard Worker
18*fb1b10abSAndroid Build Coastguard WorkerYUV="${LIBVPX_TEST_DATA_PATH}/niklas_1280_720_30.yuv"
19*fb1b10abSAndroid Build Coastguard WorkerVP8="${LIBVPX_TEST_DATA_PATH}/tos_vp8.webm"
20*fb1b10abSAndroid Build Coastguard WorkerVP9="${LIBVPX_TEST_DATA_PATH}/vp90-2-sintel_1920x818_tile_1x4_fpm_2279kbps.webm"
21*fb1b10abSAndroid Build Coastguard WorkerDATA_URL="https://storage.googleapis.com/downloads.webmproject.org/test_data/libvpx/"
22*fb1b10abSAndroid Build Coastguard WorkerSHA1_FILE="$(dirname $0)/test-data.sha1"
23*fb1b10abSAndroid Build Coastguard Worker
24*fb1b10abSAndroid Build Coastguard Worker# Set sha1sum to proper sha program (sha1sum, shasum, sha1). This code is
25*fb1b10abSAndroid Build Coastguard Worker# cribbed from libs.mk.
26*fb1b10abSAndroid Build Coastguard Worker[ -x "$(which sha1sum)" ] && sha1sum=sha1sum
27*fb1b10abSAndroid Build Coastguard Worker[ -x "$(which shasum)" ] && sha1sum=shasum
28*fb1b10abSAndroid Build Coastguard Worker[ -x "$(which sha1)" ] && sha1sum=sha1
29*fb1b10abSAndroid Build Coastguard Worker
30*fb1b10abSAndroid Build Coastguard Worker# Download a file from the url and check its sha1sum.
31*fb1b10abSAndroid Build Coastguard Workerdownload_and_check_file() {
32*fb1b10abSAndroid Build Coastguard Worker  # Get the file from the file path.
33*fb1b10abSAndroid Build Coastguard Worker  local root="${1#${LIBVPX_TEST_DATA_PATH}/}"
34*fb1b10abSAndroid Build Coastguard Worker
35*fb1b10abSAndroid Build Coastguard Worker  # Download the file using curl. Trap to insure non partial file.
36*fb1b10abSAndroid Build Coastguard Worker  (trap "rm -f $1" INT TERM \
37*fb1b10abSAndroid Build Coastguard Worker    && eval "curl --retry 1 -L -o $1 ${DATA_URL}${root} ${devnull}")
38*fb1b10abSAndroid Build Coastguard Worker
39*fb1b10abSAndroid Build Coastguard Worker  # Check the sha1 sum of the file.
40*fb1b10abSAndroid Build Coastguard Worker  if [ -n "${sha1sum}" ]; then
41*fb1b10abSAndroid Build Coastguard Worker    set -e
42*fb1b10abSAndroid Build Coastguard Worker    grep ${root} ${SHA1_FILE} \
43*fb1b10abSAndroid Build Coastguard Worker      | (cd ${LIBVPX_TEST_DATA_PATH}; ${sha1sum} -c);
44*fb1b10abSAndroid Build Coastguard Worker  fi
45*fb1b10abSAndroid Build Coastguard Worker}
46*fb1b10abSAndroid Build Coastguard Worker
47*fb1b10abSAndroid Build Coastguard Worker# Environment check: Make sure input is available.
48*fb1b10abSAndroid Build Coastguard Workerstress_verify_environment() {
49*fb1b10abSAndroid Build Coastguard Worker  if [ ! -e "${SHA1_FILE}" ] ; then
50*fb1b10abSAndroid Build Coastguard Worker    echo "Missing ${SHA1_FILE}"
51*fb1b10abSAndroid Build Coastguard Worker    return 1
52*fb1b10abSAndroid Build Coastguard Worker  fi
53*fb1b10abSAndroid Build Coastguard Worker  for file in "${YUV}" "${VP8}" "${VP9}"; do
54*fb1b10abSAndroid Build Coastguard Worker    if [ ! -e "${file}" ] ; then
55*fb1b10abSAndroid Build Coastguard Worker      download_and_check_file "${file}" || return 1
56*fb1b10abSAndroid Build Coastguard Worker    fi
57*fb1b10abSAndroid Build Coastguard Worker  done
58*fb1b10abSAndroid Build Coastguard Worker  if [ ! -e "${YUV}" ] || [ ! -e "${VP8}" ] || [ ! -e "${VP9}" ] ; then
59*fb1b10abSAndroid Build Coastguard Worker    elog "Libvpx test data must exist in LIBVPX_TEST_DATA_PATH."
60*fb1b10abSAndroid Build Coastguard Worker    return 1
61*fb1b10abSAndroid Build Coastguard Worker  fi
62*fb1b10abSAndroid Build Coastguard Worker  if [ -z "$(vpx_tool_path vpxenc)" ]; then
63*fb1b10abSAndroid Build Coastguard Worker    elog "vpxenc not found. It must exist in LIBVPX_BIN_PATH or its parent."
64*fb1b10abSAndroid Build Coastguard Worker    return 1
65*fb1b10abSAndroid Build Coastguard Worker  fi
66*fb1b10abSAndroid Build Coastguard Worker  if [ -z "$(vpx_tool_path vpxdec)" ]; then
67*fb1b10abSAndroid Build Coastguard Worker    elog "vpxdec not found. It must exist in LIBVPX_BIN_PATH or its parent."
68*fb1b10abSAndroid Build Coastguard Worker    return 1
69*fb1b10abSAndroid Build Coastguard Worker  fi
70*fb1b10abSAndroid Build Coastguard Worker}
71*fb1b10abSAndroid Build Coastguard Worker
72*fb1b10abSAndroid Build Coastguard Worker# This function runs tests on libvpx that run multiple encodes and decodes
73*fb1b10abSAndroid Build Coastguard Worker# in parallel in hopes of catching synchronization and/or threading issues.
74*fb1b10abSAndroid Build Coastguard Workerstress() {
75*fb1b10abSAndroid Build Coastguard Worker  local decoder="$(vpx_tool_path vpxdec)"
76*fb1b10abSAndroid Build Coastguard Worker  local encoder="$(vpx_tool_path vpxenc)"
77*fb1b10abSAndroid Build Coastguard Worker  local codec="$1"
78*fb1b10abSAndroid Build Coastguard Worker  local webm="$2"
79*fb1b10abSAndroid Build Coastguard Worker  local decode_count="$3"
80*fb1b10abSAndroid Build Coastguard Worker  local threads="$4"
81*fb1b10abSAndroid Build Coastguard Worker  local enc_args="$5"
82*fb1b10abSAndroid Build Coastguard Worker  local pids=""
83*fb1b10abSAndroid Build Coastguard Worker  local rt_max_jobs=${STRESS_RT_MAX_JOBS:-5}
84*fb1b10abSAndroid Build Coastguard Worker  local onepass_max_jobs=${STRESS_ONEPASS_MAX_JOBS:-5}
85*fb1b10abSAndroid Build Coastguard Worker  local twopass_max_jobs=${STRESS_TWOPASS_MAX_JOBS:-5}
86*fb1b10abSAndroid Build Coastguard Worker
87*fb1b10abSAndroid Build Coastguard Worker  # Enable job control, so we can run multiple processes.
88*fb1b10abSAndroid Build Coastguard Worker  set -m
89*fb1b10abSAndroid Build Coastguard Worker
90*fb1b10abSAndroid Build Coastguard Worker  # Start $onepass_max_jobs encode jobs in parallel.
91*fb1b10abSAndroid Build Coastguard Worker  for i in $(seq ${onepass_max_jobs}); do
92*fb1b10abSAndroid Build Coastguard Worker    bitrate=$(($i * 20 + 300))
93*fb1b10abSAndroid Build Coastguard Worker    eval "${VPX_TEST_PREFIX}" "${encoder}" "--codec=${codec} -w 1280 -h 720" \
94*fb1b10abSAndroid Build Coastguard Worker      "${YUV}" "-t ${threads} --limit=150 --test-decode=fatal --passes=1" \
95*fb1b10abSAndroid Build Coastguard Worker      "--target-bitrate=${bitrate} -o ${VPX_TEST_OUTPUT_DIR}/${i}.1pass.webm" \
96*fb1b10abSAndroid Build Coastguard Worker      "${enc_args}" ${devnull} &
97*fb1b10abSAndroid Build Coastguard Worker    pids="${pids} $!"
98*fb1b10abSAndroid Build Coastguard Worker  done
99*fb1b10abSAndroid Build Coastguard Worker
100*fb1b10abSAndroid Build Coastguard Worker  # Start $twopass_max_jobs encode jobs in parallel.
101*fb1b10abSAndroid Build Coastguard Worker  for i in $(seq ${twopass_max_jobs}); do
102*fb1b10abSAndroid Build Coastguard Worker    bitrate=$(($i * 20 + 300))
103*fb1b10abSAndroid Build Coastguard Worker    eval "${VPX_TEST_PREFIX}" "${encoder}" "--codec=${codec} -w 1280 -h 720" \
104*fb1b10abSAndroid Build Coastguard Worker      "${YUV}" "-t ${threads} --limit=150 --test-decode=fatal --passes=2" \
105*fb1b10abSAndroid Build Coastguard Worker      "--target-bitrate=${bitrate} -o ${VPX_TEST_OUTPUT_DIR}/${i}.2pass.webm" \
106*fb1b10abSAndroid Build Coastguard Worker      "${enc_args}" ${devnull} &
107*fb1b10abSAndroid Build Coastguard Worker    pids="${pids} $!"
108*fb1b10abSAndroid Build Coastguard Worker  done
109*fb1b10abSAndroid Build Coastguard Worker
110*fb1b10abSAndroid Build Coastguard Worker  # Start $rt_max_jobs rt encode jobs in parallel.
111*fb1b10abSAndroid Build Coastguard Worker  for i in $(seq ${rt_max_jobs}); do
112*fb1b10abSAndroid Build Coastguard Worker    bitrate=$(($i * 20 + 300))
113*fb1b10abSAndroid Build Coastguard Worker    eval "${VPX_TEST_PREFIX}" "${encoder}" "--codec=${codec} -w 1280 -h 720" \
114*fb1b10abSAndroid Build Coastguard Worker      "${YUV}" "-t ${threads} --limit=150 --test-decode=fatal " \
115*fb1b10abSAndroid Build Coastguard Worker      "--target-bitrate=${bitrate} --lag-in-frames=0 --error-resilient=1" \
116*fb1b10abSAndroid Build Coastguard Worker      "--kf-min-dist=3000 --kf-max-dist=3000 --cpu-used=-6 --static-thresh=1" \
117*fb1b10abSAndroid Build Coastguard Worker      "--end-usage=cbr --min-q=2 --max-q=56 --undershoot-pct=100" \
118*fb1b10abSAndroid Build Coastguard Worker      "--overshoot-pct=15 --buf-sz=1000 --buf-initial-sz=500" \
119*fb1b10abSAndroid Build Coastguard Worker      "--buf-optimal-sz=600 --max-intra-rate=900 --resize-allowed=0" \
120*fb1b10abSAndroid Build Coastguard Worker      "--drop-frame=0 --passes=1 --rt --noise-sensitivity=4" \
121*fb1b10abSAndroid Build Coastguard Worker      "-o ${VPX_TEST_OUTPUT_DIR}/${i}.rt.webm" ${devnull} &
122*fb1b10abSAndroid Build Coastguard Worker    pids="${pids} $!"
123*fb1b10abSAndroid Build Coastguard Worker  done
124*fb1b10abSAndroid Build Coastguard Worker
125*fb1b10abSAndroid Build Coastguard Worker  # Start $decode_count decode jobs in parallel.
126*fb1b10abSAndroid Build Coastguard Worker  for i in $(seq "${decode_count}"); do
127*fb1b10abSAndroid Build Coastguard Worker    eval "${decoder}" "-t ${threads}" "${webm}" "--noblit" ${devnull} &
128*fb1b10abSAndroid Build Coastguard Worker    pids="${pids} $!"
129*fb1b10abSAndroid Build Coastguard Worker  done
130*fb1b10abSAndroid Build Coastguard Worker
131*fb1b10abSAndroid Build Coastguard Worker  # Wait for all parallel jobs to finish.
132*fb1b10abSAndroid Build Coastguard Worker  fail=0
133*fb1b10abSAndroid Build Coastguard Worker  for job in "${pids}"; do
134*fb1b10abSAndroid Build Coastguard Worker    wait $job || fail=$(($fail + 1))
135*fb1b10abSAndroid Build Coastguard Worker  done
136*fb1b10abSAndroid Build Coastguard Worker  return $fail
137*fb1b10abSAndroid Build Coastguard Worker}
138*fb1b10abSAndroid Build Coastguard Worker
139*fb1b10abSAndroid Build Coastguard Workervp8_stress_test() {
140*fb1b10abSAndroid Build Coastguard Worker  local vp8_max_jobs=${STRESS_VP8_DECODE_MAX_JOBS:-40}
141*fb1b10abSAndroid Build Coastguard Worker  if [ "$(vp8_decode_available)" = "yes" -a \
142*fb1b10abSAndroid Build Coastguard Worker       "$(vp8_encode_available)" = "yes" ]; then
143*fb1b10abSAndroid Build Coastguard Worker    stress vp8 "${VP8}" "${vp8_max_jobs}" 4
144*fb1b10abSAndroid Build Coastguard Worker  fi
145*fb1b10abSAndroid Build Coastguard Worker}
146*fb1b10abSAndroid Build Coastguard Worker
147*fb1b10abSAndroid Build Coastguard Workervp8_stress_test_token_parititions() {
148*fb1b10abSAndroid Build Coastguard Worker  local vp8_max_jobs=${STRESS_VP8_DECODE_MAX_JOBS:-40}
149*fb1b10abSAndroid Build Coastguard Worker  if [ "$(vp8_decode_available)" = "yes" -a \
150*fb1b10abSAndroid Build Coastguard Worker       "$(vp8_encode_available)" = "yes" ]; then
151*fb1b10abSAndroid Build Coastguard Worker    for threads in 2 4 8; do
152*fb1b10abSAndroid Build Coastguard Worker      for token_partitions in 1 2 3; do
153*fb1b10abSAndroid Build Coastguard Worker        stress vp8 "${VP8}" "${vp8_max_jobs}" ${threads} \
154*fb1b10abSAndroid Build Coastguard Worker          "--token-parts=$token_partitions"
155*fb1b10abSAndroid Build Coastguard Worker      done
156*fb1b10abSAndroid Build Coastguard Worker    done
157*fb1b10abSAndroid Build Coastguard Worker  fi
158*fb1b10abSAndroid Build Coastguard Worker}
159*fb1b10abSAndroid Build Coastguard Worker
160*fb1b10abSAndroid Build Coastguard Workervp9_stress() {
161*fb1b10abSAndroid Build Coastguard Worker  local vp9_max_jobs=${STRESS_VP9_DECODE_MAX_JOBS:-25}
162*fb1b10abSAndroid Build Coastguard Worker
163*fb1b10abSAndroid Build Coastguard Worker  if [ "$(vp9_decode_available)" = "yes" -a \
164*fb1b10abSAndroid Build Coastguard Worker       "$(vp9_encode_available)" = "yes" ]; then
165*fb1b10abSAndroid Build Coastguard Worker    stress vp9 "${VP9}" "${vp9_max_jobs}" "$@"
166*fb1b10abSAndroid Build Coastguard Worker  fi
167*fb1b10abSAndroid Build Coastguard Worker}
168*fb1b10abSAndroid Build Coastguard Worker
169*fb1b10abSAndroid Build Coastguard Workervp9_stress_test() {
170*fb1b10abSAndroid Build Coastguard Worker  for threads in 4 8 64; do
171*fb1b10abSAndroid Build Coastguard Worker    vp9_stress "$threads" "--row-mt=0"
172*fb1b10abSAndroid Build Coastguard Worker  done
173*fb1b10abSAndroid Build Coastguard Worker}
174*fb1b10abSAndroid Build Coastguard Worker
175*fb1b10abSAndroid Build Coastguard Workervp9_stress_test_row_mt() {
176*fb1b10abSAndroid Build Coastguard Worker  for threads in 4 8 64; do
177*fb1b10abSAndroid Build Coastguard Worker    vp9_stress "$threads" "--row-mt=1"
178*fb1b10abSAndroid Build Coastguard Worker  done
179*fb1b10abSAndroid Build Coastguard Worker}
180*fb1b10abSAndroid Build Coastguard Worker
181*fb1b10abSAndroid Build Coastguard Workerrun_tests stress_verify_environment \
182*fb1b10abSAndroid Build Coastguard Worker  "vp8_stress_test vp8_stress_test_token_parititions
183*fb1b10abSAndroid Build Coastguard Worker   vp9_stress_test vp9_stress_test_row_mt"
184