diff --git a/avifinfo.c b/avifinfo.c
index ba6f75d..88a6e11 100644
--- a/avifinfo.c
+++ b/avifinfo.c
@@ -94,7 +94,6 @@
   read_stream_t read;       // Used to fetch more bytes from the 'stream'.
   skip_stream_t skip;       // Used to advance the position in the 'stream'.
                             // Fallback to 'read' if 'skip' is null.
-  uint32_t num_read_bytes;  // Total number of read bytes.
 } AvifInfoInternalStream;
 
 // Reads 'num_bytes' from the 'stream'. They are available at '*data'.
@@ -103,7 +102,6 @@
     AvifInfoInternalStream* stream, uint32_t num_bytes, const uint8_t** data) {
   *data = stream->read(stream->stream, num_bytes);
   AVIFINFO_CHECK(*data != NULL, kTruncated);
-  stream->num_read_bytes += num_bytes;
   return kFound;
 }
 
@@ -122,7 +120,6 @@
       return AvifInfoInternalRead(stream, num_bytes, &unused);
     }
     stream->skip(stream->stream, num_bytes);
-    stream->num_read_bytes += num_bytes;
   }
   return kFound;
 }
@@ -270,8 +267,6 @@
     box->size = num_remaining_bytes;
   }
   AVIFINFO_CHECK(box->size >= box_header_size, kInvalid);
-  AVIFINFO_CHECK(box->size <= AVIFINFO_MAX_SIZE - stream->num_read_bytes,
-                 kAborted);
   AVIFINFO_CHECK(box->size <= num_remaining_bytes, kInvalid);
 
   const int has_fullbox_header =
@@ -706,7 +701,6 @@
   internal_stream.stream = stream;
   internal_stream.read = read;
   internal_stream.skip = skip;  // Fallbacks to 'read' if null.
-  internal_stream.num_read_bytes = 0;
   uint32_t num_parsed_boxes = 0;
   AvifInfoInternalFeatures internal_features;
   memset(&internal_features, AVIFINFO_UNDEFINED, sizeof(internal_features));
diff --git a/tests/avifinfo_test.cc b/tests/avifinfo_test.cc
index 108881d..0ab2ac7 100644
--- a/tests/avifinfo_test.cc
+++ b/tests/avifinfo_test.cc
@@ -29,6 +29,11 @@
                                                                      : Data();
 }
 
+bool AreEqual(const AvifInfoFeatures& a, const AvifInfoFeatures& b) {
+  return a.width == b.width && a.height == b.height &&
+         a.bit_depth == b.bit_depth && a.num_channels == b.num_channels;
+}
+
 //------------------------------------------------------------------------------
 // Positive tests
 
@@ -38,10 +43,7 @@
 
   AvifInfoFeatures features;
   EXPECT_EQ(AvifInfoGet(input.data(), input.size(), &features), kAvifInfoOk);
-  EXPECT_EQ(features.width, 1u);
-  EXPECT_EQ(features.height, 1u);
-  EXPECT_EQ(features.bit_depth, 8u);
-  EXPECT_EQ(features.num_channels, 3u);
+  EXPECT_TRUE(AreEqual(features, {1u, 1u, 8u, 3u}));
 }
 
 TEST(AvifInfoGetTest, NoPixi10b) {
@@ -54,10 +56,7 @@
 
   AvifInfoFeatures features;
   EXPECT_EQ(AvifInfoGet(input.data(), input.size(), &features), kAvifInfoOk);
-  EXPECT_EQ(features.width, 1u);
-  EXPECT_EQ(features.height, 1u);
-  EXPECT_EQ(features.bit_depth, 10u);
-  EXPECT_EQ(features.num_channels, 3u);
+  EXPECT_TRUE(AreEqual(features, {1u, 1u, 10u, 3u}));
 }
 
 TEST(AvifInfoGetTest, EnoughBytes) {
@@ -70,10 +69,21 @@
 
   AvifInfoFeatures features;
   EXPECT_EQ(AvifInfoGet(input.data(), input.size(), &features), kAvifInfoOk);
-  EXPECT_EQ(features.width, 1u);
-  EXPECT_EQ(features.height, 1u);
-  EXPECT_EQ(features.bit_depth, 8u);
-  EXPECT_EQ(features.num_channels, 3u);
+  EXPECT_TRUE(AreEqual(features, {1u, 1u, 8u, 3u}));
+}
+
+TEST(AvifInfoGetTest, BigMetaBox) {
+  Data input = LoadFile("avifinfo_test_1x1.avif");
+  ASSERT_FALSE(input.empty());
+  // Change "meta" box size to the size 2^32-1.
+  const uint8_t kMetaTag[] = {'m', 'e', 't', 'a'};
+  auto meta_tag =
+      std::search(input.begin(), input.end(), kMetaTag, kMetaTag + 4);
+  meta_tag[-4] = meta_tag[-3] = meta_tag[-2] = meta_tag[-1] = 255;
+
+  AvifInfoFeatures features;
+  EXPECT_EQ(AvifInfoGet(input.data(), input.size(), &features), kAvifInfoOk);
+  EXPECT_TRUE(AreEqual(features, {1u, 1u, 8u, 3u}));
 }
 
 TEST(AvifInfoGetTest, Null) {
@@ -89,10 +99,7 @@
 TEST(AvifInfoGetTest, Empty) {
   AvifInfoFeatures features;
   EXPECT_EQ(AvifInfoGet(nullptr, 0, &features), kAvifInfoNotEnoughData);
-  EXPECT_EQ(features.width, 0u);
-  EXPECT_EQ(features.height, 0u);
-  EXPECT_EQ(features.bit_depth, 0u);
-  EXPECT_EQ(features.num_channels, 0u);
+  EXPECT_TRUE(AreEqual(features, {0}));
 }
 
 TEST(AvifInfoGetTest, NotEnoughBytes) {
@@ -118,28 +125,24 @@
   AvifInfoFeatures features;
   EXPECT_EQ(AvifInfoGet(input.data(), input.size(), &features),
             kAvifInfoInvalidFile);
-  EXPECT_EQ(features.width, 0u);
-  EXPECT_EQ(features.height, 0u);
-  EXPECT_EQ(features.bit_depth, 0u);
-  EXPECT_EQ(features.num_channels, 0u);
+  EXPECT_TRUE(AreEqual(features, {0}));
 }
 
 TEST(AvifInfoGetTest, MetaBoxIsTooBig) {
   Data input = LoadFile("avifinfo_test_1x1.avif");
   ASSERT_FALSE(input.empty());
-  // Change "meta" box size to the maximum size 2^32-1.
+  // Change "meta" box size to the maximum size 2^64-1.
   const uint8_t kMetaTag[] = {'m', 'e', 't', 'a'};
   auto meta_tag =
       std::search(input.begin(), input.end(), kMetaTag, kMetaTag + 4);
-  meta_tag[-4] = meta_tag[-3] = meta_tag[-2] = meta_tag[-1] = 255;
+  meta_tag[-4] = meta_tag[-3] = meta_tag[-2] = 0;
+  meta_tag[-1] = 1;  // 32-bit "1" then 4-char "meta" then 64-bit size.
+  input.insert(meta_tag + 4, {255, 255, 255, 255, 255, 255, 255, 255});
 
   AvifInfoFeatures features;
   EXPECT_EQ(AvifInfoGet(input.data(), input.size(), &features),
             kAvifInfoTooComplex);
-  EXPECT_EQ(features.width, 0u);
-  EXPECT_EQ(features.height, 0u);
-  EXPECT_EQ(features.bit_depth, 0u);
-  EXPECT_EQ(features.num_channels, 0u);
+  EXPECT_TRUE(AreEqual(features, {0}));
 }
 
 TEST(AvifInfoGetTest, TooManyBoxes) {
@@ -164,10 +167,7 @@
   EXPECT_EQ(AvifInfoRead(/*stream=*/nullptr, /*read=*/nullptr, /*skip=*/nullptr,
                          &features),
             kAvifInfoNotEnoughData);
-  EXPECT_EQ(features.width, 0u);
-  EXPECT_EQ(features.height, 0u);
-  EXPECT_EQ(features.bit_depth, 0u);
-  EXPECT_EQ(features.num_channels, 0u);
+  EXPECT_TRUE(AreEqual(features, {0}));
 }
 
 //------------------------------------------------------------------------------
