Fix total_time_encoded calc in AV1LevelStats
Level monitoring stats are reset every key frame,
hence total_compressed_size would be reset to 0, but
total_time_encoded would still be maintained as time
encoded from the first frame. This is incorrect and
caused the average bitrate to drop significantly in
the monitoring process after a keyframe. This commit
resets the total_time_encoded after every key frame, to
calculate the correct average bit-rate, correctly over
each key interval.
BUG=aomedia:2739
Change-Id: I9d6394ca4e520a4fac9cf743c6ff4bf0a6cbf27d
diff --git a/av1/encoder/level.c b/av1/encoder/level.c
index 3403a3a..a7005a3 100644
--- a/av1/encoder/level.c
+++ b/av1/encoder/level.c
@@ -1072,9 +1072,6 @@
aom_clear_system_state();
const double compression_ratio = av1_get_compression_ratio(cm, size);
- const double total_time_encoded =
- (cpi->time_stamps.prev_end_seen - cpi->time_stamps.first_ever) /
- (double)TICKS_PER_SEC;
const int temporal_layer_id = cm->temporal_layer_id;
const int spatial_layer_id = cm->spatial_layer_id;
@@ -1131,7 +1128,9 @@
show_frame ? count_frames(buffer, TICKS_PER_SEC) : 0;
scan_past_frames(buffer, encoded_frames_in_last_second, level_spec,
level_stats);
- level_stats->total_time_encoded = total_time_encoded;
+ level_stats->total_time_encoded +=
+ (cpi->time_stamps.prev_end_seen - cpi->time_stamps.prev_start_seen) /
+ (double)TICKS_PER_SEC;
}
DECODER_MODEL *const decoder_models = level_info->decoder_models;
diff --git a/test/level_test.cc b/test/level_test.cc
index 9fa617e..82ada98 100644
--- a/test/level_test.cc
+++ b/test/level_test.cc
@@ -129,13 +129,14 @@
TEST_P(LevelTest, TestLevelMonitoringHighBitrate) {
// To save run time, we only test speed 4.
- if (cpu_used_ == 4 && encoding_mode_ == ::libaom_test::kTwoPassGood) {
+ if (cpu_used_ == 4) {
libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
30, 1, 0, 40);
target_level_ = kLevelKeepStats;
cfg_.rc_target_bitrate = 4000;
+ cfg_.g_limit = 40;
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
- ASSERT_EQ(level_[0], 0);
+ ASSERT_EQ(level_[0], 4);
}
}