obu: Merge FH and TG if there is only 1 TG
Guarded by CONFIG_OBU_FRAME flag.
Change-Id: I331cf5ae93beb9aba299159ba2af28c0ffd31df5
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c
index afd589d..addcf61 100644
--- a/av1/decoder/obu.c
+++ b/av1/decoder/obu.c
@@ -72,6 +72,7 @@
case OBU_TEMPORAL_DELIMITER:
case OBU_FRAME_HEADER:
case OBU_TILE_GROUP:
+ case OBU_FRAME:
case OBU_METADATA:
case OBU_PADDING: valid_type = 1; break;
default: break;
@@ -323,6 +324,7 @@
struct aom_read_bit_buffer rb;
size_t payload_size = 0;
size_t decoded_payload_size = 0;
+ size_t obu_payload_offset = 0;
const size_t bytes_available = data_end - data;
if (bytes_available < 1) {
@@ -401,6 +403,9 @@
decoded_payload_size = seq_header_size;
}
break;
+#if CONFIG_OBU_FRAME
+ case OBU_FRAME:
+#endif // CONFIG_OBU_FRAME
case OBU_FRAME_HEADER:
// Only decode first frame header received
if (!frame_header_received) {
@@ -409,16 +414,25 @@
frame_header_received = 1;
}
decoded_payload_size = frame_header_size;
- if (cm->show_existing_frame) frame_decoding_finished = 1;
+ if (cm->show_existing_frame) {
+ frame_decoding_finished = 1;
+ break;
+ }
+#if CONFIG_OBU_FRAME
+ if (obu_header.type == OBU_FRAME_HEADER) break;
+ obu_payload_offset = frame_header_size;
+ AOM_FALLTHROUGH_INTENDED; // fall through to read tile group.
+#else
break;
+#endif // CONFIG_OBU_FRAME
case OBU_TILE_GROUP:
if (!frame_header_received) {
cm->error.error_code = AOM_CODEC_CORRUPT_FRAME;
return;
}
- decoded_payload_size = read_one_tile_group_obu(
- pbi, &rb, is_first_tg_obu_received, data, data + payload_size,
- p_data_end, &frame_decoding_finished);
+ decoded_payload_size += read_one_tile_group_obu(
+ pbi, &rb, is_first_tg_obu_received, data + obu_payload_offset,
+ data + payload_size, p_data_end, &frame_decoding_finished);
is_first_tg_obu_received = 0;
break;
case OBU_METADATA: