Write LEB128 OBU size fields.
Removes padding bytes.
BUG=aomedia:1125
Change-Id: Ib9bce81a86aa218abeeba8e027387634aaa89b92
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c
index e1ed8eb..e49faae 100644
--- a/av1/decoder/obu.c
+++ b/av1/decoder/obu.c
@@ -148,7 +148,6 @@
// TODO(shan): For now, assume all tile groups received in order
*is_last_tg = endTile == cm->tile_rows * cm->tile_cols - 1;
-
return header_size + tg_payload_size;
}
@@ -273,21 +272,29 @@
while (!frame_decoding_finished && !cm->error.error_code) {
struct aom_read_bit_buffer rb;
size_t obu_header_size, obu_payload_size = 0;
- av1_init_read_bit_buffer(pbi, &rb, data + PRE_OBU_SIZE_BYTES, data_end);
+ const size_t bytes_available = data_end - data;
+
+ if (bytes_available < 1) {
+ cm->error.error_code = AOM_CODEC_CORRUPT_FRAME;
+ return;
+ }
#if CONFIG_OBU_SIZING
- // OBUs are preceded by an unsigned leb128 coded unsigned integer padded to
- // PRE_OBU_SIZE_BYTES bytes.
+ // OBUs are preceded by an unsigned leb128 coded unsigned integer.
uint32_t u_obu_size = 0;
- aom_uleb_decode(data, PRE_OBU_SIZE_BYTES, &u_obu_size);
+ aom_uleb_decode(data, bytes_available, &u_obu_size);
const size_t obu_size = (size_t)u_obu_size;
+ const size_t length_field_size = aom_uleb_size_in_bytes(u_obu_size);
#else
// every obu is preceded by PRE_OBU_SIZE_BYTES-byte size of obu (obu header
// + payload size)
// The obu size is only needed for tile group OBUs
const size_t obu_size = mem_get_le32(data);
+ const size_t length_field_size = PRE_OBU_SIZE_BYTES;
#endif // CONFIG_OBU_SIZING
+ av1_init_read_bit_buffer(pbi, &rb, data + length_field_size, data_end);
+
#if !CONFIG_SCALABILITY
const OBU_TYPE obu_type = read_obu_header(&rb, &obu_header_size, NULL);
#else
@@ -295,7 +302,7 @@
read_obu_header(&rb, &obu_header_size, &obu_extension_header);
#endif
- data += (PRE_OBU_SIZE_BYTES + obu_header_size);
+ data += length_field_size + obu_header_size;
if (data_end < data) {
cm->error.error_code = AOM_CODEC_CORRUPT_FRAME;
return;
@@ -339,6 +346,7 @@
break;
default: break;
}
+
data += obu_payload_size;
if (data_end < data) {
cm->error.error_code = AOM_CODEC_CORRUPT_FRAME;