@@ -3957,13 +3957,13 @@ static avifResult avifParseMinimizedImageBox(avifDecoderData * data,
39573957 ++ orientation ;
39583958
39593959 // Spatial extents
3960- uint32_t smallDimensionsFlag , width , height ;
3961- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & smallDimensionsFlag , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) small_dimensions_flag;
3962- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & width , smallDimensionsFlag ? 7 : 15 ),
3963- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(small_dimensions_flag ? 7 : 15 ) width_minus1;
3960+ uint32_t largeDimensionsFlag , width , height ;
3961+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & largeDimensionsFlag , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) small_dimensions_flag;
3962+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & width , largeDimensionsFlag ? 15 : 7 ),
3963+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_dimensions_flag ? 15 : 7 ) width_minus1;
39643964 ++ width ;
3965- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & height , smallDimensionsFlag ? 7 : 15 ),
3966- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(small_dimensions_flag ? 7 : 15 ) height_minus1;
3965+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & height , largeDimensionsFlag ? 15 : 7 ),
3966+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_dimensions_flag ? 15 : 7 ) height_minus1;
39673967 ++ height ;
39683968
39693969 // Pixel information
@@ -4067,11 +4067,11 @@ static avifResult avifParseMinimizedImageBox(avifDecoderData * data,
40674067 AVIF_CHECKERR (brand != NULL , AVIF_RESULT_OUT_OF_MEMORY );
40684068 memcpy (brand , "tmap" , sizeof (avifBrand ));
40694069
4070- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapWidth , smallDimensionsFlag ? 7 : 15 ),
4071- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(small_dimensions_flag ? 7 : 15 ) gainmap_width_minus1;
4070+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapWidth , largeDimensionsFlag ? 15 : 7 ),
4071+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_dimensions_flag ? 15 : 7 ) gainmap_width_minus1;
40724072 ++ gainmapWidth ;
4073- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapHeight , smallDimensionsFlag ? 7 : 15 ),
4074- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(small_dimensions_flag ? 7 : 15 ) gainmap_height_minus1;
4073+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapHeight , largeDimensionsFlag ? 15 : 7 ),
4074+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_dimensions_flag ? 15 : 7 ) gainmap_height_minus1;
40754075 ++ gainmapHeight ;
40764076 AVIF_CHECKERR (avifROStreamReadBitsU8 (& s , & gainmapMatrixCoefficients , 8 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(8) gainmap_matrix_coefficients;
40774077 AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapFullRange , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) gainmap_full_range_flag;
@@ -4125,65 +4125,71 @@ static avifResult avifParseMinimizedImageBox(avifDecoderData * data,
41254125 }
41264126
41274127 // Chunk sizes
4128- uint32_t fewMetadataBytesFlag = 0 , fewCodecConfigBytesFlag = 0 , fewItemDataBytesFlag = 0 ;
4128+ uint32_t largeMetadataFlag = 0 , largeCodecConfigFlag = 0 , largeItemDataFlag = 0 ;
41294129 if (hasIcc || hasExif || hasXmp || (hasHdr && hasGainmap )) {
4130- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & fewMetadataBytesFlag , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) few_metadata_bytes_flag ;
4130+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & largeMetadataFlag , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) large_metadata_flag ;
41314131 }
4132- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & fewCodecConfigBytesFlag , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) few_codec_config_bytes_flag ;
4133- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & fewItemDataBytesFlag , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) few_item_data_bytes_flag ;
4132+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & largeCodecConfigFlag , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) large_codec_config_flag ;
4133+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & largeItemDataFlag , 1 ), AVIF_RESULT_BMFF_PARSE_FAILED ); // bit(1) large_item_data_flag ;
41344134
41354135 uint32_t iccDataSize = 0 ;
41364136 if (hasIcc ) {
4137- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & iccDataSize , fewMetadataBytesFlag ? 10 : 20 ),
4138- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_metadata_bytes_flag ? 10 : 20 ) icc_data_size_minus1;
4137+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & iccDataSize , largeMetadataFlag ? 20 : 10 ),
4138+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_metadata_flag ? 20 : 10 ) icc_data_size_minus1;
41394139 ++ iccDataSize ;
41404140 }
41414141 uint32_t tmapIccDataSize = 0 ;
41424142 if (hasHdr && hasGainmap && tmapHasIcc ) {
4143- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & tmapIccDataSize , fewMetadataBytesFlag ? 10 : 20 ),
4144- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_metadata_bytes_flag ? 10 : 20 ) tmap_icc_data_size_minus1;
4143+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & tmapIccDataSize , largeMetadataFlag ? 20 : 10 ),
4144+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_metadata_flag ? 20 : 10 ) tmap_icc_data_size_minus1;
41454145 ++ tmapIccDataSize ;
41464146 }
41474147
41484148 uint32_t gainmapMetadataSize = 0 , gainmapItemDataSize = 0 , gainmapItemCodecConfigSize = 0 ;
41494149 if (hasHdr && hasGainmap ) {
4150- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapMetadataSize , fewMetadataBytesFlag ? 10 : 20 ),
4151- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_metadata_bytes_flag ? 10 : 20 ) gainmap_metadata_size;
4152- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapItemDataSize , fewItemDataBytesFlag ? 15 : 28 ),
4153- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_item_data_bytes_flag ? 15 : 28 ) gainmap_item_data_size;
4150+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapMetadataSize , largeMetadataFlag ? 20 : 10 ),
4151+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_metadata_flag ? 20 : 10 ) gainmap_metadata_size;
4152+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapItemDataSize , largeItemDataFlag ? 28 : 15 ),
4153+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_item_data_flag ? 28 : 15 ) gainmap_item_data_size;
41544154 if (gainmapItemDataSize > 0 ) {
4155- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapItemCodecConfigSize , fewCodecConfigBytesFlag ? 3 : 12 ),
4156- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_codec_config_bytes_flag ? 3 : 12 ) gainmap_item_codec_config_size;
4155+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & gainmapItemCodecConfigSize , largeCodecConfigFlag ? 12 : 3 ),
4156+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_codec_config_flag ? 12 : 3 ) gainmap_item_codec_config_size;
41574157 }
41584158 }
41594159
41604160 uint32_t mainItemCodecConfigSize , mainItemDataSize ;
4161- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & mainItemCodecConfigSize , fewCodecConfigBytesFlag ? 3 : 12 ),
4162- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_codec_config_bytes_flag ? 3 : 12 ) main_item_codec_config_size;
4163- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & mainItemDataSize , fewItemDataBytesFlag ? 15 : 28 ),
4164- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_item_data_bytes_flag ? 15 : 28 ) main_item_data_size_minus1;
4161+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & mainItemCodecConfigSize , largeCodecConfigFlag ? 12 : 3 ),
4162+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_codec_config_flag ? 12 : 3 ) main_item_codec_config_size;
4163+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & mainItemDataSize , largeItemDataFlag ? 28 : 15 ),
4164+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_item_data_flag ? 28 : 15 ) main_item_data_size_minus1;
41654165 ++ mainItemDataSize ;
41664166
41674167 uint32_t alphaItemCodecConfigSize = 0 , alphaItemDataSize = 0 ;
41684168 if (hasAlpha ) {
4169- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & alphaItemDataSize , fewItemDataBytesFlag ? 15 : 28 ),
4170- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_item_data_bytes_flag ? 15 : 28 ) alpha_item_data_size;
4169+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & alphaItemDataSize , largeItemDataFlag ? 28 : 15 ),
4170+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_item_data_flag ? 28 : 15 ) alpha_item_data_size;
41714171 }
41724172 if (hasAlpha && alphaItemDataSize != 0 ) {
4173- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & alphaItemCodecConfigSize , fewCodecConfigBytesFlag ? 3 : 12 ),
4174- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_codec_config_bytes_flag ? 3 : 12 ) alpha_item_codec_config_size;
4173+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & alphaItemCodecConfigSize , largeCodecConfigFlag ? 12 : 3 ),
4174+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_codec_config_flag ? 12 : 3 ) alpha_item_codec_config_size;
41754175 }
41764176
4177+ if (hasExif || hasXmp ) {
4178+ uint8_t exifXmpCompressedFlag ;
4179+ AVIF_CHECKERR (avifROStreamReadBitsU8 (& s , & exifXmpCompressedFlag , 1 ),
4180+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(1) exif_xmp_compressed_flag;
4181+ AVIF_CHECKERR (!exifXmpCompressedFlag , AVIF_RESULT_NOT_IMPLEMENTED );
4182+ }
41774183 uint32_t exifDataSize = 0 ;
41784184 if (hasExif ) {
4179- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & exifDataSize , fewMetadataBytesFlag ? 10 : 20 ),
4180- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_metadata_bytes_flag ? 10 : 20 ) exif_data_size_minus_one;
4185+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & exifDataSize , largeMetadataFlag ? 20 : 10 ),
4186+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_metadata_flag ? 20 : 10 ) exif_data_size_minus_one;
41814187 ++ exifDataSize ;
41824188 }
41834189 uint32_t xmpDataSize = 0 ;
41844190 if (hasXmp ) {
4185- AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & xmpDataSize , fewMetadataBytesFlag ? 10 : 20 ),
4186- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(few_metadata_bytes_flag ? 10 : 20 ) xmp_data_size_minus_one;
4191+ AVIF_CHECKERR (avifROStreamReadBitsU32 (& s , & xmpDataSize , largeMetadataFlag ? 20 : 10 ),
4192+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(large_metadata_flag ? 20 : 10 ) xmp_data_size_minus_one;
41874193 ++ xmpDataSize ;
41884194 }
41894195
@@ -4195,22 +4201,32 @@ static avifResult avifParseMinimizedImageBox(avifDecoderData * data,
41954201 }
41964202
41974203 // Codec configuration ('av1C' always uses 4 bytes)
4198- avifCodecConfigurationBox alphaItemCodecConfig = { 0 };
4199- if (hasAlpha && alphaItemDataSize != 0 && alphaItemCodecConfigSize != 0 ) {
4200- AVIF_CHECKERR (alphaItemCodecConfigSize == 4 , AVIF_RESULT_BMFF_PARSE_FAILED );
4201- AVIF_CHECKERR (avifParseCodecConfiguration (& s , & alphaItemCodecConfig , (const char * )codecConfigType , diag ),
4202- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(8) alpha_item_codec_config[alpha_item_codec_config_size];
4203- }
4204- avifCodecConfigurationBox gainmapItemCodecConfig = { 0 };
4205- if (hasHdr && hasGainmap && gainmapItemCodecConfigSize != 0 ) {
4206- AVIF_CHECKERR (gainmapItemCodecConfigSize == 4 , AVIF_RESULT_BMFF_PARSE_FAILED );
4207- AVIF_CHECKERR (avifParseCodecConfiguration (& s , & gainmapItemCodecConfig , (const char * )codecConfigType , diag ),
4208- AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(8) gainmap_item_codec_config[gainmap_item_codec_config_size];
4209- }
42104204 avifCodecConfigurationBox mainItemCodecConfig ;
42114205 AVIF_CHECKERR (mainItemCodecConfigSize == 4 , AVIF_RESULT_BMFF_PARSE_FAILED );
42124206 AVIF_CHECKERR (avifParseCodecConfiguration (& s , & mainItemCodecConfig , (const char * )codecConfigType , diag ),
42134207 AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(8) main_item_codec_config[main_item_codec_config_size];
4208+ avifCodecConfigurationBox alphaItemCodecConfig = { 0 };
4209+ if (hasAlpha && alphaItemDataSize != 0 ) {
4210+ if (alphaItemCodecConfigSize == 0 ) {
4211+ alphaItemCodecConfigSize = mainItemCodecConfigSize ;
4212+ alphaItemCodecConfig = mainItemCodecConfig ;
4213+ } else {
4214+ AVIF_CHECKERR (alphaItemCodecConfigSize == 4 , AVIF_RESULT_BMFF_PARSE_FAILED );
4215+ AVIF_CHECKERR (avifParseCodecConfiguration (& s , & alphaItemCodecConfig , (const char * )codecConfigType , diag ),
4216+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(8) alpha_item_codec_config[alpha_item_codec_config_size];
4217+ }
4218+ }
4219+ avifCodecConfigurationBox gainmapItemCodecConfig = { 0 };
4220+ if (hasHdr && hasGainmap ) {
4221+ if (gainmapItemCodecConfigSize == 0 ) {
4222+ gainmapItemCodecConfigSize = mainItemCodecConfigSize ;
4223+ gainmapItemCodecConfig = mainItemCodecConfig ;
4224+ } else {
4225+ AVIF_CHECKERR (gainmapItemCodecConfigSize == 4 , AVIF_RESULT_BMFF_PARSE_FAILED );
4226+ AVIF_CHECKERR (avifParseCodecConfiguration (& s , & gainmapItemCodecConfig , (const char * )codecConfigType , diag ),
4227+ AVIF_RESULT_BMFF_PARSE_FAILED ); // unsigned int(8) gainmap_item_codec_config[gainmap_item_codec_config_size];
4228+ }
4229+ }
42144230
42154231 // Make sure all metadata and coded chunks fit into the 'meta' box whose size is rawLen.
42164232 // There should be no missing nor unused byte.
0 commit comments