obu: Merge FH and TG if there is only 1 TG
Guarded by CONFIG_OBU_FRAME flag.
Change-Id: I331cf5ae93beb9aba299159ba2af28c0ffd31df5
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index c6dc82e..e8a16e9 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3680,11 +3680,22 @@
*max_tile_col_size = 0;
if (cm->large_scale_tile) {
+#if CONFIG_OBU_FRAME
+ // For large_scale_tile case, we always have only one tile group, so it can
+ // be written as an OBU_FRAME.
+ const OBU_TYPE obu_type = OBU_FRAME;
+#else
+ const OBU_TYPE obu_type = OBU_TILE_GROUP;
+#endif // CONFIG_OBU_FRAME
uint32_t tg_hdr_size =
- write_obu_header(OBU_TILE_GROUP, 0, data + PRE_OBU_SIZE_BYTES);
+ write_obu_header(obu_type, 0, data + PRE_OBU_SIZE_BYTES);
tg_hdr_size += PRE_OBU_SIZE_BYTES;
data += tg_hdr_size;
+#if CONFIG_OBU_FRAME
+ total_size += write_frame_header_obu(cpi, saved_wb, data);
+#endif // CONFIG_OBU_FRAME
+
int tile_size_bytes = 0;
int tile_col_size_bytes = 0;
@@ -3829,11 +3840,23 @@
// A new tile group begins at this tile. Write the obu header and
// tile group header
- curr_tg_data_size = write_obu_header(
- OBU_TILE_GROUP, obu_extension_header, data + PRE_OBU_SIZE_BYTES);
+#if CONFIG_OBU_FRAME
+ const OBU_TYPE obu_type =
+ (num_tg_hdrs == 1) ? OBU_FRAME : OBU_TILE_GROUP;
+#else
+ const OBU_TYPE obu_type = OBU_TILE_GROUP;
+#endif
+ curr_tg_data_size = write_obu_header(obu_type, obu_extension_header,
+ data + PRE_OBU_SIZE_BYTES);
#if CONFIG_OBU_SIZING
obu_header_size = curr_tg_data_size;
#endif // CONFIG_OBU_SIZING
+#if CONFIG_OBU_FRAME
+ if (num_tg_hdrs == 1) {
+ curr_tg_data_size += write_frame_header_obu(
+ cpi, saved_wb, data + curr_tg_data_size + PRE_OBU_SIZE_BYTES);
+ }
+#endif
curr_tg_data_size += write_tile_group_header(
data + curr_tg_data_size + PRE_OBU_SIZE_BYTES, tile_idx,
AOMMIN(tile_idx + tg_size - 1, tile_cols * tile_rows - 1),
@@ -3957,7 +3980,7 @@
AV1_COMMON *const cm = &cpi->common;
uint32_t obu_header_size = 0;
uint32_t obu_payload_size = 0;
- FrameHeaderInfo fh_info;
+ FrameHeaderInfo fh_info = { NULL, 0 };
#if CONFIG_SCALABILITY
const uint8_t enhancement_layers_cnt = cm->enhancement_layers_cnt;
const uint8_t obu_extension_header =
@@ -4000,33 +4023,41 @@
data += obu_header_size + obu_payload_size + length_field_size;
}
- struct aom_write_bit_buffer saved_wb;
+#if CONFIG_OBU_FRAME
+ const int write_frame_header = (cm->num_tg > 1 || cm->show_existing_frame);
+#else
+ const int write_frame_header = 1;
+#endif // CONFIG_OBU_FRAME
- // Write Frame Header OBU.
- fh_info.frame_header = data;
- obu_header_size = write_obu_header(OBU_FRAME_HEADER, obu_extension_header,
- data + PRE_OBU_SIZE_BYTES);
- obu_payload_size = write_frame_header_obu(
- cpi, &saved_wb, data + PRE_OBU_SIZE_BYTES + obu_header_size);
+ struct aom_write_bit_buffer saved_wb;
+ if (write_frame_header) {
+ // Write Frame Header OBU.
+ fh_info.frame_header = data;
+ obu_header_size = write_obu_header(OBU_FRAME_HEADER, obu_extension_header,
+ data + PRE_OBU_SIZE_BYTES);
+ obu_payload_size = write_frame_header_obu(
+ cpi, &saved_wb, data + PRE_OBU_SIZE_BYTES + obu_header_size);
#if CONFIG_OBU_SIZING
- const size_t length_field_size =
- obu_memmove(obu_header_size, obu_payload_size, data);
- if (write_uleb_obu_size(obu_header_size, obu_payload_size, data) !=
- AOM_CODEC_OK) {
- return AOM_CODEC_ERROR;
- }
+ const size_t length_field_size =
+ obu_memmove(obu_header_size, obu_payload_size, data);
+ if (write_uleb_obu_size(obu_header_size, obu_payload_size, data) !=
+ AOM_CODEC_OK) {
+ return AOM_CODEC_ERROR;
+ }
#else
- const size_t length_field_size = PRE_OBU_SIZE_BYTES;
- mem_put_le32(data, obu_header_size + obu_payload_size);
+ const size_t length_field_size = PRE_OBU_SIZE_BYTES;
+ mem_put_le32(data, obu_header_size + obu_payload_size);
#endif // CONFIG_OBU_SIZING
- fh_info.total_length = obu_header_size + obu_payload_size + length_field_size;
- data += fh_info.total_length;
+ fh_info.total_length =
+ obu_header_size + obu_payload_size + length_field_size;
+ data += fh_info.total_length;
- // Since length_field_size is determined adaptively after frame header
- // encoding, saved_wb must be adjusted accordingly.
- saved_wb.bit_buffer += length_field_size;
+ // Since length_field_size is determined adaptively after frame header
+ // encoding, saved_wb must be adjusted accordingly.
+ saved_wb.bit_buffer += length_field_size;
+ }
#define EXT_TILE_DEBUG 0
#if EXT_TILE_DEBUG