FPMT: Initialize cpi elements for parallel encode frames
Initialized gf_frame_index, frame_number and do_frame_data_update
for frames belonging to a parallel encode set.
Change-Id: I1a950c858b2627ad5ebdb8c09c98c50484e106c7
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index a978754..7251c8b 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -2279,3 +2279,50 @@
cpi->ppi->p_mt_info.num_mod_workers[i] =
compute_num_mod_workers(cpi, (MULTI_THREADED_MODULES)i);
}
+
+#if CONFIG_FRAME_PARALLEL_ENCODE
+// Initialises frames belonging to a parallel encode set.
+static AOM_INLINE int init_parallel_frame_context(AV1_PRIMARY *const ppi) {
+ AV1_COMP *const first_cpi = ppi->cpi;
+ GF_GROUP *const gf_group = &ppi->gf_group;
+ int gf_index_start = first_cpi->gf_frame_index;
+ assert(gf_group->frame_parallel_level[gf_index_start] == 1);
+ int parallel_frame_count = 0;
+ int cur_frame_num = first_cpi->common.current_frame.frame_number;
+
+ // Set do_frame_data_update flag as false for frame_parallel_level 1 frame.
+ first_cpi->do_frame_data_update = false;
+ parallel_frame_count++;
+ if (gf_group->arf_src_offset[gf_index_start] == 0) cur_frame_num++;
+
+ // Iterate through the GF_GROUP to find the remaining frame_parallel_level 2
+ // frames which are part of the current parallel encode set and initialize the
+ // required cpi elements.
+ for (int i = gf_index_start + 1; i < gf_group->size; i++) {
+ if (gf_group->frame_parallel_level[i] == 2) {
+ AV1_COMP *cur_cpi = ppi->parallel_cpi[parallel_frame_count];
+ cur_cpi->gf_frame_index = i;
+ cur_cpi->common.current_frame.frame_number = cur_frame_num;
+ cur_cpi->do_frame_data_update = false;
+ parallel_frame_count++;
+ }
+
+ // Set do_frame_data_update to true for the last frame_parallel_level 2
+ // frame in the current parallel encode set.
+ if (i == (gf_group->size - 1) ||
+ (gf_group->frame_parallel_level[i + 1] == 0 &&
+ (gf_group->update_type[i + 1] == ARF_UPDATE ||
+ gf_group->update_type[i + 1] == INTNL_ARF_UPDATE)) ||
+ gf_group->frame_parallel_level[i + 1] == 1) {
+ ppi->parallel_cpi[parallel_frame_count - 1]->do_frame_data_update = true;
+ break;
+ }
+
+ // Incremet cur_frame_num for show frame(s) and show existing frame(s).
+ if (gf_group->arf_src_offset[i] == 0) cur_frame_num++;
+ }
+
+ // Return the number of frames in the parallel encode set.
+ return parallel_frame_count;
+}
+#endif // CONFIG_FRAME_PARALLEL_ENCODE