Don't set aom_image fields iibaom encoder ignores Do not set the fields of the aom_image_t struct that are ignored by the libaom encoder: cp, tc, mc, csp, range, and monochrome. See https://aomedia-review.googlesource.com/c/aom/+/212221 Update the latest libaom version number in comments. Delete redundant or obsolete comments.
diff --git a/src/codec_aom.c b/src/codec_aom.c index beba54e..ec4a50a 100644 --- a/src/codec_aom.c +++ b/src/codec_aom.c
@@ -737,8 +737,8 @@ avifBool useLibavifDefaultTuneMetric = AVIF_FALSE; // If true, override libaom's default tune option. aom_tune_metric libavifDefaultTuneMetric = AOM_TUNE_PSNR; // Meaningless unless useLibavifDefaultTuneMetric. - // True if libavif knows that tune=iq is used, either by default by libavif, or explicitly set by the user. - // False otherwise (including if libaom uses tune=iq by default, which is not the case as of v3.13.1 and earlier versions). + // True if libavif knows that tune=iq is used, either set by libavif by default, or set by the user explicitly. + // False otherwise (including if libaom uses tune=iq by default, which is not the case as of v3.14.1 and earlier versions). avifBool useTuneIq; if (avifAOMOptionsContainExplicitTuning(codec, alpha, &useTuneIq)) { @@ -748,7 +748,7 @@ // because libaom will persist that setting until explicitly changed. if (quality == AVIF_QUALITY_LOSSLESS) { - // AOM_TUNE_IQ is not libaom's default tune option as of v3.13.1. + // AOM_TUNE_IQ is not libaom's default tune option as of v3.14.1. // Even if it was, it does not matter for lossless. useTuneIq = AVIF_FALSE; } else { @@ -939,6 +939,9 @@ cfg->g_threads = AVIF_MIN(encoder->maxThreads, 64); } + // Encode alpha as 4:0:0. + // AVIF specification, Section 4 "Auxiliary Image Items and Sequences": + // The mono_chrome field in the Sequence Header OBU shall be set to 1. if (alpha || (image->yuvFormat == AVIF_PIXEL_FORMAT_YUV400)) { cfg->monochrome = 1; } @@ -1050,15 +1053,6 @@ if (image->yuvRange != AVIF_RANGE_LIMITED) { aom_codec_control(&codec->internal->encoder, AV1E_SET_COLOR_RANGE, (int)image->yuvRange); } - - // Section 2.3.4 of AV1-ISOBMFF says 'colr' with 'nclx' should be present and shall match CICP - // values in the Sequence Header OBU, unless the latter has 2/2/2 (Unspecified). - // So set CICP values to 2/2/2 (Unspecified) in the Sequence Header OBU for simplicity. - // It may also save 3 bytes since the AV1 encoder can set color_description_present_flag to 0 - // (see Section 5.5.2 "Color config syntax" of the AV1 specification). - // libaom's defaults are AOM_CICP_CP_UNSPECIFIED, AOM_CICP_TC_UNSPECIFIED, and - // AOM_CICP_MC_UNSPECIFIED. No need to call aom_codec_control(). - // aom_image_t::cp, aom_image_t::tc and aom_image_t::mc are ignored by aom_codec_encode(). } #if defined(AOM_CTRL_AV1E_SET_SKIP_POSTPROC_FILTERING) @@ -1151,8 +1145,6 @@ aom_codec_control(&codec->internal->encoder, AV1E_SET_LOSSLESS, lossless); } if (encoderChanges & AVIF_ENCODER_CHANGE_CODEC_SPECIFIC) { - // Do not apply libavifDefaultTuneMetric even if useLibavifDefaultTuneMetric is true: - // codec-specific settings persist on the libaom side, so keep the same behavior for tune. if (!avifProcessAOMOptionsPostInit(codec, alpha)) { return AVIF_RESULT_INVALID_CODEC_SPECIFIC_OPTION; } @@ -1240,14 +1232,6 @@ } if (alpha) { - // AVIF specification, Section 4 "Auxiliary Image Items and Sequences": - // The color_range field in the Sequence Header OBU shall be set to 1. - aomImage.range = AOM_CR_FULL_RANGE; - - // AVIF specification, Section 4 "Auxiliary Image Items and Sequences": - // The mono_chrome field in the Sequence Header OBU shall be set to 1. - // Some encoders do not support 4:0:0 and encode alpha as 4:2:0 so it is not always respected. - aomImage.monochrome = 1; if (aomImageAllocated) { const uint32_t bytesPerRow = ((image->depth > 8) ? 2 : 1) * image->width; for (uint32_t j = 0; j < image->height; ++j) { @@ -1265,7 +1249,6 @@ int yuvPlaneCount = 3; if (image->yuvFormat == AVIF_PIXEL_FORMAT_YUV400) { yuvPlaneCount = 1; // Ignore UV planes when monochrome - aomImage.monochrome = 1; } if (aomImageAllocated) { uint32_t bytesPerPixel = (image->depth > 8) ? 2 : 1; @@ -1286,19 +1269,6 @@ aomImage.stride[yuvPlane] = image->yuvRowBytes[yuvPlane]; } } - - aomImage.cp = (aom_color_primaries_t)image->colorPrimaries; - aomImage.tc = (aom_transfer_characteristics_t)image->transferCharacteristics; - aomImage.mc = (aom_matrix_coefficients_t)image->matrixCoefficients; - // AVIF specification, Section 2.2.1. "AV1 Item Configuration Property": - // The values of the fields in the AV1CodecConfigurationBox shall match those - // of the Sequence Header OBU in the AV1 Image Item Data. - aomImage.csp = (aom_chroma_sample_position_t)image->yuvChromaSamplePosition; - - // AV1-ISOBMFF specification, Section 2.3.4: - // The value of full_range_flag in the 'colr' box SHALL match the color_range - // flag in the Sequence Header OBU. - aomImage.range = (aom_color_range_t)image->yuvRange; } aom_enc_frame_flags_t encodeFlags = 0;