AV1 levels: assign a frame info buffer for each OP
Each operating point should have its own buffer to store the stats of the
previously encoded frames.
BUG=aomedia:2332
Change-Id: I493c9a9414877a51d18f1c965a26c64cbab15412
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index ac8d055..0d7ff00 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -1017,7 +1017,6 @@
AV1LevelInfo *level_info[MAX_NUM_OPERATING_POINTS];
// Count the number of OBU_FRAME and OBU_FRAME_HEADER for level calculation.
int frame_header_count;
- FrameWindowBuffer frame_window_buffer;
// whether any no-zero delta_q was actually used
int deltaq_used;
diff --git a/av1/encoder/level.c b/av1/encoder/level.c
index 184c977..085c690 100644
--- a/av1/encoder/level.c
+++ b/av1/encoder/level.c
@@ -687,6 +687,11 @@
level_stats->tile_width_is_valid = 1;
level_stats->min_cr = 1e8;
+ FrameWindowBuffer *const frame_window_buffer =
+ &this_level_info->frame_window_buffer;
+ frame_window_buffer->num = 0;
+ frame_window_buffer->start = 0;
+
const AV1_COMMON *const cm = &cpi->common;
const int upscaled_width = cm->superres_upscaled_width;
const int height = cm->height;
@@ -1026,14 +1031,6 @@
const int show_frame = cm->show_frame;
const int show_existing_frame = cm->show_existing_frame;
- // Store info. of current frame into FrameWindowBuffer.
- FrameWindowBuffer *const buffer = &cpi->frame_window_buffer;
- store_frame_record(ts_start, ts_end, size, luma_pic_size, frame_header_count,
- tiles, show_frame, show_existing_frame, buffer);
- // Count the number of frames encoded in the past 1 second.
- const int encoded_frames_in_last_second =
- show_frame ? count_frames(buffer, TICKS_PER_SEC) : 0;
-
int max_tile_size;
int min_cropped_tile_width;
int min_cropped_tile_height;
@@ -1093,7 +1090,15 @@
level_spec->max_tile_cols = AOMMAX(level_spec->max_tile_cols, tile_cols);
level_spec->max_tiles = AOMMAX(level_spec->max_tiles, tiles);
+ // Store info. of current frame into FrameWindowBuffer.
+ FrameWindowBuffer *const buffer = &level_info->frame_window_buffer;
+ store_frame_record(ts_start, ts_end, size, luma_pic_size,
+ frame_header_count, tiles, show_frame,
+ show_existing_frame, buffer);
if (show_frame) {
+ // Count the number of frames encoded in the past 1 second.
+ const int encoded_frames_in_last_second =
+ show_frame ? count_frames(buffer, TICKS_PER_SEC) : 0;
scan_past_frames(buffer, encoded_frames_in_last_second, level_spec,
level_stats);
}
diff --git a/av1/encoder/level.h b/av1/encoder/level.h
index d8964a4..2af9b2d 100644
--- a/av1/encoder/level.h
+++ b/av1/encoder/level.h
@@ -150,6 +150,7 @@
typedef struct {
AV1LevelStats level_stats;
AV1LevelSpec level_spec;
+ FrameWindowBuffer frame_window_buffer;
DECODER_MODEL decoder_models[SEQ_LEVELS];
} AV1LevelInfo;