Disable tests that may fail if the codec is not aom (#1176)
For example, the SVT-AV1 encoder requires 4:2:0 images with even
dimensions of at least 64x64 px.
Fix https://github.com/AOMediaCodec/libavif/issues/1174 and
https://github.com/AOMediaCodec/libavif/issues/1175.
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 099457d..a1ce2b1 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -117,6 +117,15 @@
target_include_directories(avify4mtest PRIVATE ${GTEST_INCLUDE_DIRS})
add_test(NAME avify4mtest COMMAND avify4mtest)
+ if(NOT AVIF_CODEC_AOM OR NOT AVIF_CODEC_AOM_ENCODE OR NOT AVIF_CODEC_AOM_DECODE)
+ # These tests are supported with aom being the encoder and decoder. If aom is unavailable,
+ # these tests are disabled because other codecs may not implement all the necessary features.
+ # For example, SVT-AV1 requires 4:2:0 images with even dimensions of at least 64x64 px.
+ set_tests_properties(avifallocationtest avifgridapitest avifmetadatatest avifincrtest PROPERTIES DISABLED True)
+
+ message(STATUS "Some tests are disabled because aom is unavailable for encoding or decoding.")
+ endif()
+
if(NOT libsharpyuv_FOUND)
message(STATUS "Some tests are skipped because libsharpyuv is unavailable.")
endif()
@@ -135,4 +144,22 @@
add_test(NAME test_cmd COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd.sh ${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/data
)
+ add_test(NAME test_cmd_lossless COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_lossless.sh ${CMAKE_BINARY_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/data
+ )
+ add_test(NAME test_cmd_metadata COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_metadata.sh ${CMAKE_BINARY_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/data
+ )
+
+ if(NOT AVIF_CODEC_AOM OR NOT AVIF_CODEC_AOM_ENCODE)
+ # Only aom encoder supports lossless encoding.
+ set_property(TEST test_cmd_lossless PROPERTY DISABLED True)
+
+ # SVT-AV1 does not support the images with odd dimensions that are used in this test.
+ if(NOT AVIF_CODEC_RAV1E)
+ set_property(TEST test_cmd_metadata PROPERTY DISABLED True)
+ endif()
+
+ message(STATUS "Some tests are disabled because aom is unavailable for encoding.")
+ endif()
endif()
diff --git a/tests/test_cmd.sh b/tests/test_cmd.sh
index 3fcb886..0fd67b3 100755
--- a/tests/test_cmd.sh
+++ b/tests/test_cmd.sh
@@ -47,20 +47,15 @@
# Input file paths.
INPUT_Y4M="${TESTDATA_DIR}/kodim03_yuv420_8bpc.y4m"
-INPUT_PNG="${TESTDATA_DIR}/paris_icc_exif_xmp.png"
-INPUT_JPG="${TESTDATA_DIR}/paris_exif_xmp_icc.jpg"
# Output file names.
ENCODED_FILE="avif_test_cmd_encoded.avif"
-ENCODED_FILE_NO_METADATA="avif_test_cmd_encoded_no_metadata.avif"
ENCODED_FILE_WITH_DASH="-avif_test_cmd_encoded.avif"
DECODED_FILE="avif_test_cmd_decoded.png"
-DECODED_FILE_LOSSLESS="avif_test_cmd_decoded_lossless.png"
# Cleanup
cleanup() {
pushd ${TMP_DIR}
- rm -- "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" \
- "${ENCODED_FILE_WITH_DASH}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}"
+ rm -- "${ENCODED_FILE}" "${ENCODED_FILE_WITH_DASH}" "${DECODED_FILE}"
popd
}
trap cleanup EXIT
@@ -72,33 +67,13 @@
"${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE}"
"${ARE_IMAGES_EQUAL}" "${INPUT_Y4M}" "${DECODED_FILE}" 0 && exit 1
- # Lossless test. The decoded pixels should be the same as the original image.
- echo "Testing basic lossless"
- # TODO(yguyon): Make this test pass with INPUT_PNG instead of DECODED_FILE.
- "${AVIFENC}" -s 10 -l "${DECODED_FILE}" -o "${ENCODED_FILE}"
- "${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE_LOSSLESS}"
- "${ARE_IMAGES_EQUAL}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}" 0
-
# Argument parsing test with filenames starting with a dash.
echo "Testing arguments"
- "${AVIFENC}" -s 10 "${INPUT_PNG}" -- "${ENCODED_FILE_WITH_DASH}"
+ "${AVIFENC}" -s 10 "${INPUT_Y4M}" -- "${ENCODED_FILE_WITH_DASH}"
"${AVIFDEC}" --info -- "${ENCODED_FILE_WITH_DASH}"
# Passing a filename starting with a dash without using -- should fail.
- "${AVIFENC}" -s 10 "${INPUT_PNG}" "${ENCODED_FILE_WITH_DASH}" && exit 1
+ "${AVIFENC}" -s 10 "${INPUT_Y4M}" "${ENCODED_FILE_WITH_DASH}" && exit 1
"${AVIFDEC}" --info "${ENCODED_FILE_WITH_DASH}" && exit 1
-
- # Metadata test.
- echo "Testing metadata enc/dec"
- for INPUT in "${INPUT_PNG}" "${INPUT_JPG}"; do
- "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE}"
- # Ignoring a metadata chunk should produce a different output file.
- "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-icc
- cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
- "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-exif
- cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
- "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-xmp
- cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
- done
popd
exit 0
diff --git a/tests/test_cmd_lossless.sh b/tests/test_cmd_lossless.sh
new file mode 100755
index 0000000..bf0aa5d
--- /dev/null
+++ b/tests/test_cmd_lossless.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+# Copyright 2022 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 (lossless)
+
+# Very verbose but useful for debugging.
+set -ex
+
+if [[ "$#" -ge 1 ]]; then
+ # eval so that the passed in directory can contain variables.
+ BINARY_DIR="$(eval echo "$1")"
+else
+ # Assume "tests" is the current directory.
+ BINARY_DIR="$(pwd)/.."
+fi
+if [[ "$#" -ge 2 ]]; then
+ TESTDATA_DIR="$(eval echo "$2")"
+else
+ TESTDATA_DIR="$(pwd)/data"
+fi
+if [[ "$#" -ge 3 ]]; then
+ TMP_DIR="$(eval echo "$3")"
+else
+ TMP_DIR="$(mktemp -d)"
+fi
+
+AVIFENC="${BINARY_DIR}/avifenc"
+AVIFDEC="${BINARY_DIR}/avifdec"
+ARE_IMAGES_EQUAL="${BINARY_DIR}/tests/are_images_equal"
+
+# Input file paths.
+INPUT_PNG="${TESTDATA_DIR}/paris_icc_exif_xmp.png"
+# Output file names.
+ENCODED_FILE="avif_test_cmd_lossless_encoded.avif"
+DECODED_FILE="avif_test_cmd_lossless_decoded.png"
+DECODED_FILE_LOSSLESS="avif_test_cmd_lossless_decoded_lossless.png"
+
+# Cleanup
+cleanup() {
+ pushd ${TMP_DIR}
+ rm -- "${ENCODED_FILE}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}"
+ popd
+}
+trap cleanup EXIT
+
+pushd ${TMP_DIR}
+ # Generate test data.
+ "${AVIFENC}" -s 8 "${INPUT_PNG}" -o "${ENCODED_FILE}"
+ "${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE}"
+
+ # Lossless test. The decoded pixels should be the same as the original image.
+ echo "Testing basic lossless"
+ # TODO(yguyon): Make this test pass with INPUT_PNG instead of DECODED_FILE.
+ "${AVIFENC}" -s 10 -l "${DECODED_FILE}" -o "${ENCODED_FILE}"
+ "${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE_LOSSLESS}"
+ "${ARE_IMAGES_EQUAL}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}" 0
+popd
+
+exit 0
diff --git a/tests/test_cmd_metadata.sh b/tests/test_cmd_metadata.sh
new file mode 100755
index 0000000..87cbe6a
--- /dev/null
+++ b/tests/test_cmd_metadata.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+# Copyright 2022 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 (metadata)
+
+# Very verbose but useful for debugging.
+set -ex
+
+if [[ "$#" -ge 1 ]]; then
+ # eval so that the passed in directory can contain variables.
+ BINARY_DIR="$(eval echo "$1")"
+else
+ # Assume "tests" is the current directory.
+ BINARY_DIR="$(pwd)/.."
+fi
+if [[ "$#" -ge 2 ]]; then
+ TESTDATA_DIR="$(eval echo "$2")"
+else
+ TESTDATA_DIR="$(pwd)/data"
+fi
+if [[ "$#" -ge 3 ]]; then
+ TMP_DIR="$(eval echo "$3")"
+else
+ TMP_DIR="$(mktemp -d)"
+fi
+
+AVIFENC="${BINARY_DIR}/avifenc"
+
+# Input file paths.
+INPUT_PNG="${TESTDATA_DIR}/paris_icc_exif_xmp.png"
+INPUT_JPG="${TESTDATA_DIR}/paris_exif_xmp_icc.jpg"
+# Output file names.
+ENCODED_FILE="avif_test_cmd_metadata_encoded.avif"
+ENCODED_FILE_NO_METADATA="avif_test_cmd_metadata_encoded_no_metadata.avif"
+
+# Cleanup
+cleanup() {
+ pushd ${TMP_DIR}
+ rm -- "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}"
+ popd
+}
+trap cleanup EXIT
+
+pushd ${TMP_DIR}
+ # Metadata test.
+ echo "Testing metadata enc"
+ for INPUT in "${INPUT_PNG}" "${INPUT_JPG}"; do
+ "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE}"
+ # Ignoring a metadata chunk should produce a different output file.
+ "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-icc
+ cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
+ "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-exif
+ cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
+ "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-xmp
+ cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
+ done
+popd
+
+exit 0