Fix bug where the gain map is not detected if iprp appears before iref.

Change-Id: I851c3adb9c6a760ea1693b2ee914d651a0fc7441
diff --git a/avifinfo.c b/avifinfo.c
index 77b8b03..62abf28 100644
--- a/avifinfo.c
+++ b/avifinfo.c
@@ -175,6 +175,7 @@
   uint8_t data_was_skipped;  // True if some loops/indices were skipped.
   uint8_t tone_mapped_item_id;  // Id of the "tmap" box, > 0 if present.
   uint8_t iinf_parsed;  // True if the "iinf" (item info) box was parsed.
+  uint8_t iref_parsed;  // True if the "iref" (item reference) box was parsed.
 
   uint8_t num_tiles;
   AvifInfoInternalTile tiles[AVIFINFO_MAX_TILES];
@@ -267,7 +268,8 @@
   }
   // If the gain map has not been found but we haven't read all the relevant
   // metadata, we might still find one later and cannot stop now.
-  if (!f->primary_item_features.has_gainmap && !f->iinf_parsed) {
+  if (!f->primary_item_features.has_gainmap &&
+      (!f->iinf_parsed || (f->tone_mapped_item_id && !f->iref_parsed))) {
     return kNotFound;
   }
 
@@ -605,6 +607,8 @@
                                         uint32_t num_remaining_bytes,
                                         uint32_t* num_parsed_boxes,
                                         AvifInfoInternalFeatures* features) {
+  features->iref_parsed = 1;
+
   do {
     AvifInfoInternalBox box;
     AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(
diff --git a/tests/avifinfo_test.cc b/tests/avifinfo_test.cc
index e115299..a9f4b5e 100644
--- a/tests/avifinfo_test.cc
+++ b/tests/avifinfo_test.cc
@@ -128,37 +128,43 @@
 }
 
 TEST(AvifInfoGetTest, WithGainmapTmap) {
-  const Data input = LoadFile("avifinfo_test_12x34_gainmap_tmap.avif");
-  ASSERT_FALSE(input.empty());
+  for (const char* file_name :
+       {"avifinfo_test_12x34_gainmap_tmap.avif",
+        "avifinfo_test_12x34_gainmap_tmap_iref_after_iprp.avif"}) {
+    SCOPED_TRACE(file_name);
+    const Data input = LoadFile(file_name);
+    ASSERT_FALSE(input.empty());
 
-  ASSERT_EQ(AvifInfoIdentify(input.data(), input.size()), kAvifInfoOk);
-  AvifInfoFeatures f;
-  ASSERT_EQ(AvifInfoGetFeatures(input.data(), input.size(), &f), kAvifInfoOk);
-  ExpectEqual(f, {.width = 12u,
-                  .height = 34u,
-                  .bit_depth = 10u,
-                  .num_channels = 4u,
-                  .has_gainmap = 1u,
-                  .gainmap_item_id = 4u,
-                  .primary_item_id_location = 96u,
-                  .primary_item_id_bytes = 2u});
+    ASSERT_EQ(AvifInfoIdentify(input.data(), input.size()), kAvifInfoOk);
+    AvifInfoFeatures f;
+    ASSERT_EQ(AvifInfoGetFeatures(input.data(), input.size(), &f), kAvifInfoOk);
+    ExpectEqual(f, {.width = 12u,
+                    .height = 34u,
+                    .bit_depth = 10u,
+                    .num_channels = 4u,
+                    .has_gainmap = 1u,
+                    .gainmap_item_id = 4u,
+                    .primary_item_id_location = 96u,
+                    .primary_item_id_bytes = 2u});
 
-  Data gainmap = input;
-  ASSERT_TRUE(SetPrimaryItemIdToGainmapId(gainmap));
-  ASSERT_EQ(AvifInfoIdentify(gainmap.data(), gainmap.size()), kAvifInfoOk);
-  AvifInfoFeatures gainmap_f;
-  ASSERT_EQ(AvifInfoGetFeatures(gainmap.data(), gainmap.size(), &gainmap_f),
-            kAvifInfoOk);
-  // Note that num_channels says 4 even though the alpha plane is associated to
-  // the main image and not the gain map, but libavifinfo does not check this.
-  ExpectEqual(gainmap_f, {.width = 6u,
-                          .height = 17u,
-                          .bit_depth = 8u,
-                          .num_channels = 4u,
-                          .has_gainmap = 1u,
-                          .gainmap_item_id = 4u,
-                          .primary_item_id_location = 96u,
-                          .primary_item_id_bytes = 2u});
+    Data gainmap = input;
+    ASSERT_TRUE(SetPrimaryItemIdToGainmapId(gainmap));
+    ASSERT_EQ(AvifInfoIdentify(gainmap.data(), gainmap.size()), kAvifInfoOk);
+    AvifInfoFeatures gainmap_f;
+    ASSERT_EQ(AvifInfoGetFeatures(gainmap.data(), gainmap.size(), &gainmap_f),
+              kAvifInfoOk);
+    // Note that num_channels says 4 even though the alpha plane is associated
+    // to the main image and not the gain map, but libavifinfo does not check
+    // this.
+    ExpectEqual(gainmap_f, {.width = 6u,
+                            .height = 17u,
+                            .bit_depth = 8u,
+                            .num_channels = 4u,
+                            .has_gainmap = 1u,
+                            .gainmap_item_id = 4u,
+                            .primary_item_id_location = 96u,
+                            .primary_item_id_bytes = 2u});
+  }
 }
 
 TEST(AvifInfoGetTest, NoPixi10b) {
diff --git a/tests/avifinfo_test_12x34_gainmap_tmap_iref_after_iprp.avif b/tests/avifinfo_test_12x34_gainmap_tmap_iref_after_iprp.avif
new file mode 100644
index 0000000..c363b12
--- /dev/null
+++ b/tests/avifinfo_test_12x34_gainmap_tmap_iref_after_iprp.avif
Binary files differ