#!/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 aomenc using hantro_collage_w352h288.yuv as input. To add
## new tests to this file, do the following:
##   1. Write a shell function (this is your test).
##   2. Add the function to aomenc_tests (on a new line).
##
. $(dirname $0)/tools_common.sh

# Environment check: Make sure input is available.
aomenc_verify_environment() {
  if [ ! -e "${YUV_RAW_INPUT}" ]; then
    elog "The file ${YUV_RAW_INPUT##*/} must exist in LIBAOM_TEST_DATA_PATH."
    return 1
  fi
  if [ "$(aomenc_can_encode_av1)" = "yes" ]; then
    if [ ! -e "${Y4M_NOSQ_PAR_INPUT}" ]; then
      elog "The file ${Y4M_NOSQ_PAR_INPUT##*/} must exist in"
      elog "LIBAOM_TEST_DATA_PATH."
      return 1
    fi
  fi
  if [ -z "$(aom_tool_path aomenc)" ]; then
    elog "aomenc not found. It must exist in LIBAOM_BIN_PATH or its parent."
    return 1
  fi
}

aomenc_can_encode_av1() {
  if [ "$(av1_encode_available)" = "yes" ]; then
    echo yes
  fi
}

aomenc_can_encode_av1() {
  if [ "$(av1_encode_available)" = "yes" ]; then
    echo yes
  fi
}

# Utilities that echo aomenc input file parameters.
y4m_input_non_square_par() {
  echo ""${Y4M_NOSQ_PAR_INPUT}""
}

y4m_input_720p() {
  echo ""${Y4M_720P_INPUT}""
}

# Wrapper function for running aomenc with pipe input. Requires that
# LIBAOM_BIN_PATH points to the directory containing aomenc. $1 is used as the
# input file path and shifted away. All remaining parameters are passed through
# to aomenc.
aomenc_pipe() {
  local encoder="$(aom_tool_path aomenc)"
  local input="$1"
  shift
  cat "${input}" | eval "${AOM_TEST_PREFIX}" "${encoder}" - \
    --test-decode=fatal \
    "$@" ${devnull}
}

# Wrapper function for running aomenc. Requires that LIBAOM_BIN_PATH points to
# the directory containing aomenc. $1 one is used as the input file path and
# shifted away. All remaining parameters are passed through to aomenc.
aomenc() {
  local encoder="$(aom_tool_path aomenc)"
  local input="$1"
  shift
  eval "${AOM_TEST_PREFIX}" "${encoder}" "${input}" \
    --test-decode=fatal \
    "$@" ${devnull}
}

aomenc_av1_ivf() {
  if [ "$(aomenc_can_encode_av1)" = "yes" ]; then
    local output="${AV1_IVF_FILE}"
    if [ -e "${AV1_IVF_FILE}" ]; then
      output="${AOM_TEST_OUTPUT_DIR}/av1_test.ivf"
    fi
    aomenc $(yuv_raw_input) \
      $(aomenc_encode_test_fast_params) \
      --ivf \
      --output="${output}"

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

aomenc_av1_obu_annexb() {
   if [ "$(aomenc_can_encode_av1)" = "yes" ]; then
    local output="${AV1_OBU_ANNEXB_FILE}"
    if [ -e "${AV1_OBU_ANNEXB_FILE}" ]; then
      output="${AOM_TEST_OUTPUT_DIR}/av1_test.annexb.obu"
    fi
    aomenc $(yuv_raw_input) \
      $(aomenc_encode_test_fast_params) \
      --obu \
      --annexb=1 \
      --output="${output}"

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

aomenc_av1_obu_section5() {
   if [ "$(aomenc_can_encode_av1)" = "yes" ]; then
    local output="${AV1_OBU_SEC5_FILE}"
    if [ -e "${AV1_OBU_SEC5_FILE}" ]; then
      output="${AOM_TEST_OUTPUT_DIR}/av1_test.section5.obu"
    fi
    aomenc $(yuv_raw_input) \
      $(aomenc_encode_test_fast_params) \
      --obu \
      --output="${output}"

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

aomenc_av1_webm() {
  if [ "$(aomenc_can_encode_av1)" = "yes" ] && \
     [ "$(webm_io_available)" = "yes" ]; then
    local output="${AV1_WEBM_FILE}"
    if [ -e "${AV1_WEBM_FILE}" ]; then
      output="${AOM_TEST_OUTPUT_DIR}/av1_test.webm"
    fi
    aomenc $(yuv_raw_input) \
      $(aomenc_encode_test_fast_params) \
      --output="${output}"

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

aomenc_av1_webm_1pass() {
  if [ "$(aomenc_can_encode_av1)" = "yes" ] && \
     [ "$(webm_io_available)" = "yes" ]; then
    local output="${AOM_TEST_OUTPUT_DIR}/av1_test.webm"
    aomenc $(yuv_raw_input) \
      $(aomenc_encode_test_fast_params) \
      --passes=1 \
      --output="${output}"

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

aomenc_av1_ivf_lossless() {
  if [ "$(aomenc_can_encode_av1)" = "yes" ]; then
    local output="${AOM_TEST_OUTPUT_DIR}/av1_lossless.ivf"
    aomenc $(yuv_raw_input) \
      $(aomenc_encode_test_fast_params) \
      --ivf \
      --output="${output}" \
      --lossless=1

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

aomenc_av1_ivf_minq0_maxq0() {
  if [ "$(aomenc_can_encode_av1)" = "yes" ]; then
    local output="${AOM_TEST_OUTPUT_DIR}/av1_lossless_minq0_maxq0.ivf"
    aomenc $(yuv_raw_input) \
      $(aomenc_encode_test_fast_params) \
      --ivf \
      --output="${output}" \
      --min-q=0 \
      --max-q=0

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

aomenc_av1_webm_lag5_frames10() {
  if [ "$(aomenc_can_encode_av1)" = "yes" ] && \
     [ "$(webm_io_available)" = "yes" ]; then
    local lag_total_frames=10
    local lag_frames=5
    local output="${AOM_TEST_OUTPUT_DIR}/av1_lag5_frames10.webm"
    aomenc $(yuv_raw_input) \
      $(aomenc_encode_test_fast_params) \
      --limit=${lag_total_frames} \
      --lag-in-frames=${lag_frames} \
      --output="${output}"

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

# TODO(fgalligan): Test that DisplayWidth is different than video width.
aomenc_av1_webm_non_square_par() {
  if [ "$(aomenc_can_encode_av1)" = "yes" ] && \
     [ "$(webm_io_available)" = "yes" ]; then
    local output="${AOM_TEST_OUTPUT_DIR}/av1_non_square_par.webm"
    aomenc $(y4m_input_non_square_par) \
      $(aomenc_encode_test_fast_params) \
      --output="${output}"

    if [ ! -e "${output}" ]; then
      elog "Output file does not exist."
      return 1
    fi
  fi
}

aomenc_av1_webm_cdf_update_mode() {
  if [ "$(aomenc_can_encode_av1)" = "yes" ] && \
     [ "$(webm_io_available)" = "yes" ]; then
    for mode in 0 1 2; do
      local output="${AOM_TEST_OUTPUT_DIR}/cdf_mode_${mode}.webm"
      aomenc $(yuv_raw_input) \
        $(aomenc_encode_test_fast_params) \
        --cdf-update-mode=${mode} \
        --output="${output}"

      if [ ! -e "${output}" ]; then
        elog "Output file does not exist."
        return 1
      fi
    done
  fi
}

aomenc_tests="aomenc_av1_ivf
              aomenc_av1_obu_annexb
              aomenc_av1_obu_section5
              aomenc_av1_webm
              aomenc_av1_webm_1pass
              aomenc_av1_ivf_lossless
              aomenc_av1_ivf_minq0_maxq0
              aomenc_av1_webm_lag5_frames10
              aomenc_av1_webm_non_square_par
              aomenc_av1_webm_cdf_update_mode"

run_tests aomenc_verify_environment "${aomenc_tests}"
