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),