obu: Fix decoder_peek_si_interal for size_after_header
BUG=aomedia:1531
Change-Id: Id0f4bb827e51c1e70b42eb57ae6e1075274a217c
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index 72cc3c8..2cc2714 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -161,6 +161,14 @@
return AOM_CODEC_OK;
}
+static size_t get_obu_length_field_size(const uint8_t *data) {
+ size_t length_field_size = 1;
+ for (size_t i = 0; i < sizeof(uint64_t) && (data[i] & 0x80); ++i) {
+ ++length_field_size;
+ }
+ return length_field_size;
+}
+
static aom_codec_err_t decoder_peek_si_internal(const uint8_t *data,
unsigned int data_sz,
aom_codec_stream_info_t *si,
@@ -180,11 +188,10 @@
intra_only_flag = 1;
si->is_kf = 1;
-#if CONFIG_OBU_SIZING
- size_t length_field_size = 1;
- for (size_t i = 0; i < sizeof(uint64_t) && (data[i] & 0x80); ++i) {
- ++length_field_size;
- }
+#if CONFIG_OBU_SIZE_AFTER_HEADER
+ struct aom_read_bit_buffer rb = { data, data + data_sz, 0, NULL, NULL };
+#elif CONFIG_OBU_SIZING
+ const size_t length_field_size = get_obu_length_field_size(data);
struct aom_read_bit_buffer rb = { data + length_field_size, data + data_sz, 0,
NULL, NULL };
#else
@@ -199,6 +206,11 @@
if (get_obu_type(obu_header, &obu_type) != 0)
return AOM_CODEC_UNSUP_BITSTREAM;
+#if CONFIG_OBU_SIZE_AFTER_HEADER
+ // One byte has been consumed by the OBU header.
+ rb.bit_offset += get_obu_length_field_size(data + 1);
+#endif
+
// This check is disabled because existing behavior is depended upon by
// decoder tests (see decode_test_driver.cc), scalability_decoder (see
// scalable_decoder.c), and decode_once() in this file.