Revert "Simpler itemID finding for alpha. (#1974)"
This reverts commit 5ff8f49de0537fd9c6ec23fa7489b435a5e07b32.
BUG=chromium:323735410
diff --git a/src/read.c b/src/read.c
index dfaa20e..c879024 100644
--- a/src/read.c
+++ b/src/read.c
@@ -770,7 +770,7 @@
avifFree(meta);
}
-static avifDecoderItem * avifMetaFindItem(avifMeta * meta, uint32_t itemID, avifDiagnostics * diag)
+static avifDecoderItem * avifMetaFindItem(avifMeta * meta, uint32_t itemID)
{
if (itemID == 0) {
return NULL;
@@ -782,17 +782,6 @@
}
}
- if (meta->items.count != 0) {
- // ISO/IEC 23008-12, First edition, 2017-12, Section 9.3.1:
- // Each ItemPropertyAssociation box shall be ordered by increasing item_ID, and there shall
- // be at most one association box for each item_ID, in any ItemPropertyAssociation box.
- const uint32_t lastID = meta->items.item[meta->items.count - 1]->id;
- if (itemID <= lastID) {
- avifDiagnosticsPrintf(diag, "The added itemID [%u] does not preserve the itemID order", itemID);
- return NULL;
- }
- }
-
avifDecoderItem * item = (avifDecoderItem *)avifAlloc(sizeof(avifDecoderItem));
memset(item, 0, sizeof(avifDecoderItem));
if (!avifArrayCreate(&item->properties, sizeof(avifProperty), 16)) {
@@ -1694,7 +1683,7 @@
AVIF_CHECK(avifROStreamReadU32(&s, &itemID)); // unsigned int(32) item_ID;
}
- avifDecoderItem * item = avifMetaFindItem(meta, itemID, diag);
+ avifDecoderItem * item = avifMetaFindItem(meta, itemID);
if (!item) {
avifDiagnosticsPrintf(diag, "Box[iloc] has an invalid item ID [%u]", itemID);
return AVIF_FALSE;
@@ -2157,7 +2146,7 @@
}
prevItemID = itemID;
- avifDecoderItem * item = avifMetaFindItem(meta, itemID, diag);
+ avifDecoderItem * item = avifMetaFindItem(meta, itemID);
if (!item) {
avifDiagnosticsPrintf(diag, "Box[ipma] has an invalid item ID [%u]", itemID);
return AVIF_FALSE;
@@ -2424,7 +2413,7 @@
memset(&contentType, 0, sizeof(contentType));
}
- avifDecoderItem * item = avifMetaFindItem(meta, itemID, diag);
+ avifDecoderItem * item = avifMetaFindItem(meta, itemID);
if (!item) {
avifDiagnosticsPrintf(diag, "%s: Box[infe] with item_type %.4s has an invalid item_ID [%u]", s.diagContext, itemType, itemID);
return AVIF_FALSE;
@@ -2512,7 +2501,7 @@
// Read this reference as "{fromID} is a {irefType} for {toID}"
if (fromID && toID) {
- avifDecoderItem * item = avifMetaFindItem(meta, fromID, diag);
+ avifDecoderItem * item = avifMetaFindItem(meta, fromID);
if (!item) {
avifDiagnosticsPrintf(diag, "Box[iref] has an invalid item ID [%u]", fromID);
return AVIF_FALSE;
@@ -2526,7 +2515,7 @@
item->descForID = toID;
} else if (!memcmp(irefHeader.type, "dimg", 4)) {
// derived images refer in the opposite direction
- avifDecoderItem * dimg = avifMetaFindItem(meta, toID, diag);
+ avifDecoderItem * dimg = avifMetaFindItem(meta, toID);
if (!dimg) {
avifDiagnosticsPrintf(diag, "Box[iref] has an invalid item ID dimg ref [%u]", toID);
return AVIF_FALSE;
@@ -3366,7 +3355,7 @@
if (sample->itemID) {
// The data comes from an item. Let avifDecoderItemMaxExtent() do the heavy lifting.
- avifDecoderItem * item = avifMetaFindItem(decoder->data->meta, sample->itemID, decoder->data->diag);
+ avifDecoderItem * item = avifMetaFindItem(decoder->data->meta, sample->itemID);
avifResult maxExtentResult = avifDecoderItemMaxExtent(item, sample, &sampleExtent);
if (maxExtentResult != AVIF_RESULT_OK) {
return maxExtentResult;
@@ -3404,7 +3393,7 @@
if (sample->itemID) {
// The data comes from an item. Let avifDecoderItemRead() do the heavy lifting.
- avifDecoderItem * item = avifMetaFindItem(decoder->data->meta, sample->itemID, decoder->data->diag);
+ avifDecoderItem * item = avifMetaFindItem(decoder->data->meta, sample->itemID);
avifROData itemContents;
if (sample->offset > SIZE_MAX) {
return AVIF_RESULT_BMFF_PARSE_FAILED;
@@ -3647,8 +3636,7 @@
static avifResult avifDecoderDataFindAlphaItem(avifDecoderData * data,
avifDecoderItem * colorItem,
avifDecoderItem ** alphaItem,
- avifBool * isAlphaItemInInput,
- avifDiagnostics * diag)
+ avifBool * isAlphaItemInInput)
{
for (uint32_t itemIndex = 0; itemIndex < data->meta->items.count; ++itemIndex) {
avifDecoderItem * item = data->meta->items.item[itemIndex];
@@ -3677,8 +3665,12 @@
uint32_t * alphaItemIndices = avifAlloc(colorItemCount * sizeof(uint32_t));
AVIF_CHECKERR(alphaItemIndices, AVIF_RESULT_OUT_OF_MEMORY);
uint32_t alphaItemCount = 0;
+ uint32_t maxItemID = 0;
for (uint32_t i = 0; i < colorItem->meta->items.count; ++i) {
avifDecoderItem * item = colorItem->meta->items.item[i];
+ if (item->id > maxItemID) {
+ maxItemID = item->id;
+ }
if (item->dimgForID == colorItem->id) {
avifBool seenAlphaForCurrentItem = AVIF_FALSE;
for (uint32_t j = 0; j < colorItem->meta->items.count; ++j) {
@@ -3707,22 +3699,8 @@
}
}
assert(alphaItemCount == colorItemCount);
- // Figure out the last used itemID.
- avifResult result = AVIF_RESULT_OK;
- const uint32_t lastID = colorItem->meta->items.item[colorItem->meta->items.count - 1]->id;
- if (lastID == UINT32_MAX) {
- // In the improbable case where the last ID is the maximum one, ids cannot be kept ordered.
- avifDiagnosticsPrintf(diag,
- "Cannot set an itemID for alpha that fits the increasing "
- "order as the maximum possible ID is in use.");
- result = AVIF_RESULT_DECODE_ALPHA_FAILED;
- } else {
- *alphaItem = avifMetaFindItem(colorItem->meta, lastID + 1, diag); // Create new empty item.
- if (*alphaItem == NULL) {
- result = AVIF_RESULT_OUT_OF_MEMORY;
- }
- }
- if (result != AVIF_RESULT_OK) {
+ *alphaItem = avifMetaFindItem(colorItem->meta, maxItemID + 1);
+ if (*alphaItem == NULL) {
avifFree(alphaItemIndices);
*isAlphaItemInInput = AVIF_FALSE;
return AVIF_RESULT_OUT_OF_MEMORY;
@@ -3986,7 +3964,7 @@
avifBool isAlphaItemInInput;
avifDecoderItem * alphaItem;
- AVIF_CHECKRES(avifDecoderDataFindAlphaItem(data, colorItem, &alphaItem, &isAlphaItemInInput, &decoder->diag));
+ AVIF_CHECKRES(avifDecoderDataFindAlphaItem(data, colorItem, &alphaItem, &isAlphaItemInInput));
avifCodecType alphaCodecType = AVIF_CODEC_TYPE_UNKNOWN;
if (alphaItem) {
if (!memcmp(alphaItem->type, "grid", 4)) {