diff --git a/aom/aom_image.h b/aom/aom_image.h
index 0cf2e9e..863277e 100644
--- a/aom/aom_image.h
+++ b/aom/aom_image.h
@@ -30,7 +30,7 @@
  * types, removing or reassigning enums, adding/removing/rearranging
  * fields to structures
  */
-#define AOM_IMAGE_ABI_VERSION (7) /**<\hideinitializer*/
+#define AOM_IMAGE_ABI_VERSION (6) /**<\hideinitializer*/
 
 #define AOM_IMG_FMT_PLANAR 0x100  /**< Image is a planar format. */
 #define AOM_IMG_FMT_UV_FLIP 0x200 /**< V plane precedes U in memory. */
@@ -351,32 +351,6 @@
 int aom_img_add_metadata(aom_image_t *img, uint32_t type, const uint8_t *data,
                          size_t sz);
 
-/*!\brief Return a metadata payload stored within the image metadata array.
- *
- * Gets the metadata (aom_metadata_t) at the indicated index in the image
- * metadata array. Caller of this function owns the memory.
- *
- * \param[in] img          Pointer to image descriptor to get metadata from
- * \param[in] index        Metadata index to get from metadata array
- *
- * \return Returns a pointer to a newly allocated copy of the selected metadata,
- * if img and/or index is invalid, it returns NULL.
- */
-aom_metadata_t *aom_img_get_metadata(aom_image_t *img, size_t index);
-
-/*!\brief Return the number of metadata blocks within the image.
- *
- * Gets the number of metadata blocks contained within the provided image
- * metadata array.
- *
- * \param[in] img          Pointer to image descriptor to get metadata number
- * from.
- *
- * \return Returns the size of the metadata array. If img or metadata is NULL,
- * it returns 0.
- */
-size_t aom_img_num_metadata(aom_image_t *img);
-
 /*!\brief Remove metadata from image.
  *
  * Removes all metadata in image metadata list and sets metadata list pointer
diff --git a/aom/exports_com b/aom/exports_com
index 68dbfe0..a192cf9 100644
--- a/aom/exports_com
+++ b/aom/exports_com
@@ -15,12 +15,10 @@
 text aom_img_alloc_with_border
 text aom_img_flip
 text aom_img_free
-text aom_img_get_metadata
 text aom_img_metadata_array_free
 text aom_img_metadata_array_alloc
 text aom_img_metadata_free
 text aom_img_metadata_alloc
-text aom_img_num_metadata
 text aom_img_plane_height
 text aom_img_plane_width
 text aom_img_remove_metadata
diff --git a/aom/src/aom_image.c b/aom/src/aom_image.c
index 5fd2297..5e2edb4 100644
--- a/aom/src/aom_image.c
+++ b/aom/src/aom_image.c
@@ -379,20 +379,3 @@
     img->metadata = NULL;
   }
 }
-
-aom_metadata_t *aom_img_get_metadata(aom_image_t *img, size_t index) {
-  if (!img) return NULL;
-  aom_metadata_t *metadata = NULL;
-  aom_metadata_array_t *array = img->metadata;
-  if (array && array->sz > 0 && index < array->sz) {
-    metadata = aom_img_metadata_alloc(array->metadata_array[index]->type,
-                                      array->metadata_array[index]->payload,
-                                      array->metadata_array[index]->sz);
-  }
-  return metadata;
-}
-
-size_t aom_img_num_metadata(aom_image_t *img) {
-  if (!img || !img->metadata) return 0;
-  return img->metadata->sz;
-}
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index 91432d7..6b06ad4 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -802,18 +802,6 @@
           if (ctx->need_resync) return NULL;
           yuvconfig2image(&ctx->img, sd, frame_worker_data->user_priv);
 
-          if (pbi->metadata != NULL) {
-            int array_size = (int)pbi->metadata->sz;
-            for (int i = 0; i < array_size; ++i) {
-              aom_img_add_metadata(&ctx->img,
-                                   pbi->metadata->metadata_array[i]->type,
-                                   pbi->metadata->metadata_array[i]->payload,
-                                   pbi->metadata->metadata_array[i]->sz);
-            }
-            aom_img_metadata_array_free(pbi->metadata);
-            pbi->metadata = NULL;
-          }
-
           if (!pbi->ext_tile_debug && cm->large_scale_tile) {
             *index += 1;  // Advance the iterator to point to the next image
 
diff --git a/av1/decoder/decoder.h b/av1/decoder/decoder.h
index be13918..61206dd 100644
--- a/av1/decoder/decoder.h
+++ b/av1/decoder/decoder.h
@@ -243,7 +243,6 @@
 #endif
 
   AV1DecRowMTInfo frame_row_mt_info;
-  aom_metadata_array_t *metadata;
 } AV1Decoder;
 
 // Returns 0 on success. Sets pbi->common.error.error_code to a nonzero error
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c
index 2bdedc0..3619264 100644
--- a/av1/decoder/obu.c
+++ b/av1/decoder/obu.c
@@ -548,33 +548,32 @@
   return tile_list_payload_size;
 }
 
-// On success, returns the number of bytes read from 'data'. On failure, calls
+// Reads the country code as specified in Recommendation ITU-T T.35. On
+// success, returns the number of bytes read from 'data'. On failure, calls
 // aom_internal_error() and does not return.
-static size_t read_metadata_itut_t35(AV1Decoder *const pbi, const uint8_t *data,
+//
+// Note: This function does not read itu_t_t35_payload_bytes because the exact
+// syntax of itu_t_t35_payload_bytes is not defined in the spec.
+static size_t read_metadata_itut_t35(AV1_COMMON *const cm, const uint8_t *data,
                                      size_t sz) {
-  if (sz <= 0) {
-    AV1_COMMON *const cm = &pbi->common;
+  size_t i = 0;
+  // itu_t_t35_country_code f(8)
+  if (i >= sz) {
     aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
                        "itu_t_t35_country_code is missing");
   }
-
-  if (!pbi->metadata) {
-    pbi->metadata = aom_img_metadata_array_alloc(1);
-  } else {
-    aom_metadata_array_t *metadata =
-        aom_img_metadata_array_alloc(pbi->metadata->sz + 1);
-    for (size_t i = 0; i < pbi->metadata->sz; ++i) {
-      metadata->metadata_array[i] =
-          aom_img_metadata_alloc(pbi->metadata->metadata_array[i]->type,
-                                 pbi->metadata->metadata_array[i]->payload,
-                                 pbi->metadata->metadata_array[i]->sz);
+  const int itu_t_t35_country_code = data[i];
+  ++i;
+  if (itu_t_t35_country_code == 0xFF) {
+    // itu_t_t35_country_code_extension_byte f(8)
+    if (i >= sz) {
+      aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
+                         "itu_t_t35_country_code_extension_byte is missing");
     }
-    aom_img_metadata_array_free(pbi->metadata);
-    pbi->metadata = metadata;
+    ++i;
   }
-  pbi->metadata->metadata_array[pbi->metadata->sz - 1] =
-      aom_img_metadata_alloc(OBU_METADATA_TYPE_ITUT_T35, data, sz - 1);
-  return sz - 1;
+  // itu_t_t35_payload_bytes
+  return i;
 }
 
 static void read_metadata_hdr_cll(struct aom_read_bit_buffer *rb) {
@@ -710,7 +709,7 @@
   if (metadata_type == OBU_METADATA_TYPE_ITUT_T35) {
     size_t bytes_read =
         type_length +
-        read_metadata_itut_t35(pbi, data + type_length, sz - type_length);
+        read_metadata_itut_t35(cm, data + type_length, sz - type_length);
     // Ignore itu_t_t35_payload_bytes and check trailing bits. Section 6.7.2
     // of the spec says:
     //   itu_t_t35_payload_bytes shall be bytes containing data registered as
diff --git a/test/metadata_test.cc b/test/metadata_test.cc
index 0c55cbc..bd8a1dd 100644
--- a/test/metadata_test.cc
+++ b/test/metadata_test.cc
@@ -48,9 +48,6 @@
       ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35,
                                      kExampleData, kExampleDataSize),
                 0);
-      ASSERT_EQ(aom_img_add_metadata(current_frame, OBU_METADATA_TYPE_ITUT_T35,
-                                     kExampleData, kExampleDataSize),
-                0);
     }
   }
 
@@ -74,16 +71,6 @@
       EXPECT_TRUE(found_metadata);
     }
   }
-
-  virtual void DecompressedFrameHook(const aom_image_t &img,
-                                     aom_codec_pts_t /*pts*/) {
-    ASSERT_TRUE(img.metadata != nullptr);
-    EXPECT_EQ(img.metadata->sz, 2u);
-    EXPECT_EQ(memcmp(kExampleData, img.metadata->metadata_array[0]->payload,
-                     kExampleDataSize),
-              0);
-    aom_img_metadata_array_free(img.metadata);
-  }
 };
 
 TEST_P(MetadataEncodeTest, TestMetadataEncoding) {
@@ -194,45 +181,3 @@
   aom_remove_metadata_from_frame_buffer(&yvBuf);
   aom_remove_metadata_from_frame_buffer(NULL);
 }
-
-TEST(MetadataTest, GetMetadataFromImage) {
-  aom_image_t image;
-  image.metadata = NULL;
-
-  ASSERT_EQ(aom_img_add_metadata(&image, OBU_METADATA_TYPE_ITUT_T35,
-                                 kExampleData, kExampleDataSize),
-            0);
-
-  EXPECT_TRUE(aom_img_get_metadata(NULL, 0) == NULL);
-  EXPECT_TRUE(aom_img_get_metadata(&image, 10u) == NULL);
-
-  aom_metadata_t *metadata = aom_img_get_metadata(&image, 0);
-  EXPECT_TRUE(metadata != NULL);
-  aom_img_metadata_free(metadata);
-  aom_img_metadata_array_free(image.metadata);
-}
-
-TEST(MetadataTest, ReadMetadatasFromImage) {
-  aom_image_t image;
-  image.metadata = NULL;
-
-  ASSERT_EQ(aom_img_add_metadata(&image, OBU_METADATA_TYPE_ITUT_T35,
-                                 kExampleData, kExampleDataSize),
-            0);
-  ASSERT_EQ(aom_img_add_metadata(&image, OBU_METADATA_TYPE_HDR_CLL,
-                                 kExampleData, kExampleDataSize),
-            0);
-  ASSERT_EQ(aom_img_add_metadata(&image, OBU_METADATA_TYPE_HDR_MDCV,
-                                 kExampleData, kExampleDataSize),
-            0);
-
-  size_t number_metadata = aom_img_num_metadata(&image);
-  EXPECT_EQ(number_metadata, 3u);
-  for (size_t i = 0; i < number_metadata; ++i) {
-    aom_metadata_t *metadata = aom_img_get_metadata(&image, i);
-    ASSERT_TRUE(metadata != NULL);
-    EXPECT_EQ(memcmp(kExampleData, metadata->payload, kExampleDataSize), 0);
-    aom_img_metadata_free(metadata);
-  }
-  aom_img_metadata_array_free(image.metadata);
-}
