Let construct_gop set global_[coding/order]_idx

We also add global_[coding/order]_idx_offset into GopStruct.
Unit tests are added as well.

Bug: b/221916304
Change-Id: I7aa6c3f23e227ad822075058779f5a42f7ac4188
diff --git a/av1/ratectrl_qmode.cc b/av1/ratectrl_qmode.cc
index 2009a9a..df38b19 100644
--- a/av1/ratectrl_qmode.cc
+++ b/av1/ratectrl_qmode.cc
@@ -39,7 +39,7 @@
 GopFrame gop_frame_basic(int coding_idx, int order_idx, bool is_key_frame,
                          bool is_arf_frame, bool is_golden_frame,
                          bool is_show_frame, int depth) {
-  GopFrame gop_frame;
+  GopFrame gop_frame = {};
   gop_frame.is_valid = true;
   gop_frame.coding_idx = coding_idx;
   gop_frame.order_idx = order_idx;
@@ -96,9 +96,13 @@
 }
 
 GopStruct construct_gop(RefFrameManager *ref_frame_manager,
-                        int show_frame_count, bool has_key_frame) {
+                        int show_frame_count, bool has_key_frame,
+                        int global_coding_idx_offset,
+                        int global_order_idx_offset) {
   GopStruct gop_struct;
   gop_struct.show_frame_count = show_frame_count;
+  gop_struct.global_coding_idx_offset = global_coding_idx_offset;
+  gop_struct.global_order_idx_offset = global_order_idx_offset;
   int order_start = 0;
   int order_arf = show_frame_count - 1;
   int coding_idx;
@@ -131,6 +135,12 @@
   ref_frame_manager->UpdateFrame(&gop_frame, RefUpdateType::kNone,
                                  EncodeRefMode::kOverlay);
   gop_struct.gop_frame_list.push_back(gop_frame);
+
+  for (auto &gop_frame : gop_struct.gop_frame_list) {
+    gop_frame.global_coding_idx =
+        global_coding_idx_offset + gop_frame.coding_idx;
+    gop_frame.global_order_idx = global_order_idx_offset + gop_frame.order_idx;
+  }
   return gop_struct;
 }
 
@@ -619,6 +629,8 @@
 
   RefFrameManager ref_frame_manager(rc_param_.max_ref_frames);
 
+  int global_coding_idx_offset = 0;
+  int global_order_idx_offset = 0;
   while (remaining_show_frame_count > 0) {
     int show_frame_count =
         std::min(remaining_show_frame_count, max_gop_show_frame_count);
@@ -626,7 +638,11 @@
     // stats here.
     bool has_key_frame = gop_list.size() == 0;
     GopStruct gop =
-        construct_gop(&ref_frame_manager, show_frame_count, has_key_frame);
+        construct_gop(&ref_frame_manager, show_frame_count, has_key_frame,
+                      global_coding_idx_offset, global_order_idx_offset);
+    global_coding_idx_offset += static_cast<int>(gop.gop_frame_list.size());
+    global_order_idx_offset += gop.show_frame_count;
+
     gop_list.push_back(gop);
     remaining_show_frame_count -= show_frame_count;
   }
diff --git a/av1/ratectrl_qmode.h b/av1/ratectrl_qmode.h
index c53f4e1..063c785 100644
--- a/av1/ratectrl_qmode.h
+++ b/av1/ratectrl_qmode.h
@@ -41,7 +41,9 @@
                          bool is_show_frame, int depth);
 
 GopStruct construct_gop(RefFrameManager *ref_frame_manager,
-                        int show_frame_count, bool has_key_frame);
+                        int show_frame_count, bool has_key_frame,
+                        int global_coding_idx_offset,
+                        int global_order_idx_offset);
 
 TplFrameDepStats create_tpl_frame_dep_stats_empty(int frame_height,
                                                   int frame_width,
diff --git a/av1/ratectrl_qmode_interface.h b/av1/ratectrl_qmode_interface.h
index fdd4a09..0129e2b 100644
--- a/av1/ratectrl_qmode_interface.h
+++ b/av1/ratectrl_qmode_interface.h
@@ -85,6 +85,8 @@
 
 struct GopStruct {
   int show_frame_count;
+  int global_coding_idx_offset;
+  int global_order_idx_offset;
   std::vector<GopFrame> gop_frame_list;
 };
 
diff --git a/test/ratectrl_qmode_test.cc b/test/ratectrl_qmode_test.cc
index 2bf6c68..344e2e1 100644
--- a/test/ratectrl_qmode_test.cc
+++ b/test/ratectrl_qmode_test.cc
@@ -26,13 +26,38 @@
 
 void test_gop_display_order(const GopStruct &gop_struct) {
   // Test whether show frames' order indices are sequential
-  int ref_order_idx = 0;
+  int expected_order_idx = 0;
+  int expected_show_frame_count = 0;
   for (const auto &gop_frame : gop_struct.gop_frame_list) {
     if (gop_frame.is_show_frame) {
-      EXPECT_EQ(gop_frame.order_idx, ref_order_idx);
-      ref_order_idx++;
+      EXPECT_EQ(gop_frame.order_idx, expected_order_idx);
+      expected_order_idx++;
+      expected_show_frame_count++;
     }
   }
+  EXPECT_EQ(gop_struct.show_frame_count, expected_show_frame_count);
+}
+
+void test_gop_global_order_idx(const GopStruct &gop_struct,
+                               int global_order_idx_offset) {
+  // Test whether show frames' global order indices are sequential
+  EXPECT_EQ(gop_struct.global_order_idx_offset, global_order_idx_offset);
+  int expected_global_order_idx = global_order_idx_offset;
+  for (const auto &gop_frame : gop_struct.gop_frame_list) {
+    if (gop_frame.is_show_frame) {
+      EXPECT_EQ(gop_frame.global_order_idx, expected_global_order_idx);
+      expected_global_order_idx++;
+    }
+  }
+}
+
+void test_gop_global_coding_idx(const GopStruct &gop_struct,
+                                int global_coding_idx_offset) {
+  EXPECT_EQ(gop_struct.global_coding_idx_offset, global_coding_idx_offset);
+  for (const auto &gop_frame : gop_struct.gop_frame_list) {
+    EXPECT_EQ(gop_frame.global_coding_idx,
+              global_coding_idx_offset + gop_frame.coding_idx);
+  }
 }
 
 void test_colocated_show_frame(const GopStruct &gop_struct) {
@@ -95,10 +120,16 @@
   int show_frame_count = 16;
   const int max_ref_frames = 8;
   const bool has_key_frame = false;
+  const int global_coding_idx_offset = 5;
+  const int global_order_idx_offset = 20;
   RefFrameManager ref_frame_manager(max_ref_frames);
   GopStruct gop_struct =
-      construct_gop(&ref_frame_manager, show_frame_count, has_key_frame);
+      construct_gop(&ref_frame_manager, show_frame_count, has_key_frame,
+                    global_coding_idx_offset, global_order_idx_offset);
+  EXPECT_EQ(gop_struct.show_frame_count, show_frame_count);
   test_gop_display_order(gop_struct);
+  test_gop_global_order_idx(gop_struct, global_order_idx_offset);
+  test_gop_global_coding_idx(gop_struct, global_coding_idx_offset);
   test_colocated_show_frame(gop_struct);
   const int max_layer_depth =
       ref_frame_manager.ForwardMaxSize() + kLayerDepthOffset;
@@ -107,13 +138,19 @@
 }
 
 TEST(RateControlQModeTest, ConstructGopKey) {
-  int show_frame_count = 16;
-  int max_ref_frames = 8;
-  int has_key_frame = 1;
+  const int show_frame_count = 16;
+  const int max_ref_frames = 8;
+  const int has_key_frame = 1;
+  const int global_coding_idx_offset = 10;
+  const int global_order_idx_offset = 8;
   RefFrameManager ref_frame_manager(max_ref_frames);
   GopStruct gop_struct =
-      construct_gop(&ref_frame_manager, show_frame_count, has_key_frame);
+      construct_gop(&ref_frame_manager, show_frame_count, has_key_frame,
+                    global_coding_idx_offset, global_order_idx_offset);
+  EXPECT_EQ(gop_struct.show_frame_count, show_frame_count);
   test_gop_display_order(gop_struct);
+  test_gop_global_order_idx(gop_struct, global_order_idx_offset);
+  test_gop_global_coding_idx(gop_struct, global_coding_idx_offset);
   test_colocated_show_frame(gop_struct);
   const int max_layer_depth =
       ref_frame_manager.ForwardMaxSize() + kLayerDepthOffset;
@@ -392,7 +429,7 @@
   MockRateControlQMode mock_rc;
   EXPECT_CALL(mock_rc,
               DetermineGopInfo(Field(&FirstpassInfo::num_mbs_16x16, 1000)))
-      .WillOnce(Return(GopStructList{ { 6, {} }, { 4, {} } }));
+      .WillOnce(Return(GopStructList{ { 6, 0, 0, {} }, { 4, 0, 0, {} } }));
   FirstpassInfo firstpass_info = {};
   firstpass_info.num_mbs_16x16 = 1000;
   EXPECT_THAT(mock_rc.DetermineGopInfo(firstpass_info),