Initialize level info. before each sequence
Before this patch, the level info. structure is only initialized once at
encoder creation.
BUG=aomedia:2332
Change-Id: I15141eda5509e266e19472e52e9fd171a173a10a
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 818e43c..c79d511 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2548,21 +2548,6 @@
}
}
-static void init_level_info(AV1LevelInfo *level_info) {
- memset(level_info, 0, MAX_NUM_OPERATING_POINTS * sizeof(*level_info));
- for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
- AV1LevelSpec *const level_spec = &level_info[i].level_spec;
- level_spec->level = SEQ_LEVEL_MAX;
- AV1LevelStats *const level_stats = &level_info[i].level_stats;
- level_stats->min_cropped_tile_width = INT_MAX;
- level_stats->min_cropped_tile_height = INT_MAX;
- level_stats->min_frame_width = INT_MAX;
- level_stats->min_frame_height = INT_MAX;
- level_stats->tile_width_is_valid = 1;
- level_stats->min_cr = 1e8;
- }
-}
-
AV1_COMP *av1_create_compressor(AV1EncoderConfig *oxcf,
BufferPool *const pool) {
unsigned int i;
@@ -2624,7 +2609,7 @@
cpi->refresh_alt_ref_frame = 0;
- init_level_info(cpi->level_info);
+ av1_init_level_info(cpi->level_info);
cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
#if CONFIG_INTERNAL_STATS
@@ -5477,8 +5462,14 @@
generate_psnr_packet(cpi);
}
}
- if (cpi->keep_level_stats && oxcf->pass != 1)
+
+ if (cpi->keep_level_stats && oxcf->pass != 1) {
+ // Initialize level info. at the beginning of each sequence.
+ if (cm->current_frame.frame_type == KEY_FRAME && cm->show_frame) {
+ av1_init_level_info(cpi->level_info);
+ }
av1_update_level_info(cpi, *size, *time_stamp, *time_end);
+ }
#if CONFIG_INTERNAL_STATS
if (oxcf->pass != 1) {
diff --git a/av1/encoder/level.c b/av1/encoder/level.c
index aadbcd1..6f43d06 100644
--- a/av1/encoder/level.c
+++ b/av1/encoder/level.c
@@ -262,6 +262,21 @@
"The product of max tile size and header rate is too high.",
};
+void av1_init_level_info(AV1LevelInfo *level_info) {
+ memset(level_info, 0, MAX_NUM_OPERATING_POINTS * sizeof(*level_info));
+ for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
+ AV1LevelSpec *const level_spec = &level_info[i].level_spec;
+ level_spec->level = SEQ_LEVEL_MAX;
+ AV1LevelStats *const level_stats = &level_info[i].level_stats;
+ level_stats->min_cropped_tile_width = INT_MAX;
+ level_stats->min_cropped_tile_height = INT_MAX;
+ level_stats->min_frame_width = INT_MAX;
+ level_stats->min_frame_height = INT_MAX;
+ level_stats->tile_width_is_valid = 1;
+ level_stats->min_cr = 1e8;
+ }
+}
+
static double get_min_cr(const AV1LevelSpec *const level_spec, int tier,
int is_still_picture, int64_t decoded_sample_rate) {
if (is_still_picture) return 0.8;
diff --git a/av1/encoder/level.h b/av1/encoder/level.h
index 9f1664d..b2c1156 100644
--- a/av1/encoder/level.h
+++ b/av1/encoder/level.h
@@ -71,6 +71,8 @@
AV1LevelSpec level_spec;
} AV1LevelInfo;
+void av1_init_level_info(AV1LevelInfo *level_info);
+
void av1_update_level_info(struct AV1_COMP *cpi, size_t size, int64_t ts_start,
int64_t ts_end);