#!/bin/sh
## Copyright (c) 2016, Alliance for Open Media. All rights reserved
##
## This source code is subject to the terms of the BSD 2 Clause License and
## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
## was not distributed with this source code in the LICENSE file, you can
## obtain it at www.aomedia.org/license/software. If the Alliance for Open
## Media Patent License 1.0 was not distributed with this source code in the
## PATENTS file, you can obtain it at www.aomedia.org/license/patent.
##
## This file tests the libaom decode_with_drops example. To add new tests to
## this file, do the following:
##   1. Write a shell function (this is your test).
##   2. Add the function to decode_with_drops_tests (on a new line).
##
. $(dirname $0)/tools_common.sh

# Environment check: Make sure input is available:
#   $AOM_IVF_FILE and $AV1_IVF_FILE are required.
decode_with_drops_verify_environment() {
  if [ ! -e "${AOM_IVF_FILE}" ] || [ ! -e "${AV1_IVF_FILE}" ]; then
    echo "Libaom test data must exist in LIBAOM_TEST_DATA_PATH."
    return 1
  fi
}

# Runs decode_with_drops on $1, $2 is interpreted as codec name and used solely
# to name the output file. $3 is the drop mode, and is passed directly to
# decode_with_drops.
decode_with_drops() {
  local decoder="${LIBAOM_BIN_PATH}/decode_with_drops${AOM_TEST_EXE_SUFFIX}"
  local input_file="$1"
  local codec="$2"
  local output_file="${AOM_TEST_OUTPUT_DIR}/decode_with_drops_${codec}"
  local drop_mode="$3"

  if [ ! -x "${decoder}" ]; then
    elog "${decoder} does not exist or is not executable."
    return 1
  fi

  eval "${AOM_TEST_PREFIX}" "${decoder}" "${input_file}" "${output_file}" \
      "${drop_mode}" ${devnull}

  [ -e "${output_file}" ] || return 1
}

# Decodes $AOM_IVF_FILE while dropping frames, twice: once in sequence mode,
# and once in pattern mode.
# Note: This test assumes that $AOM_IVF_FILE has exactly 29 frames, and could
# break if the file is modified.
decode_with_drops_aom() {
  if [ "$(aom_decode_available)" = "yes" ]; then
    # Test sequence mode: Drop frames 2-28.
    decode_with_drops "${AOM_IVF_FILE}" "aom" "2-28"

    # Test pattern mode: Drop 3 of every 4 frames.
    decode_with_drops "${AOM_IVF_FILE}" "aom" "3/4"
  fi
}

# Decodes $AV1_IVF_FILE while dropping frames, twice: once in sequence mode,
# and once in pattern mode.
# Note: This test assumes that $AV1_IVF_FILE has exactly 20 frames, and could
# break if the file is modified.
decode_with_drops_av1() {
  if [ "$(av1_decode_available)" = "yes" ]; then
    # Test sequence mode: Drop frames 2-28.
    decode_with_drops "${AV1_IVF_FILE}" "av1" "2-19"

    # Test pattern mode: Drop 3 of every 4 frames.
    decode_with_drops "${AV1_IVF_FILE}" "av1" "3/4"
  fi
}

decode_with_drops_tests="decode_with_drops_aom
                         decode_with_drops_av1"

run_tests decode_with_drops_verify_environment "${decode_with_drops_tests}"
