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