@@ -155,7 +155,7 @@ avifResult WriteAvifGrid(const avifImage* image, int grid_cols, int grid_rows,
155155
156156avifResult ReadImage (avifImage* image, const std::string& input_filename,
157157 avifPixelFormat requested_format, uint32_t requested_depth,
158- bool ignore_profile) {
158+ bool ignore_profile, bool ignore_gain_map ) {
159159 avifAppFileFormat input_format = avifGuessFileFormat (input_filename.c_str ());
160160 if (input_format == AVIF_APP_FILE_FORMAT_UNKNOWN) {
161161 std::cerr << " Cannot determine input format: " << input_filename;
@@ -165,10 +165,21 @@ avifResult ReadImage(avifImage* image, const std::string& input_filename,
165165 if (decoder == nullptr ) {
166166 return AVIF_RESULT_OUT_OF_MEMORY;
167167 }
168+ if (!ignore_gain_map) {
169+ decoder->imageContentToDecode |= AVIF_IMAGE_CONTENT_GAIN_MAP;
170+ }
168171 avifResult result = ReadAvif (decoder.get (), input_filename, ignore_profile);
169172 if (result != AVIF_RESULT_OK) {
170173 return result;
171174 }
175+ if (ignore_gain_map && decoder->image ->gainMap ) {
176+ avifGainMapDestroy (decoder->image ->gainMap );
177+ decoder->image ->gainMap = nullptr ;
178+ }
179+ const avifColorPrimaries in_primaries = image->colorPrimaries ;
180+ const avifTransferCharacteristics in_transfer =
181+ image->transferCharacteristics ;
182+ const avifMatrixCoefficients in_matrix = image->matrixCoefficients ;
172183 if (decoder->image ->imageOwnsYUVPlanes &&
173184 (decoder->image ->alphaPlane == nullptr ||
174185 decoder->image ->imageOwnsAlphaPlane )) {
@@ -179,26 +190,37 @@ avifResult ReadImage(avifImage* image, const std::string& input_filename,
179190 return result;
180191 }
181192 }
193+ if (in_primaries != AVIF_COLOR_PRIMARIES_UNSPECIFIED ||
194+ in_transfer != AVIF_TRANSFER_CHARACTERISTICS_UNSPECIFIED ||
195+ in_matrix != AVIF_MATRIX_COEFFICIENTS_UNSPECIFIED) {
196+ image->colorPrimaries = in_primaries;
197+ image->transferCharacteristics = in_transfer;
198+ image->matrixCoefficients = in_matrix;
199+ }
182200 } else {
183201 const avifAppFileFormat file_format = avifReadImage (
184202 input_filename.c_str (), AVIF_APP_FILE_FORMAT_UNKNOWN /* guess format */ ,
185203 requested_format, static_cast <int >(requested_depth),
186204 AVIF_CHROMA_DOWNSAMPLING_AUTOMATIC, ignore_profile,
187- /* ignoreExif=*/ false , /* ignoreXMP=*/ false ,
188- /* ignoreGainMap= */ true , AVIF_DEFAULT_IMAGE_SIZE_LIMIT, image,
205+ /* ignoreExif=*/ false , /* ignoreXMP=*/ false , ignore_gain_map,
206+ AVIF_DEFAULT_IMAGE_SIZE_LIMIT, image,
189207 /* outDepth=*/ nullptr ,
190208 /* sourceTiming=*/ nullptr , /* frameIter=*/ nullptr );
191209 if (file_format == AVIF_APP_FILE_FORMAT_UNKNOWN) {
192210 std::cout << " Failed to decode image: " << input_filename;
193211 return AVIF_RESULT_INVALID_ARGUMENT;
194212 }
195- if (image->icc .size == 0 ) {
196- // Assume sRGB by default.
197- if (image->colorPrimaries == AVIF_COLOR_PRIMARIES_UNSPECIFIED &&
198- image->transferCharacteristics == AVIF_COLOR_PRIMARIES_UNSPECIFIED) {
199- image->colorPrimaries = AVIF_COLOR_PRIMARIES_SRGB;
200- image->transferCharacteristics = AVIF_TRANSFER_CHARACTERISTICS_SRGB;
201- }
213+ // Assume sRGB by default.
214+ if (image->icc .size == 0 &&
215+ image->colorPrimaries == AVIF_COLOR_PRIMARIES_UNSPECIFIED &&
216+ image->transferCharacteristics == AVIF_COLOR_PRIMARIES_UNSPECIFIED) {
217+ image->colorPrimaries = AVIF_COLOR_PRIMARIES_SRGB;
218+ image->transferCharacteristics = AVIF_TRANSFER_CHARACTERISTICS_SRGB;
219+ }
220+ if (image->matrixCoefficients == AVIF_MATRIX_COEFFICIENTS_UNSPECIFIED) {
221+ // Explicitly set the default matrix coefficient, see
222+ // avifCalcYUVCoefficients().
223+ image->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_BT601;
202224 }
203225 }
204226 return AVIF_RESULT_OK;
0 commit comments