1#!/bin/sh 2## 3## Copyright (c) 2014 The WebM project authors. All Rights Reserved. 4## 5## Use of this source code is governed by a BSD-style license 6## that can be found in the LICENSE file in the root of the source 7## tree. An additional intellectual property rights grant can be found 8## in the file PATENTS. All contributing project authors may 9## be found in the AUTHORS file in the root of the source tree. 10## 11## This file tests the libvpx vpx_temporal_svc_encoder example. To add new 12## tests to this file, do the following: 13## 1. Write a shell function (this is your test). 14## 2. Add the function to vpx_tsvc_encoder_tests (on a new line). 15## 16. $(dirname $0)/tools_common.sh 17 18# Environment check: $YUV_RAW_INPUT is required. 19vpx_tsvc_encoder_verify_environment() { 20 if [ ! -e "${YUV_RAW_INPUT}" ]; then 21 echo "Libvpx test data must exist in LIBVPX_TEST_DATA_PATH." 22 return 1 23 fi 24 if [ "$(vpx_config_option_enabled CONFIG_TEMPORAL_DENOISING)" != "yes" ]; then 25 elog "Warning: Temporal denoising is disabled! Spatial denoising will be " \ 26 "used instead, which is probably not what you want for this test." 27 fi 28} 29 30# Runs vpx_temporal_svc_encoder using the codec specified by $1 and output file 31# name by $2. Additional positional parameters are passed directly to 32# vpx_temporal_svc_encoder. 33vpx_tsvc_encoder() { 34 local encoder="${LIBVPX_BIN_PATH}/vpx_temporal_svc_encoder" 35 encoder="${encoder}${VPX_TEST_EXE_SUFFIX}" 36 local codec="$1" 37 local output_file_base="$2" 38 local output_file="${VPX_TEST_OUTPUT_DIR}/${output_file_base}" 39 local timebase_num="1" 40 local timebase_den="1000" 41 local timebase_den_y4m="30" 42 local speed="6" 43 local frame_drop_thresh="30" 44 local max_threads="4" 45 local error_resilient="1" 46 47 shift 2 48 49 if [ ! -x "${encoder}" ]; then 50 elog "${encoder} does not exist or is not executable." 51 return 1 52 fi 53 54 # TODO(tomfinegan): Verify file output for all thread runs. 55 for threads in $(seq $max_threads); do 56 if [ "$(vpx_config_option_enabled CONFIG_VP9_HIGHBITDEPTH)" != "yes" ]; then 57 eval "${VPX_TEST_PREFIX}" "${encoder}" "${YUV_RAW_INPUT}" \ 58 "${output_file}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ 59 "${YUV_RAW_INPUT_HEIGHT}" "${timebase_num}" "${timebase_den}" \ 60 "${speed}" "${frame_drop_thresh}" "${error_resilient}" "${threads}" \ 61 "$@" ${devnull} 62 # Test for y4m input. 63 eval "${VPX_TEST_PREFIX}" "${encoder}" "${Y4M_720P_INPUT}" \ 64 "${output_file}" "${codec}" "${Y4M_720P_INPUT_WIDTH}" \ 65 "${Y4M_720P_INPUT_HEIGHT}" "${timebase_num}" "${timebase_den_y4m}" \ 66 "${speed}" "${frame_drop_thresh}" "${error_resilient}" "${threads}" \ 67 "$@" ${devnull} 68 else 69 eval "${VPX_TEST_PREFIX}" "${encoder}" "${YUV_RAW_INPUT}" \ 70 "${output_file}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ 71 "${YUV_RAW_INPUT_HEIGHT}" "${timebase_num}" "${timebase_den}" \ 72 "${speed}" "${frame_drop_thresh}" "${error_resilient}" "${threads}" \ 73 "$@" "8" ${devnull} 74 fi 75 done 76} 77 78# Confirms that all expected output files exist given the output file name 79# passed to vpx_temporal_svc_encoder. 80# The file name passed to vpx_temporal_svc_encoder is joined with the stream 81# number and the extension .ivf to produce per stream output files. Here $1 is 82# file name, and $2 is expected number of files. 83files_exist() { 84 local file_name="${VPX_TEST_OUTPUT_DIR}/$1" 85 local num_files="$(($2 - 1))" 86 for stream_num in $(seq 0 ${num_files}); do 87 [ -e "${file_name}_${stream_num}.ivf" ] || return 1 88 done 89} 90 91# Run vpx_temporal_svc_encoder in all supported modes for vp8 and vp9. 92 93vpx_tsvc_encoder_vp8_mode_0() { 94 if [ "$(vp8_encode_available)" = "yes" ]; then 95 local output_basename="vpx_tsvc_encoder_vp8_mode_0" 96 vpx_tsvc_encoder vp8 "${output_basename}" 0 200 || return 1 97 # Mode 0 produces 1 stream 98 files_exist "${output_basename}" 1 || return 1 99 fi 100} 101 102vpx_tsvc_encoder_vp8_mode_1() { 103 if [ "$(vp8_encode_available)" = "yes" ]; then 104 local output_basename="vpx_tsvc_encoder_vp8_mode_1" 105 vpx_tsvc_encoder vp8 "${output_basename}" 1 200 400 || return 1 106 # Mode 1 produces 2 streams 107 files_exist "${output_basename}" 2 || return 1 108 fi 109} 110 111vpx_tsvc_encoder_vp8_mode_2() { 112 if [ "$(vp8_encode_available)" = "yes" ]; then 113 local output_basename="vpx_tsvc_encoder_vp8_mode_2" 114 vpx_tsvc_encoder vp8 "${output_basename}" 2 200 400 || return 1 115 # Mode 2 produces 2 streams 116 files_exist "${output_basename}" 2 || return 1 117 fi 118} 119 120vpx_tsvc_encoder_vp8_mode_3() { 121 if [ "$(vp8_encode_available)" = "yes" ]; then 122 local output_basename="vpx_tsvc_encoder_vp8_mode_3" 123 vpx_tsvc_encoder vp8 "${output_basename}" 3 200 400 600 || return 1 124 # Mode 3 produces 3 streams 125 files_exist "${output_basename}" 3 || return 1 126 fi 127} 128 129vpx_tsvc_encoder_vp8_mode_4() { 130 if [ "$(vp8_encode_available)" = "yes" ]; then 131 local output_basename="vpx_tsvc_encoder_vp8_mode_4" 132 vpx_tsvc_encoder vp8 "${output_basename}" 4 200 400 600 || return 1 133 # Mode 4 produces 3 streams 134 files_exist "${output_basename}" 3 || return 1 135 fi 136} 137 138vpx_tsvc_encoder_vp8_mode_5() { 139 if [ "$(vp8_encode_available)" = "yes" ]; then 140 local output_basename="vpx_tsvc_encoder_vp8_mode_5" 141 vpx_tsvc_encoder vp8 "${output_basename}" 5 200 400 600 || return 1 142 # Mode 5 produces 3 streams 143 files_exist "${output_basename}" 3 || return 1 144 fi 145} 146 147vpx_tsvc_encoder_vp8_mode_6() { 148 if [ "$(vp8_encode_available)" = "yes" ]; then 149 local output_basename="vpx_tsvc_encoder_vp8_mode_6" 150 vpx_tsvc_encoder vp8 "${output_basename}" 6 200 400 600 || return 1 151 # Mode 6 produces 3 streams 152 files_exist "${output_basename}" 3 || return 1 153 fi 154} 155 156vpx_tsvc_encoder_vp8_mode_7() { 157 if [ "$(vp8_encode_available)" = "yes" ]; then 158 local output_basename="vpx_tsvc_encoder_vp8_mode_7" 159 vpx_tsvc_encoder vp8 "${output_basename}" 7 200 400 600 800 1000 || return 1 160 # Mode 7 produces 5 streams 161 files_exist "${output_basename}" 5 || return 1 162 fi 163} 164 165vpx_tsvc_encoder_vp8_mode_8() { 166 if [ "$(vp8_encode_available)" = "yes" ]; then 167 local output_basename="vpx_tsvc_encoder_vp8_mode_8" 168 vpx_tsvc_encoder vp8 "${output_basename}" 8 200 400 || return 1 169 # Mode 8 produces 2 streams 170 files_exist "${output_basename}" 2 || return 1 171 fi 172} 173 174vpx_tsvc_encoder_vp8_mode_9() { 175 if [ "$(vp8_encode_available)" = "yes" ]; then 176 local output_basename="vpx_tsvc_encoder_vp8_mode_9" 177 vpx_tsvc_encoder vp8 "${output_basename}" 9 200 400 600 || return 1 178 # Mode 9 produces 3 streams 179 files_exist "${output_basename}" 3 || return 1 180 fi 181} 182 183vpx_tsvc_encoder_vp8_mode_10() { 184 if [ "$(vp8_encode_available)" = "yes" ]; then 185 local output_basename="vpx_tsvc_encoder_vp8_mode_10" 186 vpx_tsvc_encoder vp8 "${output_basename}" 10 200 400 600 || return 1 187 # Mode 10 produces 3 streams 188 files_exist "${output_basename}" 3 || return 1 189 fi 190} 191 192vpx_tsvc_encoder_vp8_mode_11() { 193 if [ "$(vp8_encode_available)" = "yes" ]; then 194 local output_basename="vpx_tsvc_encoder_vp8_mode_11" 195 vpx_tsvc_encoder vp8 "${output_basename}" 11 200 400 600 || return 1 196 # Mode 11 produces 3 streams 197 files_exist "${output_basename}" 3 || return 1 198 fi 199} 200 201vpx_tsvc_encoder_vp9_mode_0() { 202 if [ "$(vp9_encode_available)" = "yes" ]; then 203 local output_basename="vpx_tsvc_encoder_vp9_mode_0" 204 vpx_tsvc_encoder vp9 "${output_basename}" 0 200 || return 1 205 # Mode 0 produces 1 stream 206 files_exist "${output_basename}" 1 || return 1 207 fi 208} 209 210vpx_tsvc_encoder_vp9_mode_1() { 211 if [ "$(vp9_encode_available)" = "yes" ]; then 212 local output_basename="vpx_tsvc_encoder_vp9_mode_1" 213 vpx_tsvc_encoder vp9 "${output_basename}" 1 200 400 || return 1 214 # Mode 1 produces 2 streams 215 files_exist "${output_basename}" 2 || return 1 216 fi 217} 218 219vpx_tsvc_encoder_vp9_mode_2() { 220 if [ "$(vp9_encode_available)" = "yes" ]; then 221 local output_basename="vpx_tsvc_encoder_vp9_mode_2" 222 vpx_tsvc_encoder vp9 "${output_basename}" 2 200 400 || return 1 223 # Mode 2 produces 2 streams 224 files_exist "${output_basename}" 2 || return 1 225 fi 226} 227 228vpx_tsvc_encoder_vp9_mode_3() { 229 if [ "$(vp9_encode_available)" = "yes" ]; then 230 local output_basename="vpx_tsvc_encoder_vp9_mode_3" 231 vpx_tsvc_encoder vp9 "${output_basename}" 3 200 400 600 || return 1 232 # Mode 3 produces 3 streams 233 files_exist "${output_basename}" 3 || return 1 234 fi 235} 236 237vpx_tsvc_encoder_vp9_mode_4() { 238 if [ "$(vp9_encode_available)" = "yes" ]; then 239 local output_basename="vpx_tsvc_encoder_vp9_mode_4" 240 vpx_tsvc_encoder vp9 "${output_basename}" 4 200 400 600 || return 1 241 # Mode 4 produces 3 streams 242 files_exist "${output_basename}" 3 || return 1 243 fi 244} 245 246vpx_tsvc_encoder_vp9_mode_5() { 247 if [ "$(vp9_encode_available)" = "yes" ]; then 248 local output_basename="vpx_tsvc_encoder_vp9_mode_5" 249 vpx_tsvc_encoder vp9 "${output_basename}" 5 200 400 600 || return 1 250 # Mode 5 produces 3 streams 251 files_exist "${output_basename}" 3 || return 1 252 fi 253} 254 255vpx_tsvc_encoder_vp9_mode_6() { 256 if [ "$(vp9_encode_available)" = "yes" ]; then 257 local output_basename="vpx_tsvc_encoder_vp9_mode_6" 258 vpx_tsvc_encoder vp9 "${output_basename}" 6 200 400 600 || return 1 259 # Mode 6 produces 3 streams 260 files_exist "${output_basename}" 3 || return 1 261 fi 262} 263 264vpx_tsvc_encoder_vp9_mode_7() { 265 if [ "$(vp9_encode_available)" = "yes" ]; then 266 local output_basename="vpx_tsvc_encoder_vp9_mode_7" 267 vpx_tsvc_encoder vp9 "${output_basename}" 7 200 400 600 800 1000 || return 1 268 # Mode 7 produces 5 streams 269 files_exist "${output_basename}" 5 || return 1 270 fi 271} 272 273vpx_tsvc_encoder_vp9_mode_8() { 274 if [ "$(vp9_encode_available)" = "yes" ]; then 275 local output_basename="vpx_tsvc_encoder_vp9_mode_8" 276 vpx_tsvc_encoder vp9 "${output_basename}" 8 200 400 || return 1 277 # Mode 8 produces 2 streams 278 files_exist "${output_basename}" 2 || return 1 279 fi 280} 281 282vpx_tsvc_encoder_vp9_mode_9() { 283 if [ "$(vp9_encode_available)" = "yes" ]; then 284 local output_basename="vpx_tsvc_encoder_vp9_mode_9" 285 vpx_tsvc_encoder vp9 "${output_basename}" 9 200 400 600 || return 1 286 # Mode 9 produces 3 streams 287 files_exist "${output_basename}" 3 || return 1 288 fi 289} 290 291vpx_tsvc_encoder_vp9_mode_10() { 292 if [ "$(vp9_encode_available)" = "yes" ]; then 293 local output_basename="vpx_tsvc_encoder_vp9_mode_10" 294 vpx_tsvc_encoder vp9 "${output_basename}" 10 200 400 600 || return 1 295 # Mode 10 produces 3 streams 296 files_exist "${output_basename}" 3 || return 1 297 fi 298} 299 300vpx_tsvc_encoder_vp9_mode_11() { 301 if [ "$(vp9_encode_available)" = "yes" ]; then 302 local output_basename="vpx_tsvc_encoder_vp9_mode_11" 303 vpx_tsvc_encoder vp9 "${output_basename}" 11 200 400 600 || return 1 304 # Mode 11 produces 3 streams 305 files_exist "${output_basename}" 3 || return 1 306 fi 307} 308 309vpx_tsvc_encoder_tests="vpx_tsvc_encoder_vp8_mode_0 310 vpx_tsvc_encoder_vp8_mode_1 311 vpx_tsvc_encoder_vp8_mode_2 312 vpx_tsvc_encoder_vp8_mode_3 313 vpx_tsvc_encoder_vp8_mode_4 314 vpx_tsvc_encoder_vp8_mode_5 315 vpx_tsvc_encoder_vp8_mode_6 316 vpx_tsvc_encoder_vp8_mode_7 317 vpx_tsvc_encoder_vp8_mode_8 318 vpx_tsvc_encoder_vp8_mode_9 319 vpx_tsvc_encoder_vp8_mode_10 320 vpx_tsvc_encoder_vp8_mode_11 321 vpx_tsvc_encoder_vp9_mode_0 322 vpx_tsvc_encoder_vp9_mode_1 323 vpx_tsvc_encoder_vp9_mode_2 324 vpx_tsvc_encoder_vp9_mode_3 325 vpx_tsvc_encoder_vp9_mode_4 326 vpx_tsvc_encoder_vp9_mode_5 327 vpx_tsvc_encoder_vp9_mode_6 328 vpx_tsvc_encoder_vp9_mode_7 329 vpx_tsvc_encoder_vp9_mode_8 330 vpx_tsvc_encoder_vp9_mode_9 331 vpx_tsvc_encoder_vp9_mode_10 332 vpx_tsvc_encoder_vp9_mode_11" 333 334run_tests vpx_tsvc_encoder_verify_environment "${vpx_tsvc_encoder_tests}" 335