Enable full pipeline in qmode rc encoder
Change-Id: I529a579480556fce80928275e5c0b9722b38bc9b
diff --git a/apps/qmode_rc_encoder.cc b/apps/qmode_rc_encoder.cc
index 8e7c3a6..b4a4263 100644
--- a/apps/qmode_rc_encoder.cc
+++ b/apps/qmode_rc_encoder.cc
@@ -24,7 +24,7 @@
std::string input_file = "/export/hda3/Videos/derf/bus_cif.y4m";
aom_rational_t frame_rate = { 30, 1 };
aom::VideoInfo input_video = { 352, 288, frame_rate, AOM_IMG_FMT_I420,
- 55, input_file };
+ 25, input_file };
aom::DuckyEncode ducky_encode(input_video);
aom::AV1RateControlQMode qmode_rc;
aom::RateControlParam rc_param = {};
@@ -33,6 +33,7 @@
rc_param.max_gop_show_frame_count = 16;
rc_param.min_gop_show_frame_count = 4;
rc_param.ref_frame_table_size = 7;
+ rc_param.base_q_index = 128;
const aom::Status status = qmode_rc.SetRcParam(rc_param);
@@ -66,25 +67,21 @@
// TODO(jingning): Extract the tpl stats through ducky_encode and make
// frame encoding decisions.
- aom::GopEncodeInfo gop_encode_info;
- // = qmode_rc.GetGopEncodeInfo(gop_struct, tpl_gop_stats, ref_frame_table);
+ aom::GopEncodeInfo gop_encode_info =
+ qmode_rc.GetGopEncodeInfo(gop_struct, tpl_gop_stats, ref_frame_table);
ref_frame_table = gop_encode_info.final_snapshot;
gop_encode_info_list.push_back(gop_encode_info);
}
-
ducky_encode.EndEncode();
fprintf(stderr, "tpl stats completed.\n");
- // TODO(jingning): Re-enable the next final encoding stage once the TPL stats
- // collection is done.
- return 0;
-
// Full encoding of the video sequence.
// Do binary search with rc_param.base_q_index around this block.
ducky_encode.StartEncode(frame_stats);
ducky_encode.EncodeVideo(gop_list, gop_encode_info_list);
ducky_encode.EndEncode();
+ fprintf(stderr, "final encoding completed.\n");
return 0;
}
diff --git a/av1/ducky_encode.cc b/av1/ducky_encode.cc
index 8919531..449c349 100644
--- a/av1/ducky_encode.cc
+++ b/av1/ducky_encode.cc
@@ -356,13 +356,15 @@
const uint8_t block_mis_log2 = ppi->tpl_data.tpl_stats_block_mis_log2;
for (size_t idx = 0; idx < gop_struct.gop_frame_list.size(); ++idx) {
- TplFrameStats tpl_frame_stats;
+ TplFrameStats tpl_frame_stats = {};
TplDepFrame *tpl_frame = &ppi->tpl_data.tpl_frame[idx];
if (gop_struct.gop_frame_list[idx].update_type == GopFrameType::kOverlay ||
gop_struct.gop_frame_list[idx].update_type ==
- GopFrameType::kIntermediateOverlay)
+ GopFrameType::kIntermediateOverlay) {
+ tpl_gop_stats.frame_stats_list.push_back(tpl_frame_stats);
continue;
+ }
const int mi_rows = tpl_frame->mi_rows;
const int mi_cols = tpl_frame->mi_cols;
diff --git a/av1/ratectrl_qmode.cc b/av1/ratectrl_qmode.cc
index 18b3d62..02824d3 100644
--- a/av1/ratectrl_qmode.cc
+++ b/av1/ratectrl_qmode.cc
@@ -1091,10 +1091,12 @@
TplGopDepStats ComputeTplGopDepStats(
const TplGopStats &tpl_gop_stats,
- const std::vector<RefFrameTable> &ref_frame_table_list,
- const int frame_count) {
+ const std::vector<RefFrameTable> &ref_frame_table_list) {
+ const int frame_count =
+ static_cast<int>(tpl_gop_stats.frame_stats_list.size());
// Create the struct to store TPL dependency stats
TplGopDepStats tpl_gop_dep_stats;
+
for (int coding_idx = 0; coding_idx < frame_count; coding_idx++) {
tpl_gop_dep_stats.frame_dep_stats_list.push_back(
CreateTplFrameDepStatsWithoutPropagation(
@@ -1135,29 +1137,37 @@
GopEncodeInfo gop_encode_info;
gop_encode_info.final_snapshot = ref_frame_table_list.back();
- TplGopDepStats gop_dep_stats = ComputeTplGopDepStats(
- tpl_gop_stats, ref_frame_table_list, gop_struct.show_frame_count);
+ TplGopDepStats gop_dep_stats =
+ ComputeTplGopDepStats(tpl_gop_stats, ref_frame_table_list);
const int frame_count =
static_cast<int>(tpl_gop_stats.frame_stats_list.size());
for (int i = 0; i < frame_count; i++) {
- const TplFrameDepStats &frame_dep_stats =
- gop_dep_stats.frame_dep_stats_list[i];
- const double cost_without_propagation =
- TplFrameDepStatsAccumulateIntraCost(frame_dep_stats);
- const double cost_with_propagation =
- TplFrameDepStatsAccumulate(frame_dep_stats);
- const double frame_importance =
- cost_with_propagation / cost_without_propagation;
- // Imitate the behavior of av1_tpl_get_qstep_ratio()
- const double qstep_ratio = sqrt(1 / frame_importance);
FrameEncodeParameters param;
- param.q_index = av1_get_q_index_from_qstep_ratio(rc_param_.base_q_index,
- qstep_ratio, AOM_BITS_8);
const GopFrame &gop_frame = gop_struct.gop_frame_list[i];
- if (gop_frame.is_key_frame) {
- // TODO(jianj): QP for key frame could be 0 when base q index is set very
- // low. Tune the calculation for frame_importance. Cap it at 1 for now.
- param.q_index = AOMMAX(param.q_index, 1);
+
+ if (gop_frame.update_type == GopFrameType::kOverlay ||
+ gop_frame.update_type == GopFrameType::kIntermediateOverlay) {
+ param.q_index = rc_param_.base_q_index;
+ } else {
+ const TplFrameDepStats &frame_dep_stats =
+ gop_dep_stats.frame_dep_stats_list[i];
+ const double cost_without_propagation =
+ TplFrameDepStatsAccumulateIntraCost(frame_dep_stats);
+ const double cost_with_propagation =
+ TplFrameDepStatsAccumulate(frame_dep_stats);
+ const double frame_importance =
+ cost_with_propagation / cost_without_propagation;
+ // Imitate the behavior of av1_tpl_get_qstep_ratio()
+ const double qstep_ratio = sqrt(1 / frame_importance);
+ param.q_index = av1_get_q_index_from_qstep_ratio(rc_param_.base_q_index,
+ qstep_ratio, AOM_BITS_8);
+
+ if (gop_frame.is_key_frame) {
+ // TODO(jianj): QP for key frame could be 0 when base q index is set
+ // very low. Tune the calculation for frame_importance. Cap it at 1 for
+ // now.
+ param.q_index = AOMMAX(param.q_index, 1);
+ }
}
param.rdmult = GetRDMult(gop_frame, param.q_index);
gop_encode_info.param_list.push_back(param);
diff --git a/av1/ratectrl_qmode.h b/av1/ratectrl_qmode.h
index cceb217..4517d2d 100644
--- a/av1/ratectrl_qmode.h
+++ b/av1/ratectrl_qmode.h
@@ -81,8 +81,7 @@
TplGopDepStats ComputeTplGopDepStats(
const TplGopStats &tpl_gop_stats,
- const std::vector<RefFrameTable> &ref_frame_table_list,
- const int frame_count);
+ const std::vector<RefFrameTable> &ref_frame_table_list);
class AV1RateControlQMode : public AV1RateControlQModeInterface {
public:
diff --git a/test/ratectrl_qmode_test.cc b/test/ratectrl_qmode_test.cc
index 5b9aa99..d2eb25c 100644
--- a/test/ratectrl_qmode_test.cc
+++ b/test/ratectrl_qmode_test.cc
@@ -626,8 +626,8 @@
ref_frame_table_list.push_back(CreateToyRefFrameTable(i));
}
- const TplGopDepStats &gop_dep_stats = ComputeTplGopDepStats(
- tpl_gop_stats, ref_frame_table_list, gop_struct.show_frame_count);
+ const TplGopDepStats &gop_dep_stats =
+ ComputeTplGopDepStats(tpl_gop_stats, ref_frame_table_list);
double expected_sum = 0;
for (int i = 2; i >= 0; i--) {