#!/bin/bash
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ------------------------------------------------------------------------------
#
# tests for command lines (--target-size)

source $(dirname "$0")/cmd_test_common.sh || exit

# Input file paths.
INPUT_Y4M="${TESTDATA_DIR}/kodim03_yuv420_8bpc.y4m"
# Output file names.
ENCODED_FILE="avif_test_cmd_targetsize_encoded.avif"
DECODED_SMALLEST_FILE="avif_test_cmd_targetsize_decoded_smallest.png"
DECODED_BIGGEST_FILE="avif_test_cmd_targetsize_decoded_biggest.png"

# Cleanup
cleanup() {
  pushd ${TMP_DIR}
    rm -f -- "${ENCODED_FILE}" "${DECODED_SMALLEST_FILE}" \
             "${DECODED_BIGGEST_FILE}"
  popd
}
trap cleanup EXIT

pushd ${TMP_DIR}
  "${AVIFENC}" -s 8 "${INPUT_Y4M}" -o "${ENCODED_FILE}"
  DEFAULT_QUALITY_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  "${AVIFENC}" -s 8 "${INPUT_Y4M}" -o "${ENCODED_FILE}" --target-size 0
  "${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_SMALLEST_FILE}"
  SMALLEST_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  "${AVIFENC}" -s 8 "${INPUT_Y4M}" -o "${ENCODED_FILE}" --target-size 999999999
  "${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_BIGGEST_FILE}"
  BIGGEST_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  [[ ${SMALLEST_FILE_SIZE} -lt ${DEFAULT_QUALITY_FILE_SIZE} ]] || exit 1
  [[ ${DEFAULT_QUALITY_FILE_SIZE} -lt ${BIGGEST_FILE_SIZE} ]] || exit 1

  # Check that min/max file sizes match lowest/highest qualities.
  "${AVIFENC}" -s 8 "${INPUT_Y4M}" -o "${ENCODED_FILE}" -q 0
  [[ $(wc -c < "${ENCODED_FILE}") -eq ${SMALLEST_FILE_SIZE} ]] || exit 1
  "${AVIFENC}" -s 8 "${INPUT_Y4M}" -o "${ENCODED_FILE}" -q 100
  [[ $(wc -c < "${ENCODED_FILE}") -eq ${BIGGEST_FILE_SIZE} ]] || exit 1
  # Negative test.
  [[ $(wc -c < "${ENCODED_FILE}") -eq ${SMALLEST_FILE_SIZE} ]] && exit 1

  # Same as above but with a grid made of two tiles.
  TILE0="${DECODED_SMALLEST_FILE}"
  TILE1="${DECODED_BIGGEST_FILE}"

  "${AVIFENC}" -s 9 --grid 2x1 "${TILE0}" "${TILE1}" -o "${ENCODED_FILE}"
  DEFAULT_QUALITY_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  "${AVIFENC}" -s 9 --grid 2x1 "${TILE0}" "${TILE1}" -o "${ENCODED_FILE}" --target-size 0
  SMALLEST_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  "${AVIFENC}" -s 9 --grid 2x1 "${TILE0}" "${TILE1}" -o "${ENCODED_FILE}" --target-size 999999999
  BIGGEST_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  [[ ${SMALLEST_FILE_SIZE} -lt ${DEFAULT_QUALITY_FILE_SIZE} ]] || exit 1
  [[ ${DEFAULT_QUALITY_FILE_SIZE} -lt ${BIGGEST_FILE_SIZE} ]] || exit 1

  # The remaining tests in this file use animations that may trigger segmentation faults
  # with libaom versions older than 3.6.0. Skip the tests if that is the case.
  # The grep and cut commands are not pretty but seem to work on most platforms.
  if "${AVIFENC}" -V | grep -o "aom" --quiet; then
    AOM_VERSION=$("${AVIFENC}" -V | grep -o "aom[^,]*[0-9]*\.")     # "aom [enc/dec]:X.Y."
    AOM_VERSION=$(echo "${AOM_VERSION}" | cut -d ":" -f 2)          # "X.Y" maybe prepended by a 'v'
    AOM_VERSION=$(echo "${AOM_VERSION}" | grep -o "[0-9]*\.[0-9]*") # "X.Y"
    AOM_MAJOR_VERSION=$(echo "${AOM_VERSION}" | cut -d "." -f 1)
    AOM_MINOR_VERSION=$(echo "${AOM_VERSION}" | cut -d "." -f 2)
    [[ ${AOM_MAJOR_VERSION} -ge 3 ]] || exit 0 # older than 3.0.0
    [[ ${AOM_MAJOR_VERSION} -ge 4 ]] || [[ ${AOM_MINOR_VERSION} -ge 6 ]] || exit 0 # older than 3.5.0
  fi

  # Same as above but with an animation made of two frames.
  FRAME0="${DECODED_SMALLEST_FILE}"
  FRAME1="${DECODED_BIGGEST_FILE}"

  "${AVIFENC}" -s 9 "${FRAME0}" "${FRAME1}" -o "${ENCODED_FILE}"
  DEFAULT_QUALITY_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  "${AVIFENC}" -s 9 "${FRAME0}" "${FRAME1}" -o "${ENCODED_FILE}" --target-size 0
  SMALLEST_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  "${AVIFENC}" -s 9 "${FRAME0}" "${FRAME1}" -o "${ENCODED_FILE}" --target-size 999999999
  BIGGEST_FILE_SIZE=$(wc -c < "${ENCODED_FILE}")

  [[ ${SMALLEST_FILE_SIZE} -lt ${DEFAULT_QUALITY_FILE_SIZE} ]] || exit 1
  [[ ${DEFAULT_QUALITY_FILE_SIZE} -lt ${BIGGEST_FILE_SIZE} ]] || exit 1
popd

exit 0
