Do not fail if reserved bits are not all zeros.
A manual cherry-pick of commit c34228f20fc711fc0d76619141779cc007c67749.
The AV1 spec instructs a decoder to ignore reserved bits. Specifically,
Section 6.2.2 says:
obu_reserved_1bit must be set to 0. The value is ignored by a
decoder.
Section 6.2.3 says:
extension_header_reserved_3bits must be set to 0. The value is
ignored by a decoder.
Section 6.7.6.1 says:
scalability_structure_reserved_3bits must be set to zero and be
ignored by decoders.
Bug: aomedia:2811
Change-Id: Id17358fc4acc5eca4e846c676936a3a90d5c327e
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c
index 3ec1042..6b79b8c 100644
--- a/av1/decoder/obu.c
+++ b/av1/decoder/obu.c
@@ -88,10 +88,8 @@
return AOM_CODEC_UNSUP_BITSTREAM;
}
- if (aom_rb_read_bit(rb) != 0) {
- // obu_reserved_1bit must be set to 0.
- return AOM_CODEC_CORRUPT_FRAME;
- }
+ // obu_reserved_1bit must be set to 0. The value is ignored by a decoder.
+ aom_rb_read_bit(rb);
if (header->has_extension) {
if (bit_buffer_byte_length == 1) return AOM_CODEC_CORRUPT_FRAME;
@@ -99,10 +97,9 @@
header->size += 1;
header->temporal_layer_id = aom_rb_read_literal(rb, 3);
header->spatial_layer_id = aom_rb_read_literal(rb, 2);
- if (aom_rb_read_literal(rb, 3) != 0) {
- // extension_header_reserved_3bits must be set to 0.
- return AOM_CODEC_CORRUPT_FRAME;
- }
+ // extension_header_reserved_3bits must be set to 0. The value is ignored by
+ // a decoder.
+ aom_rb_read_literal(rb, 3);
} else {
header->temporal_layer_id = 0;
header->spatial_layer_id = 0;
@@ -639,7 +636,9 @@
int spatial_layer_dimensions_present_flag = aom_rb_read_literal(rb, 1);
int spatial_layer_description_present_flag = aom_rb_read_literal(rb, 1);
int temporal_group_description_present_flag = aom_rb_read_literal(rb, 1);
- aom_rb_read_literal(rb, 3); // reserved
+ // scalability_structure_reserved_3bits must be set to zero and be ignored by
+ // decoders.
+ aom_rb_read_literal(rb, 3);
if (spatial_layer_dimensions_present_flag) {
int i;