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 vpxenc using hantro_collage_w352h288.yuv as input. To add 12## new tests to this file, do the following: 13## 1. Write a shell function (this is your test). 14## 2. Add the function to vpxenc_tests (on a new line). 15## 16. $(dirname $0)/tools_common.sh 17 18readonly TEST_FRAMES=10 19 20# Environment check: Make sure input is available. 21vpxenc_verify_environment() { 22 if [ ! -e "${YUV_RAW_INPUT}" ]; then 23 elog "The file ${YUV_RAW_INPUT##*/} must exist in LIBVPX_TEST_DATA_PATH." 24 return 1 25 fi 26 if [ "$(vpxenc_can_encode_vp9)" = "yes" ]; then 27 if [ ! -e "${Y4M_NOSQ_PAR_INPUT}" ]; then 28 elog "The file ${Y4M_NOSQ_PAR_INPUT##*/} must exist in" 29 elog "LIBVPX_TEST_DATA_PATH." 30 return 1 31 fi 32 fi 33 if [ -z "$(vpx_tool_path vpxenc)" ]; then 34 elog "vpxenc not found. It must exist in LIBVPX_BIN_PATH or its parent." 35 return 1 36 fi 37} 38 39vpxenc_can_encode_vp8() { 40 if [ "$(vp8_encode_available)" = "yes" ]; then 41 echo yes 42 fi 43} 44 45vpxenc_can_encode_vp9() { 46 if [ "$(vp9_encode_available)" = "yes" ]; then 47 echo yes 48 fi 49} 50 51# Echo vpxenc command line parameters allowing use of 52# hantro_collage_w352h288.yuv as input. 53yuv_input_hantro_collage() { 54 echo ""${YUV_RAW_INPUT}" 55 --width="${YUV_RAW_INPUT_WIDTH}" 56 --height="${YUV_RAW_INPUT_HEIGHT}"" 57} 58 59y4m_input_non_square_par() { 60 echo ""${Y4M_NOSQ_PAR_INPUT}"" 61} 62 63y4m_input_720p() { 64 echo ""${Y4M_720P_INPUT}"" 65} 66 67# Echo default vpxenc real time encoding params. $1 is the codec, which defaults 68# to vp8 if unspecified. 69vpxenc_rt_params() { 70 local readonly codec="${1:-vp8}" 71 echo "--codec=${codec} 72 --buf-initial-sz=500 73 --buf-optimal-sz=600 74 --buf-sz=1000 75 --cpu-used=-6 76 --end-usage=cbr 77 --error-resilient=1 78 --kf-max-dist=90000 79 --lag-in-frames=0 80 --max-intra-rate=300 81 --max-q=56 82 --min-q=2 83 --noise-sensitivity=0 84 --overshoot-pct=50 85 --passes=1 86 --profile=0 87 --resize-allowed=0 88 --rt 89 --static-thresh=0 90 --undershoot-pct=50" 91} 92 93# Wrapper function for running vpxenc with pipe input. Requires that 94# LIBVPX_BIN_PATH points to the directory containing vpxenc. $1 is used as the 95# input file path and shifted away. All remaining parameters are passed through 96# to vpxenc. 97vpxenc_pipe() { 98 local readonly encoder="$(vpx_tool_path vpxenc)" 99 local readonly input="$1" 100 shift 101 cat "${input}" | eval "${VPX_TEST_PREFIX}" "${encoder}" - \ 102 --test-decode=fatal \ 103 "$@" ${devnull} 104} 105 106# Wrapper function for running vpxenc. Requires that LIBVPX_BIN_PATH points to 107# the directory containing vpxenc. $1 one is used as the input file path and 108# shifted away. All remaining parameters are passed through to vpxenc. 109vpxenc() { 110 local readonly encoder="$(vpx_tool_path vpxenc)" 111 local readonly input="$1" 112 shift 113 eval "${VPX_TEST_PREFIX}" "${encoder}" "${input}" \ 114 --test-decode=fatal \ 115 "$@" ${devnull} 116} 117 118vpxenc_vp8_ivf() { 119 if [ "$(vpxenc_can_encode_vp8)" = "yes" ]; then 120 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp8.ivf" 121 vpxenc $(yuv_input_hantro_collage) \ 122 --codec=vp8 \ 123 --limit="${TEST_FRAMES}" \ 124 --ivf \ 125 --output="${output}" 126 127 if [ ! -e "${output}" ]; then 128 elog "Output file does not exist." 129 return 1 130 fi 131 fi 132} 133 134vpxenc_vp8_webm() { 135 if [ "$(vpxenc_can_encode_vp8)" = "yes" ] && \ 136 [ "$(webm_io_available)" = "yes" ]; then 137 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp8.webm" 138 vpxenc $(yuv_input_hantro_collage) \ 139 --codec=vp8 \ 140 --limit="${TEST_FRAMES}" \ 141 --output="${output}" 142 143 if [ ! -e "${output}" ]; then 144 elog "Output file does not exist." 145 return 1 146 fi 147 fi 148} 149 150vpxenc_vp8_webm_rt() { 151 if [ "$(vpxenc_can_encode_vp8)" = "yes" ] && \ 152 [ "$(webm_io_available)" = "yes" ]; then 153 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp8_rt.webm" 154 vpxenc $(yuv_input_hantro_collage) \ 155 $(vpxenc_rt_params vp8) \ 156 --output="${output}" 157 if [ ! -e "${output}" ]; then 158 elog "Output file does not exist." 159 return 1 160 fi 161 fi 162} 163 164vpxenc_vp8_webm_2pass() { 165 if [ "$(vpxenc_can_encode_vp8)" = "yes" ] && \ 166 [ "$(webm_io_available)" = "yes" ]; then 167 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp8.webm" 168 vpxenc $(yuv_input_hantro_collage) \ 169 --codec=vp8 \ 170 --limit="${TEST_FRAMES}" \ 171 --output="${output}" \ 172 --passes=2 173 174 if [ ! -e "${output}" ]; then 175 elog "Output file does not exist." 176 return 1 177 fi 178 fi 179} 180 181vpxenc_vp8_webm_lag10_frames20() { 182 if [ "$(vpxenc_can_encode_vp8)" = "yes" ] && \ 183 [ "$(webm_io_available)" = "yes" ]; then 184 local readonly lag_total_frames=20 185 local readonly lag_frames=10 186 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp8_lag10_frames20.webm" 187 vpxenc $(yuv_input_hantro_collage) \ 188 --codec=vp8 \ 189 --limit="${lag_total_frames}" \ 190 --lag-in-frames="${lag_frames}" \ 191 --output="${output}" \ 192 --auto-alt-ref=1 \ 193 --passes=2 194 195 if [ ! -e "${output}" ]; then 196 elog "Output file does not exist." 197 return 1 198 fi 199 fi 200} 201 202vpxenc_vp8_ivf_piped_input() { 203 if [ "$(vpxenc_can_encode_vp8)" = "yes" ]; then 204 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp8_piped_input.ivf" 205 vpxenc_pipe $(yuv_input_hantro_collage) \ 206 --codec=vp8 \ 207 --limit="${TEST_FRAMES}" \ 208 --ivf \ 209 --output="${output}" 210 211 if [ ! -e "${output}" ]; then 212 elog "Output file does not exist." 213 return 1 214 fi 215 fi 216} 217 218vpxenc_vp9_ivf() { 219 if [ "$(vpxenc_can_encode_vp9)" = "yes" ]; then 220 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9.ivf" 221 vpxenc $(yuv_input_hantro_collage) \ 222 --codec=vp9 \ 223 --limit="${TEST_FRAMES}" \ 224 --ivf \ 225 --output="${output}" 226 227 if [ ! -e "${output}" ]; then 228 elog "Output file does not exist." 229 return 1 230 fi 231 fi 232} 233 234vpxenc_vp9_webm() { 235 if [ "$(vpxenc_can_encode_vp9)" = "yes" ] && \ 236 [ "$(webm_io_available)" = "yes" ]; then 237 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9.webm" 238 vpxenc $(yuv_input_hantro_collage) \ 239 --codec=vp9 \ 240 --limit="${TEST_FRAMES}" \ 241 --output="${output}" 242 243 if [ ! -e "${output}" ]; then 244 elog "Output file does not exist." 245 return 1 246 fi 247 fi 248} 249 250vpxenc_vp9_webm_rt() { 251 if [ "$(vpxenc_can_encode_vp9)" = "yes" ] && \ 252 [ "$(webm_io_available)" = "yes" ]; then 253 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9_rt.webm" 254 vpxenc $(yuv_input_hantro_collage) \ 255 $(vpxenc_rt_params vp9) \ 256 --output="${output}" 257 258 if [ ! -e "${output}" ]; then 259 elog "Output file does not exist." 260 return 1 261 fi 262 fi 263} 264 265vpxenc_vp9_webm_rt_multithread_tiled() { 266 if [ "$(vpxenc_can_encode_vp9)" = "yes" ] && \ 267 [ "$(webm_io_available)" = "yes" ]; then 268 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9_rt_multithread_tiled.webm" 269 local readonly tilethread_min=2 270 local readonly tilethread_max=4 271 local readonly num_threads="$(seq ${tilethread_min} ${tilethread_max})" 272 local readonly num_tile_cols="$(seq ${tilethread_min} ${tilethread_max})" 273 274 for threads in ${num_threads}; do 275 for tile_cols in ${num_tile_cols}; do 276 vpxenc $(y4m_input_720p) \ 277 $(vpxenc_rt_params vp9) \ 278 --threads=${threads} \ 279 --tile-columns=${tile_cols} \ 280 --output="${output}" 281 done 282 done 283 284 if [ ! -e "${output}" ]; then 285 elog "Output file does not exist." 286 return 1 287 fi 288 289 rm "${output}" 290 fi 291} 292 293vpxenc_vp9_webm_rt_multithread_tiled_frameparallel() { 294 if [ "$(vpxenc_can_encode_vp9)" = "yes" ] && \ 295 [ "$(webm_io_available)" = "yes" ]; then 296 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9_rt_mt_t_fp.webm" 297 local readonly tilethread_min=2 298 local readonly tilethread_max=4 299 local readonly num_threads="$(seq ${tilethread_min} ${tilethread_max})" 300 local readonly num_tile_cols="$(seq ${tilethread_min} ${tilethread_max})" 301 302 for threads in ${num_threads}; do 303 for tile_cols in ${num_tile_cols}; do 304 vpxenc $(y4m_input_720p) \ 305 $(vpxenc_rt_params vp9) \ 306 --threads=${threads} \ 307 --tile-columns=${tile_cols} \ 308 --frame-parallel=1 \ 309 --output="${output}" 310 done 311 done 312 313 if [ ! -e "${output}" ]; then 314 elog "Output file does not exist." 315 return 1 316 fi 317 318 rm "${output}" 319 fi 320} 321 322vpxenc_vp9_webm_2pass() { 323 if [ "$(vpxenc_can_encode_vp9)" = "yes" ] && \ 324 [ "$(webm_io_available)" = "yes" ]; then 325 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9.webm" 326 vpxenc $(yuv_input_hantro_collage) \ 327 --codec=vp9 \ 328 --limit="${TEST_FRAMES}" \ 329 --output="${output}" \ 330 --passes=2 331 332 if [ ! -e "${output}" ]; then 333 elog "Output file does not exist." 334 return 1 335 fi 336 fi 337} 338 339vpxenc_vp9_ivf_lossless() { 340 if [ "$(vpxenc_can_encode_vp9)" = "yes" ]; then 341 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9_lossless.ivf" 342 vpxenc $(yuv_input_hantro_collage) \ 343 --codec=vp9 \ 344 --limit="${TEST_FRAMES}" \ 345 --ivf \ 346 --output="${output}" \ 347 --lossless=1 348 349 if [ ! -e "${output}" ]; then 350 elog "Output file does not exist." 351 return 1 352 fi 353 fi 354} 355 356vpxenc_vp9_ivf_minq0_maxq0() { 357 if [ "$(vpxenc_can_encode_vp9)" = "yes" ]; then 358 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9_lossless_minq0_maxq0.ivf" 359 vpxenc $(yuv_input_hantro_collage) \ 360 --codec=vp9 \ 361 --limit="${TEST_FRAMES}" \ 362 --ivf \ 363 --output="${output}" \ 364 --min-q=0 \ 365 --max-q=0 366 367 if [ ! -e "${output}" ]; then 368 elog "Output file does not exist." 369 return 1 370 fi 371 fi 372} 373 374vpxenc_vp9_webm_lag10_frames20() { 375 if [ "$(vpxenc_can_encode_vp9)" = "yes" ] && \ 376 [ "$(webm_io_available)" = "yes" ]; then 377 local readonly lag_total_frames=20 378 local readonly lag_frames=10 379 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9_lag10_frames20.webm" 380 vpxenc $(yuv_input_hantro_collage) \ 381 --codec=vp9 \ 382 --limit="${lag_total_frames}" \ 383 --lag-in-frames="${lag_frames}" \ 384 --output="${output}" \ 385 --passes=2 \ 386 --auto-alt-ref=1 387 388 if [ ! -e "${output}" ]; then 389 elog "Output file does not exist." 390 return 1 391 fi 392 fi 393} 394 395# TODO(fgalligan): Test that DisplayWidth is different than video width. 396vpxenc_vp9_webm_non_square_par() { 397 if [ "$(vpxenc_can_encode_vp9)" = "yes" ] && \ 398 [ "$(webm_io_available)" = "yes" ]; then 399 local readonly output="${VPX_TEST_OUTPUT_DIR}/vp9_non_square_par.webm" 400 vpxenc $(y4m_input_non_square_par) \ 401 --codec=vp9 \ 402 --limit="${TEST_FRAMES}" \ 403 --output="${output}" 404 405 if [ ! -e "${output}" ]; then 406 elog "Output file does not exist." 407 return 1 408 fi 409 fi 410} 411 412vpxenc_tests="vpxenc_vp8_ivf 413 vpxenc_vp8_webm 414 vpxenc_vp8_webm_rt 415 vpxenc_vp8_webm_2pass 416 vpxenc_vp8_webm_lag10_frames20 417 vpxenc_vp8_ivf_piped_input 418 vpxenc_vp9_ivf 419 vpxenc_vp9_webm 420 vpxenc_vp9_webm_rt 421 vpxenc_vp9_webm_rt_multithread_tiled 422 vpxenc_vp9_webm_rt_multithread_tiled_frameparallel 423 vpxenc_vp9_webm_2pass 424 vpxenc_vp9_ivf_lossless 425 vpxenc_vp9_ivf_minq0_maxq0 426 vpxenc_vp9_webm_lag10_frames20 427 vpxenc_vp9_webm_non_square_par" 428 429run_tests vpxenc_verify_environment "${vpxenc_tests}" 430