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