Move frame_header_count to AV1_COMP
Moved frame_header_count from AV1LevelParams to AV1_COMP. Future CLs
will move level_params from AV1_COMP to AV1_PRIMARY. However, as
frame_header_count is unique for each frame and updated in
av1_write_obu_header, this CL moves it out of level_params into cpi.
Change-Id: Ib0b5ea3d62d8aa9b94c33439b4a259ca6207ff59
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 441f07c..18a89be 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -2405,8 +2405,9 @@
const size_t move_offset = obu_header_size + length_field_size;
memmove(ctx->cx_data + move_offset, ctx->cx_data, frame_size);
- obu_header_size = av1_write_obu_header(
- &cpi->level_params, OBU_TEMPORAL_DELIMITER, 0, ctx->cx_data);
+ obu_header_size =
+ av1_write_obu_header(&cpi->level_params, &cpi->frame_header_count,
+ OBU_TEMPORAL_DELIMITER, 0, ctx->cx_data);
// OBUs are preceded/succeeded by an unsigned leb128 coded integer.
if (av1_write_uleb_obu_size(obu_header_size, obu_payload_size,
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 84b9633..90b67f3 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3275,11 +3275,11 @@
}
uint32_t av1_write_obu_header(AV1LevelParams *const level_params,
- OBU_TYPE obu_type, int obu_extension,
- uint8_t *const dst) {
+ int *frame_header_count, OBU_TYPE obu_type,
+ int obu_extension, uint8_t *const dst) {
if (level_params->keep_level_stats &&
(obu_type == OBU_FRAME || obu_type == OBU_FRAME_HEADER))
- ++level_params->frame_header_count;
+ ++(*frame_header_count);
struct aom_write_bit_buffer wb = { dst, 0 };
uint32_t size = 0;
@@ -3480,7 +3480,8 @@
// 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;
- lst_obu->tg_hdr_size = av1_write_obu_header(level_params, obu_type, 0, *data);
+ lst_obu->tg_hdr_size = av1_write_obu_header(
+ level_params, &cpi->frame_header_count, obu_type, 0, *data);
*data += lst_obu->tg_hdr_size;
const uint32_t frame_header_size =
@@ -3687,9 +3688,9 @@
// A new tile group begins at this tile. Write the obu header and
// tile group header
const OBU_TYPE obu_type = (cpi->num_tg == 1) ? OBU_FRAME : OBU_TILE_GROUP;
- *curr_tg_hdr_size =
- av1_write_obu_header(&cpi->level_params, obu_type,
- pack_bs_params->obu_extn_header, tile_data_curr);
+ *curr_tg_hdr_size = av1_write_obu_header(
+ &cpi->level_params, &cpi->frame_header_count, obu_type,
+ pack_bs_params->obu_extn_header, tile_data_curr);
*pack_bs_params->obu_header_size = *curr_tg_hdr_size;
if (cpi->num_tg == 1)
@@ -3829,7 +3830,8 @@
// Rewrite the OBU header to change the OBU type to Redundant Frame
// Header.
av1_write_obu_header(
- &cpi->level_params, OBU_REDUNDANT_FRAME_HEADER, obu_extn_header,
+ &cpi->level_params, &cpi->frame_header_count,
+ OBU_REDUNDANT_FRAME_HEADER, obu_extn_header,
&tile_data_curr[fh_info->obu_header_byte_offset]);
tile_data_curr += fh_info->total_length;
@@ -3970,8 +3972,8 @@
(cm->current_frame.frame_type != KEY_FRAME &&
current_metadata->insert_flag == AOM_MIF_NON_KEY_FRAME) ||
current_metadata->insert_flag == AOM_MIF_ANY_FRAME) {
- obu_header_size =
- av1_write_obu_header(&cpi->level_params, OBU_METADATA, 0, dst);
+ obu_header_size = av1_write_obu_header(
+ &cpi->level_params, &cpi->frame_header_count, OBU_METADATA, 0, dst);
obu_payload_size =
av1_write_metadata_obu(current_metadata, dst + obu_header_size);
length_field_size = obu_memmove(obu_header_size, obu_payload_size, dst);
@@ -4011,14 +4013,14 @@
bitstream_queue_reset_write();
#endif
- level_params->frame_header_count = 0;
+ cpi->frame_header_count = 0;
// The TD is now written outside the frame encode loop
// write sequence header obu if KEY_FRAME, preceded by 4-byte size
if (cm->current_frame.frame_type == KEY_FRAME && !cpi->no_show_fwd_kf) {
- obu_header_size =
- av1_write_obu_header(level_params, OBU_SEQUENCE_HEADER, 0, data);
+ obu_header_size = av1_write_obu_header(
+ level_params, &cpi->frame_header_count, OBU_SEQUENCE_HEADER, 0, data);
obu_payload_size =
av1_write_sequence_header_obu(&cm->seq_params, data + obu_header_size);
@@ -4042,8 +4044,9 @@
if (write_frame_header) {
// Write Frame Header OBU.
fh_info.frame_header = data;
- obu_header_size = av1_write_obu_header(level_params, OBU_FRAME_HEADER,
- obu_extension_header, data);
+ obu_header_size =
+ av1_write_obu_header(level_params, &cpi->frame_header_count,
+ OBU_FRAME_HEADER, obu_extension_header, data);
obu_payload_size =
write_frame_header_obu(cpi, &saved_wb, data + obu_header_size, 1);
diff --git a/av1/encoder/bitstream.h b/av1/encoder/bitstream.h
index df35ecc..7ba690b 100644
--- a/av1/encoder/bitstream.h
+++ b/av1/encoder/bitstream.h
@@ -29,8 +29,8 @@
// Writes the OBU header byte, and the OBU header extension byte when
// 'obu_extension' is non-zero. Returns number of bytes written to 'dst'.
uint32_t av1_write_obu_header(AV1LevelParams *const level_params,
- OBU_TYPE obu_type, int obu_extension,
- uint8_t *const dst);
+ int *frame_header_count, OBU_TYPE obu_type,
+ int obu_extension, uint8_t *const dst);
int av1_write_uleb_obu_size(size_t obu_header_size, size_t obu_payload_size,
uint8_t *dest);
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 4240dbb..bdfdcd8 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -4055,7 +4055,8 @@
if (payload_offset + sequence_header_size > sizeof(header_buf)) return NULL;
memmove(&header_buf[payload_offset], &header_buf[0], sequence_header_size);
- if (av1_write_obu_header(&cpi->level_params, OBU_SEQUENCE_HEADER, 0,
+ if (av1_write_obu_header(&cpi->level_params, &cpi->frame_header_count,
+ OBU_SEQUENCE_HEADER, 0,
&header_buf[0]) != obu_header_size) {
return NULL;
}
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 6652964..021d5ab 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -2586,6 +2586,11 @@
#endif
/*!
+ * Count the number of OBU_FRAME and OBU_FRAME_HEADER for level calculation.
+ */
+ int frame_header_count;
+
+ /*!
* Parameters for AV1 bitstream levels.
*/
AV1LevelParams level_params;
diff --git a/av1/encoder/level.c b/av1/encoder/level.c
index 7a74c46..b56a325 100644
--- a/av1/encoder/level.c
+++ b/av1/encoder/level.c
@@ -1057,7 +1057,7 @@
const int tile_rows = cm->tiles.rows;
const int tiles = tile_cols * tile_rows;
const int luma_pic_size = upscaled_width * height;
- const int frame_header_count = level_params->frame_header_count;
+ const int frame_header_count = cpi->frame_header_count;
const int show_frame = cm->show_frame;
const int show_existing_frame = cm->show_existing_frame;
diff --git a/av1/encoder/level.h b/av1/encoder/level.h
index 5e0cce2..2800e3d 100644
--- a/av1/encoder/level.h
+++ b/av1/encoder/level.h
@@ -164,8 +164,6 @@
uint32_t keep_level_stats;
// Level information for each operating point.
AV1LevelInfo *level_info[MAX_NUM_OPERATING_POINTS];
- // Count the number of OBU_FRAME and OBU_FRAME_HEADER for level calculation.
- int frame_header_count;
} AV1LevelParams;
static INLINE int is_in_operating_point(int operating_point,