Skip to content

Commit

Permalink
Read the first three bytes of mini box directly
Browse files Browse the repository at this point in the history
The first three bytes of the mini box can be read directly without
checking any condition.
  • Loading branch information
wantehchang committed Aug 10, 2024
1 parent d142df6 commit 273db56
Showing 1 changed file with 24 additions and 16 deletions.
40 changes: 24 additions & 16 deletions src/read.c
Original file line number Diff line number Diff line change
Expand Up @@ -3571,32 +3571,40 @@ static avifResult avifParseMinimizedImageBox(avifMeta * meta, uint64_t rawOffset

meta->fromMiniBox = AVIF_TRUE;

uint32_t version;
AVIF_CHECKERR(avifROStreamReadBits(&s, &version, 2), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(2) version;
uint8_t data[3];
AVIF_CHECKERR(avifROStreamRead(&s, data, 3), AVIF_RESULT_BMFF_PARSE_FAILED);

uint32_t version = (data[0] & 0xc0) >> 6; // bit(2) version;
AVIF_CHECKERR(version == 0, AVIF_RESULT_BMFF_PARSE_FAILED);

// flags
uint32_t hasExplicitCodecTypes, floatFlag, fullRange, hasAlpha, hasExplicitCicp, hasHdr, hasIcc, hasExif, hasXmp;
AVIF_CHECKERR(avifROStreamReadBits(&s, &hasExplicitCodecTypes, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) explicit_codec_types_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &floatFlag, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) float_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &fullRange, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) full_range_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &hasAlpha, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) alpha_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &hasExplicitCicp, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) explicit_cicp_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &hasHdr, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) hdr_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &hasIcc, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) icc_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &hasExif, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) exif_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &hasXmp, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) xmp_flag;
hasExplicitCodecTypes = (data[0] & 0x20) != 0; // bit(1) explicit_codec_types_flag;
floatFlag = (data[0] & 0x10) != 0; // bit(1) float_flag;
fullRange = (data[0] & 0x8) != 0; // bit(1) full_range_flag;
hasAlpha = (data[0] & 0x4) != 0; // bit(1) alpha_flag;
hasExplicitCicp = (data[0] & 0x2) != 0; // bit(1) explicit_cicp_flag;
hasHdr = (data[0] & 0x1) != 0; // bit(1) hdr_flag;
hasIcc = (data[1] & 0x80) != 0; // bit(1) icc_flag;
hasExif = (data[1] & 0x40) != 0; // bit(1) exif_flag;
hasXmp = (data[1] & 0x20) != 0; // bit(1) xmp_flag;

uint32_t chromaSubsampling, orientation;
AVIF_CHECKERR(avifROStreamReadBits(&s, &chromaSubsampling, 2), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(2) chroma_subsampling;
AVIF_CHECKERR(avifROStreamReadBits(&s, &orientation, 3), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(3) orientation_minus1;
chromaSubsampling = (data[1] & 0x18) >> 3; // bit(2) chroma_subsampling;
orientation = data[1] & 0x7; // bit(3) orientation_minus1;
++orientation;

// Spatial extents
uint32_t smallDimensionsFlag, width, height;
AVIF_CHECKERR(avifROStreamReadBits(&s, &smallDimensionsFlag, 1), AVIF_RESULT_BMFF_PARSE_FAILED); // bit(1) small_dimensions_flag;
AVIF_CHECKERR(avifROStreamReadBits(&s, &width, smallDimensionsFlag ? 7 : 15),
AVIF_RESULT_BMFF_PARSE_FAILED); // unsigned int(small_dimensions_flag ? 7 : 15) width_minus1;
smallDimensionsFlag = (data[2] & 0x80) != 0; // bit(1) small_dimensions_flag;
// unsigned int(small_dimensions_flag ? 7 : 15) width_minus1;
width = data[2];
if (smallDimensionsFlag) {
width &= 0x7f;
} else {
AVIF_CHECKERR(avifROStreamRead(&s, data, 1), AVIF_RESULT_BMFF_PARSE_FAILED);
width = (width << 8) + data[0];
}
++width;
AVIF_CHECKERR(avifROStreamReadBits(&s, &height, smallDimensionsFlag ? 7 : 15),
AVIF_RESULT_BMFF_PARSE_FAILED); // unsigned int(small_dimensions_flag ? 7 : 15) height_minus1;
Expand Down

0 comments on commit 273db56

Please sign in to comment.