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;