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)) {