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