Fix lossless codec check in avifenc
Otherwise using --lossless without aom will fail with the misleading
error status AVIF_RESULT_NO_CODEC_AVAILABLE.
Remove redundant aom lossless check below.
Also fix avifCodecName() usage in avifEncodeImagesFixedQuality()
because it could lead to printing a null pointer as a string when
there is no codec available.
diff --git a/apps/avifenc.c b/apps/avifenc.c
index 8799f8e..0b4ba99 100644
--- a/apps/avifenc.c
+++ b/apps/avifenc.c
@@ -818,8 +818,9 @@
char manualTilingStr[128];
snprintf(manualTilingStr, sizeof(manualTilingStr), "tileRowsLog2 [%d], tileColsLog2 [%d]", settings->tileRowsLog2, settings->tileColsLog2);
+ const char * const codecName = avifCodecName(settings->codecChoice, AVIF_CODEC_FLAG_CAN_ENCODE);
printf("Encoding with AV1 codec '%s' speed [%d], color quality [%d (%s)], alpha quality [%d (%s)], %s, %d worker thread(s), please wait...\n",
- avifCodecName(settings->codecChoice, AVIF_CODEC_FLAG_CAN_ENCODE),
+ codecName ? codecName : "none",
settings->speed,
settings->quality,
qualityString(settings->quality),
@@ -1464,14 +1465,13 @@
}
settings.minQuantizer = settings.maxQuantizer = settings.minQuantizerAlpha = settings.maxQuantizerAlpha = AVIF_QUANTIZER_LOSSLESS;
// Codec.
- if (settings.codecChoice == AVIF_CODEC_CHOICE_RAV1E) {
+ const char * codecName = avifCodecName(settings.codecChoice, AVIF_CODEC_FLAG_CAN_ENCODE);
+ if (codecName && !strcmp(codecName, "rav1e")) {
fprintf(stderr, "rav1e doesn't support lossless encoding yet: https://github.com/xiph/rav1e/issues/151\n");
returnCode = 1;
- } else if (settings.codecChoice == AVIF_CODEC_CHOICE_SVT) {
+ } else if (codecName && !strcmp(codecName, "svt")) {
fprintf(stderr, "SVT-AV1 doesn't support lossless encoding yet: https://gitlab.com/AOMediaCodec/SVT-AV1/-/issues/1636\n");
returnCode = 1;
- } else if (settings.codecChoice == AVIF_CODEC_CHOICE_AUTO) {
- settings.codecChoice = AVIF_CODEC_CHOICE_AOM;
}
// Range.
if (requestedRange != AVIF_RANGE_FULL) {
@@ -1693,11 +1693,6 @@
image->imir.mode = imirMode;
}
- avifBool usingAOM = AVIF_FALSE;
- const char * codecName = avifCodecName(settings.codecChoice, AVIF_CODEC_FLAG_CAN_ENCODE);
- if (codecName && !strcmp(codecName, "aom")) {
- usingAOM = AVIF_TRUE;
- }
avifBool hasAlpha = (image->alphaPlane && image->alphaRowBytes);
avifBool usingLosslessColor = (settings.quality == AVIF_QUALITY_LOSSLESS);
avifBool usingLosslessAlpha = (settings.qualityAlpha == AVIF_QUALITY_LOSSLESS);
@@ -1716,11 +1711,6 @@
// Check for any reasons lossless will fail, and complain loudly
if (lossless) {
- if (!usingAOM) {
- fprintf(stderr, "WARNING: [--lossless] Only aom (-c) supports lossless transforms. Output might not be lossless.\n");
- lossless = AVIF_FALSE;
- }
-
if (!usingLosslessColor) {
fprintf(stderr,
"WARNING: [--lossless] Color quality (-q or --qcolor) not set to %d. Color output might not be lossless.\n",
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 3c46aa7..f08c896 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -222,7 +222,7 @@
)
if(NOT AVIF_CODEC_AOM OR NOT AVIF_CODEC_AOM_ENCODE)
- # Only aom encoder supports lossless encoding.
+ # Only aom encoder supports AV1 lossless encoding.
set_property(TEST test_cmd_animation PROPERTY DISABLED True)
set_property(TEST test_cmd_lossless PROPERTY DISABLED True)
@@ -231,7 +231,7 @@
set_property(TEST test_cmd_metadata PROPERTY DISABLED True)
endif()
- # Only aom encoder supports progressive encoding.
+ # Only aom encoder supports AV1 progressive encoding.
set_property(TEST test_cmd_progressive PROPERTY DISABLED True)
message(STATUS "Some tests are disabled because aom is unavailable for encoding.")