Make stackless reference handling logic default
Made the stackless reference handling logic used in FPMT default.
Cleaned up the redundant stack based reference handling code.
STATS_CHANGED
Change-Id: I361cf663c67360452ad5c9f11b3e917a30cdfff5
diff --git a/av1/common/av1_common_int.h b/av1/common/av1_common_int.h
index e20e0c7..226dd7c 100644
--- a/av1/common/av1_common_int.h
+++ b/av1/common/av1_common_int.h
@@ -134,10 +134,8 @@
// distance when a very old frame is used as a reference.
unsigned int display_order_hint;
unsigned int ref_display_order_hint[INTER_REFS_PER_FRAME];
-#if CONFIG_FRAME_PARALLEL_ENCODE
// Frame's level within the hierarchical structure.
unsigned int pyramid_level;
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
MV_REF *mvs;
uint8_t *seg_map;
struct segmentation seg;
@@ -344,10 +342,8 @@
unsigned int order_hint;
unsigned int display_order_hint;
-#if CONFIG_FRAME_PARALLEL_ENCODE
// Frame's level within the hierarchical structure.
unsigned int pyramid_level;
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
unsigned int frame_number;
SkipModeInfo skip_mode_info;
int refresh_frame_flags; // Which ref frames are overwritten by this frame
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c
index 837df2c..d8889f3 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -838,9 +838,7 @@
void av1_setup_frame_buf_refs(AV1_COMMON *cm) {
cm->cur_frame->order_hint = cm->current_frame.order_hint;
cm->cur_frame->display_order_hint = cm->current_frame.display_order_hint;
-#if CONFIG_FRAME_PARALLEL_ENCODE
cm->cur_frame->pyramid_level = cm->current_frame.pyramid_level;
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
MV_REFERENCE_FRAME ref_frame;
for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 3fd6107..11708a2 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -506,171 +506,12 @@
return ref_map_index;
}
-static void update_arf_stack(int ref_map_index,
- RefBufferStack *ref_buffer_stack) {
- if (ref_buffer_stack->arf_stack_size >= 0) {
- if (ref_buffer_stack->arf_stack[0] == ref_map_index)
- stack_pop(ref_buffer_stack->arf_stack, &ref_buffer_stack->arf_stack_size);
- }
-
- if (ref_buffer_stack->lst_stack_size) {
- for (int i = ref_buffer_stack->lst_stack_size - 1; i >= 0; --i) {
- if (ref_buffer_stack->lst_stack[i] == ref_map_index) {
- for (int idx = i; idx < ref_buffer_stack->lst_stack_size - 1; ++idx)
- ref_buffer_stack->lst_stack[idx] =
- ref_buffer_stack->lst_stack[idx + 1];
- ref_buffer_stack->lst_stack[ref_buffer_stack->lst_stack_size - 1] =
- INVALID_IDX;
- --ref_buffer_stack->lst_stack_size;
- }
- }
- }
-
- if (ref_buffer_stack->gld_stack_size) {
- for (int i = ref_buffer_stack->gld_stack_size - 1; i >= 0; --i) {
- if (ref_buffer_stack->gld_stack[i] == ref_map_index) {
- for (int idx = i; idx < ref_buffer_stack->gld_stack_size - 1; ++idx)
- ref_buffer_stack->gld_stack[idx] =
- ref_buffer_stack->gld_stack[idx + 1];
- ref_buffer_stack->gld_stack[ref_buffer_stack->gld_stack_size - 1] =
- INVALID_IDX;
- --ref_buffer_stack->gld_stack_size;
- }
- }
- }
-}
-
-// Update reference frame stack info.
-void av1_update_ref_frame_map(const AV1_COMP *cpi,
- FRAME_UPDATE_TYPE frame_update_type,
- REFBUF_STATE refbuf_state, int ref_map_index,
- RefBufferStack *ref_buffer_stack) {
- const AV1_COMMON *const cm = &cpi->common;
-
- // TODO(jingning): Consider the S-frame same as key frame for the
- // reference frame tracking purpose. The logic might be better
- // expressed than converting the frame update type.
- if (frame_is_sframe(cm)) frame_update_type = KF_UPDATE;
- if (is_frame_droppable(&cpi->svc, &cpi->ext_flags.refresh_frame)) return;
-
- switch (frame_update_type) {
- case KF_UPDATE:
- stack_reset(ref_buffer_stack->lst_stack,
- &ref_buffer_stack->lst_stack_size);
- stack_reset(ref_buffer_stack->gld_stack,
- &ref_buffer_stack->gld_stack_size);
- stack_reset(ref_buffer_stack->arf_stack,
- &ref_buffer_stack->arf_stack_size);
- stack_push(ref_buffer_stack->gld_stack, &ref_buffer_stack->gld_stack_size,
- ref_map_index);
- break;
- case GF_UPDATE:
- update_arf_stack(ref_map_index, ref_buffer_stack);
- stack_push(ref_buffer_stack->gld_stack, &ref_buffer_stack->gld_stack_size,
- ref_map_index);
- // For nonrd_mode: update LAST as well on GF_UPDATE frame.
- // TODO(jingning, marpan): Why replacing both reference frames with the
- // same decoded frame?
- if (cpi->sf.rt_sf.use_nonrd_pick_mode)
- stack_push(ref_buffer_stack->lst_stack,
- &ref_buffer_stack->lst_stack_size, ref_map_index);
- break;
- case LF_UPDATE:
- update_arf_stack(ref_map_index, ref_buffer_stack);
- stack_push(ref_buffer_stack->lst_stack, &ref_buffer_stack->lst_stack_size,
- ref_map_index);
- break;
- case ARF_UPDATE:
- case INTNL_ARF_UPDATE:
- if (refbuf_state == REFBUF_RESET) {
- stack_reset(ref_buffer_stack->lst_stack,
- &ref_buffer_stack->lst_stack_size);
- stack_reset(ref_buffer_stack->gld_stack,
- &ref_buffer_stack->gld_stack_size);
- stack_reset(ref_buffer_stack->arf_stack,
- &ref_buffer_stack->arf_stack_size);
- } else {
- update_arf_stack(ref_map_index, ref_buffer_stack);
- }
- stack_push(ref_buffer_stack->arf_stack, &ref_buffer_stack->arf_stack_size,
- ref_map_index);
- break;
- case OVERLAY_UPDATE:
- if (refbuf_state == REFBUF_RESET) {
- ref_map_index = stack_pop(ref_buffer_stack->arf_stack,
- &ref_buffer_stack->arf_stack_size);
- stack_reset(ref_buffer_stack->lst_stack,
- &ref_buffer_stack->lst_stack_size);
- stack_reset(ref_buffer_stack->gld_stack,
- &ref_buffer_stack->gld_stack_size);
- stack_reset(ref_buffer_stack->arf_stack,
- &ref_buffer_stack->arf_stack_size);
- stack_push(ref_buffer_stack->gld_stack,
- &ref_buffer_stack->gld_stack_size, ref_map_index);
- } else {
- if (ref_map_index != INVALID_IDX) {
- update_arf_stack(ref_map_index, ref_buffer_stack);
- stack_push(ref_buffer_stack->lst_stack,
- &ref_buffer_stack->lst_stack_size, ref_map_index);
- }
- ref_map_index = stack_pop(ref_buffer_stack->arf_stack,
- &ref_buffer_stack->arf_stack_size);
- stack_push(ref_buffer_stack->gld_stack,
- &ref_buffer_stack->gld_stack_size, ref_map_index);
- }
- break;
- case INTNL_OVERLAY_UPDATE:
- ref_map_index = stack_pop(ref_buffer_stack->arf_stack,
- &ref_buffer_stack->arf_stack_size);
- stack_push(ref_buffer_stack->lst_stack, &ref_buffer_stack->lst_stack_size,
- ref_map_index);
- break;
- default: assert(0 && "unknown type");
- }
- return;
-}
-
-static int get_free_ref_map_index(
-#if CONFIG_FRAME_PARALLEL_ENCODE
- RefFrameMapPair ref_map_pairs[REF_FRAMES],
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- const RefBufferStack *ref_buffer_stack) {
-#if CONFIG_FRAME_PARALLEL_ENCODE
- (void)ref_buffer_stack;
+static int get_free_ref_map_index(RefFrameMapPair ref_map_pairs[REF_FRAMES]) {
for (int idx = 0; idx < REF_FRAMES; ++idx)
if (ref_map_pairs[idx].disp_order == -1) return idx;
return INVALID_IDX;
-#else
- for (int idx = 0; idx < REF_FRAMES; ++idx) {
- int is_free = 1;
- for (int i = 0; i < ref_buffer_stack->arf_stack_size; ++i) {
- if (ref_buffer_stack->arf_stack[i] == idx) {
- is_free = 0;
- break;
- }
- }
-
- for (int i = 0; i < ref_buffer_stack->lst_stack_size; ++i) {
- if (ref_buffer_stack->lst_stack[i] == idx) {
- is_free = 0;
- break;
- }
- }
-
- for (int i = 0; i < ref_buffer_stack->gld_stack_size; ++i) {
- if (ref_buffer_stack->gld_stack[i] == idx) {
- is_free = 0;
- break;
- }
- }
-
- if (is_free) return idx;
- }
- return INVALID_IDX;
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
}
-#if CONFIG_FRAME_PARALLEL_ENCODE
static int get_refresh_idx(RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
int update_arf,
#if CONFIG_FRAME_PARALLEL_ENCODE_2
@@ -741,7 +582,7 @@
return -1;
}
-#if CONFIG_FRAME_PARALLEL_ENCODE_2
+#if CONFIG_FRAME_PARALLEL_ENCODE && CONFIG_FRAME_PARALLEL_ENCODE_2
// Computes the reference refresh index for INTNL_ARF_UPDATE frame.
int av1_calc_refresh_idx_for_intnl_arf(
AV1_COMP *cpi, RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
@@ -749,7 +590,7 @@
GF_GROUP *const gf_group = &cpi->ppi->gf_group;
// Search for the open slot to store the current frame.
- int free_fb_index = get_free_ref_map_index(ref_frame_map_pairs, NULL);
+ int free_fb_index = get_free_ref_map_index(ref_frame_map_pairs);
// Use a free slot if available.
if (free_fb_index != INVALID_IDX) {
@@ -762,18 +603,12 @@
return refresh_idx;
}
}
-#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
+#endif // CONFIG_FRAME_PARALLEL_ENCODE && CONFIG_FRAME_PARALLEL_ENCODE_2
-int av1_get_refresh_frame_flags(const AV1_COMP *const cpi,
- const EncodeFrameParams *const frame_params,
- FRAME_UPDATE_TYPE frame_update_type,
- int gf_index,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- int cur_disp_order,
- RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- const RefBufferStack *const ref_buffer_stack) {
+int av1_get_refresh_frame_flags(
+ const AV1_COMP *const cpi, const EncodeFrameParams *const frame_params,
+ FRAME_UPDATE_TYPE frame_update_type, int gf_index, int cur_disp_order,
+ RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]) {
const AV1_COMMON *const cm = &cpi->common;
const ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags =
&cpi->ext_flags.refresh_frame;
@@ -840,13 +675,8 @@
}
// Search for the open slot to store the current frame.
- int free_fb_index = get_free_ref_map_index(
-#if CONFIG_FRAME_PARALLEL_ENCODE
- ref_frame_map_pairs,
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- ref_buffer_stack);
+ int free_fb_index = get_free_ref_map_index(ref_frame_map_pairs);
-#if CONFIG_FRAME_PARALLEL_ENCODE
// No refresh necessary for these frame types.
if (frame_update_type == OVERLAY_UPDATE ||
frame_update_type == INTNL_OVERLAY_UPDATE)
@@ -869,73 +699,6 @@
#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
cur_disp_order);
return 1 << refresh_idx;
-#else
- switch (frame_update_type) {
- case KF_UPDATE:
- case GF_UPDATE:
- if (free_fb_index != INVALID_IDX) {
- refresh_mask = 1 << free_fb_index;
- } else {
- if (ref_buffer_stack->gld_stack_size)
- refresh_mask =
- 1 << ref_buffer_stack
- ->gld_stack[ref_buffer_stack->gld_stack_size - 1];
- else
- refresh_mask =
- 1 << ref_buffer_stack
- ->lst_stack[ref_buffer_stack->lst_stack_size - 1];
- }
- break;
- case LF_UPDATE:
- if (free_fb_index != INVALID_IDX) {
- refresh_mask = 1 << free_fb_index;
- } else {
- if (ref_buffer_stack->lst_stack_size >= 2)
- refresh_mask =
- 1 << ref_buffer_stack
- ->lst_stack[ref_buffer_stack->lst_stack_size - 1];
- else if (ref_buffer_stack->gld_stack_size >= 2)
- refresh_mask =
- 1 << ref_buffer_stack
- ->gld_stack[ref_buffer_stack->gld_stack_size - 1];
- else
- assert(0 && "No ref map index found");
- }
- break;
- case ARF_UPDATE:
- if (free_fb_index != INVALID_IDX) {
- refresh_mask = 1 << free_fb_index;
- } else {
- if (ref_buffer_stack->gld_stack_size >= 3)
- refresh_mask =
- 1 << ref_buffer_stack
- ->gld_stack[ref_buffer_stack->gld_stack_size - 1];
- else if (ref_buffer_stack->lst_stack_size >= 2)
- refresh_mask =
- 1 << ref_buffer_stack
- ->lst_stack[ref_buffer_stack->lst_stack_size - 1];
- else
- assert(0 && "No ref map index found");
- }
- break;
- case INTNL_ARF_UPDATE:
- if (free_fb_index != INVALID_IDX) {
- refresh_mask = 1 << free_fb_index;
- } else {
- refresh_mask =
- 1 << ref_buffer_stack
- ->lst_stack[ref_buffer_stack->lst_stack_size - 1];
- }
- break;
- case OVERLAY_UPDATE:
- if (free_fb_index != INVALID_IDX) refresh_mask = 1 << free_fb_index;
- break;
- case INTNL_OVERLAY_UPDATE: break;
- default: assert(0); break;
- }
-
- return refresh_mask;
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
}
#if !CONFIG_REALTIME_ONLY
@@ -1138,25 +901,6 @@
}
#endif // !CONFIG_REALTIME_ONLY
-#if !CONFIG_FRAME_PARALLEL_ENCODE
-static INLINE int find_unused_ref_frame(const int *used_ref_frames,
- const int *stack, int stack_size) {
- for (int i = 0; i < stack_size; ++i) {
- const int this_ref = stack[i];
- int ref_idx = 0;
- for (ref_idx = 0; ref_idx <= ALTREF_FRAME - LAST_FRAME; ++ref_idx) {
- if (this_ref == used_ref_frames[ref_idx]) break;
- }
-
- // not in use
- if (ref_idx > ALTREF_FRAME - LAST_FRAME) return this_ref;
- }
-
- return INVALID_IDX;
-}
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
-
-#if CONFIG_FRAME_PARALLEL_ENCODE
/*!\cond */
// Struct to keep track of relevant reference frame data.
typedef struct {
@@ -1222,13 +966,13 @@
buffer_map[unmapped_idx].used = 1;
}
-static void get_ref_frames(RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
+void av1_get_ref_frames(RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
+ int cur_frame_disp,
#if CONFIG_FRAME_PARALLEL_ENCODE_2
- const AV1_COMP *const cpi, int gf_index,
- int is_parallel_encode,
+ const AV1_COMP *cpi, int gf_index,
+ int is_parallel_encode,
#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
- int cur_frame_disp,
- int remapped_ref_idx[REF_FRAMES]) {
+ int remapped_ref_idx[REF_FRAMES]) {
int buf_map_idx = 0;
// Initialize reference frame mappings.
@@ -1431,102 +1175,6 @@
for (int i = 0; i < REF_FRAMES; ++i)
if (remapped_ref_idx[i] == INVALID_IDX) remapped_ref_idx[i] = 0;
}
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
-
-void av1_get_ref_frames(const RefBufferStack *ref_buffer_stack,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
- int cur_frame_disp,
-#if CONFIG_FRAME_PARALLEL_ENCODE_2
- const AV1_COMP *cpi, int gf_index,
- int is_parallel_encode,
-#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- int remapped_ref_idx[REF_FRAMES]) {
-#if CONFIG_FRAME_PARALLEL_ENCODE
- (void)ref_buffer_stack;
- get_ref_frames(ref_frame_map_pairs,
-#if CONFIG_FRAME_PARALLEL_ENCODE_2
- cpi, gf_index, is_parallel_encode,
-#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
- cur_frame_disp, remapped_ref_idx);
- return;
-#else
- const int *const arf_stack = ref_buffer_stack->arf_stack;
- const int *const lst_stack = ref_buffer_stack->lst_stack;
- const int *const gld_stack = ref_buffer_stack->gld_stack;
- const int arf_stack_size = ref_buffer_stack->arf_stack_size;
- const int lst_stack_size = ref_buffer_stack->lst_stack_size;
- const int gld_stack_size = ref_buffer_stack->gld_stack_size;
-
- // Initialization
- for (int i = 0; i < REF_FRAMES; ++i) remapped_ref_idx[i] = INVALID_IDX;
-
- if (arf_stack_size) {
- remapped_ref_idx[ALTREF_FRAME - LAST_FRAME] = arf_stack[arf_stack_size - 1];
-
- if (arf_stack_size > 1)
- remapped_ref_idx[BWDREF_FRAME - LAST_FRAME] = arf_stack[0];
-
- if (arf_stack_size > 2)
- remapped_ref_idx[ALTREF2_FRAME - LAST_FRAME] = arf_stack[1];
- }
-
- if (lst_stack_size) {
- remapped_ref_idx[LAST_FRAME - LAST_FRAME] = lst_stack[0];
-
- if (lst_stack_size > 1)
- remapped_ref_idx[LAST2_FRAME - LAST_FRAME] = lst_stack[1];
- }
-
- if (gld_stack_size) {
- remapped_ref_idx[GOLDEN_FRAME - LAST_FRAME] = gld_stack[0];
-
- // If there are more frames in the golden stack, assign them to BWDREF,
- // ALTREF2, or LAST3.
- if (gld_stack_size > 1) {
- if (arf_stack_size <= 2) {
- if (arf_stack_size <= 1) {
- remapped_ref_idx[BWDREF_FRAME - LAST_FRAME] = gld_stack[1];
- if (gld_stack_size > 2)
- remapped_ref_idx[ALTREF2_FRAME - LAST_FRAME] = gld_stack[2];
- } else {
- remapped_ref_idx[ALTREF2_FRAME - LAST_FRAME] = gld_stack[1];
- }
- } else {
- remapped_ref_idx[LAST3_FRAME - LAST_FRAME] = gld_stack[1];
- }
- }
- }
-
- for (int idx = ALTREF_FRAME - LAST_FRAME; idx >= 0; --idx) {
- int ref_map_index = remapped_ref_idx[idx];
-
- if (ref_map_index != INVALID_IDX) continue;
-
- ref_map_index =
- find_unused_ref_frame(remapped_ref_idx, arf_stack, arf_stack_size);
-
- if (ref_map_index == INVALID_IDX) {
- ref_map_index =
- find_unused_ref_frame(remapped_ref_idx, gld_stack, gld_stack_size);
- }
-
- if (ref_map_index == INVALID_IDX) {
- ref_map_index =
- find_unused_ref_frame(remapped_ref_idx, lst_stack, lst_stack_size);
- }
-
- if (ref_map_index != INVALID_IDX) {
- remapped_ref_idx[idx] = ref_map_index;
- } else if (!gld_stack_size && arf_stack_size) {
- remapped_ref_idx[idx] = ref_buffer_stack->arf_stack[0];
- } else {
- remapped_ref_idx[idx] = ref_buffer_stack->gld_stack[0];
- }
- }
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
-}
int av1_encode_strategy(AV1_COMP *const cpi, size_t *const size,
uint8_t *const dest, unsigned int *frame_flags,
@@ -1826,13 +1474,11 @@
const RefCntBuffer *ref_frames[INTER_REFS_PER_FRAME];
const YV12_BUFFER_CONFIG *ref_frame_buf[INTER_REFS_PER_FRAME];
-#if CONFIG_FRAME_PARALLEL_ENCODE
RefFrameMapPair ref_frame_map_pairs[REF_FRAMES];
init_ref_map_pair(cpi, ref_frame_map_pairs);
const int order_offset = gf_group->arf_src_offset[cpi->gf_frame_index];
const int cur_frame_disp =
cpi->common.current_frame.frame_number + order_offset;
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
#if CONFIG_FRAME_PARALLEL_ENCODE
int get_ref_frames = 0;
@@ -1846,13 +1492,10 @@
{
#endif // CONFIG_FRAME_PARALLEL_ENCODE
if (!ext_flags->refresh_frame.update_pending) {
- av1_get_ref_frames(&cpi->ref_buffer_stack,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- ref_frame_map_pairs, cur_frame_disp,
+ av1_get_ref_frames(ref_frame_map_pairs, cur_frame_disp,
#if CONFIG_FRAME_PARALLEL_ENCODE_2
cpi, cpi->gf_frame_index, 1,
#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
cm->remapped_ref_idx);
} else if (cpi->svc.set_ref_frame_config) {
for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; i++)
@@ -1894,10 +1537,7 @@
#endif
frame_params.refresh_frame_flags = av1_get_refresh_frame_flags(
cpi, &frame_params, frame_update_type, cpi->gf_frame_index,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- cur_frame_disp, ref_frame_map_pairs,
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- &cpi->ref_buffer_stack);
+ cur_frame_disp, ref_frame_map_pairs);
#if CONFIG_FRAME_PARALLEL_ENCODE
#if CONFIG_FRAME_PARALLEL_ENCODE_2
} else {
@@ -1913,7 +1553,6 @@
frame_params.refresh_frame_flags = 0;
#endif // CONFIG_FRAME_PARALLEL_ENCODE
-#if CONFIG_FRAME_PARALLEL_ENCODE
frame_params.existing_fb_idx_to_show = INVALID_IDX;
// Find the frame buffer to show based on display order.
if (frame_params.show_existing_frame) {
@@ -1925,14 +1564,6 @@
frame_params.existing_fb_idx_to_show = frame;
}
}
-#else
- frame_params.existing_fb_idx_to_show =
- frame_params.show_existing_frame
- ? (frame_update_type == INTNL_OVERLAY_UPDATE
- ? get_ref_frame_map_idx(cm, BWDREF_FRAME)
- : get_ref_frame_map_idx(cm, ALTREF_FRAME))
- : INVALID_IDX;
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
}
// The way frame_params->remapped_ref_idx is setup is a placeholder.
@@ -1978,23 +1609,11 @@
cpi->source = &cpi->orig_source;
}
- // As the frame_update_type can get modified as part of
- // av1_adjust_gf_refresh_qp_one_pass_rt
- frame_update_type = get_frame_update_type(gf_group, cpi->gf_frame_index);
if (!is_stat_generation_stage(cpi)) {
// First pass doesn't modify reference buffer assignment or produce frame
// flags
update_frame_flags(&cpi->common, &cpi->refresh_frame, frame_flags);
set_additional_frame_flags(cm, frame_flags);
-#if !CONFIG_FRAME_PARALLEL_ENCODE
- if (!ext_flags->refresh_frame.update_pending) {
- int ref_map_index =
- av1_get_refresh_ref_frame_map(cm->current_frame.refresh_frame_flags);
- av1_update_ref_frame_map(cpi, frame_update_type,
- gf_group->refbuf_state[cpi->gf_frame_index],
- ref_map_index, &cpi->ref_buffer_stack);
- }
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
}
#if !CONFIG_REALTIME_ONLY
diff --git a/av1/encoder/encode_strategy.h b/av1/encoder/encode_strategy.h
index 15681c3..a04c483 100644
--- a/av1/encoder/encode_strategy.h
+++ b/av1/encoder/encode_strategy.h
@@ -68,44 +68,29 @@
const REFBUF_STATE refbuf_state,
int force_refresh_all);
-int av1_get_refresh_frame_flags(const AV1_COMP *const cpi,
- const EncodeFrameParams *const frame_params,
- FRAME_UPDATE_TYPE frame_update_type,
- int gf_index,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- int cur_disp_order,
- RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- const RefBufferStack *const ref_buffer_stack);
+int av1_get_refresh_frame_flags(
+ const AV1_COMP *const cpi, const EncodeFrameParams *const frame_params,
+ FRAME_UPDATE_TYPE frame_update_type, int gf_index, int cur_disp_order,
+ RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]);
int av1_get_refresh_ref_frame_map(int refresh_frame_flags);
-void av1_update_ref_frame_map(const AV1_COMP *cpi,
- FRAME_UPDATE_TYPE frame_update_type,
- REFBUF_STATE refbuf_state, int ref_map_index,
- RefBufferStack *ref_buffer_stack);
-
-/*!\brief Obtain indices of reference frames from reference frame buffer stacks
+/*!\brief Obtain indices of reference frames in ref_frame_map
*
* \callgraph
* \callergraph
*
- * \param[in] ref_buffer_stack Data structure for reference frame buffer
- * stacks.
* \param[out] remapped_ref_idx An array for storing indices of reference
* frames. The index is used to retrieve a
* reference frame buffer from ref_frame_map
* in AV1Common.
*/
-void av1_get_ref_frames(const RefBufferStack *ref_buffer_stack,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
+void av1_get_ref_frames(RefFrameMapPair ref_frame_map_pairs[REF_FRAMES],
int cur_frame_disp,
#if CONFIG_FRAME_PARALLEL_ENCODE_2
const AV1_COMP *cpi, int gf_index,
int is_parallel_encode,
#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
int remapped_ref_idx[REF_FRAMES]);
int is_forced_keyframe_pending(struct lookahead_ctx *lookahead,
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index cb2f1df..e5d323c 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3728,11 +3728,9 @@
current_frame->order_hint %=
(1 << (cm->seq_params->order_hint_info.order_hint_bits_minus_1 + 1));
-#if CONFIG_FRAME_PARALLEL_ENCODE
current_frame->pyramid_level = get_true_pyr_level(
cpi->ppi->gf_group.layer_depth[cpi->gf_frame_index],
current_frame->display_order_hint, cpi->ppi->gf_group.max_layer_depth);
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
if (is_stat_generation_stage(cpi)) {
#if !CONFIG_REALTIME_ONLY
@@ -4723,7 +4721,7 @@
first_cpi->time_stamps.prev_ts_end = ppi->ts_end_last_show_frame;
}
- av1_get_ref_frames(NULL, first_ref_frame_map_pairs, cur_frame_disp,
+ av1_get_ref_frames(first_ref_frame_map_pairs, cur_frame_disp,
#if CONFIG_FRAME_PARALLEL_ENCODE_2
first_cpi, gf_index_start, 1,
#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
@@ -4818,7 +4816,7 @@
#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
cur_cpi->twopass_frame.stats_in = stats_in;
- av1_get_ref_frames(NULL, first_ref_frame_map_pairs, cur_frame_disp,
+ av1_get_ref_frames(first_ref_frame_map_pairs, cur_frame_disp,
#if CONFIG_FRAME_PARALLEL_ENCODE_2
cur_cpi, i, 1,
#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 492c4a7..9bf156e 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -134,14 +134,13 @@
FRAMEFLAGS_ERROR_RESILIENT = 1 << 6,
} UENUM1BYTE(FRAMETYPE_FLAGS);
-#if CONFIG_FRAME_PARALLEL_ENCODE
-#if CONFIG_FPMT_TEST
+#if CONFIG_FRAME_PARALLEL_ENCODE && CONFIG_FPMT_TEST
enum {
PARALLEL_ENCODE = 0,
PARALLEL_SIMULATION_ENCODE,
NUM_FPMT_TEST_ENCODES
} UENUM1BYTE(FPMT_TEST_ENC_CFG);
-#endif
+#endif // CONFIG_FRAME_PARALLEL_ENCODE && CONFIG_FPMT_TEST
// 0 level frames are sometimes used for rate control purposes, but for
// reference mapping purposes, the minimum level should be 1.
#define MIN_PYR_LEVEL 1
@@ -159,7 +158,6 @@
}
return AOMMAX(MIN_PYR_LEVEL, frame_level);
}
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
enum {
NO_AQ = 0,
@@ -2188,15 +2186,6 @@
/*!\cond */
typedef struct {
- int arf_stack[FRAME_BUFFERS];
- int arf_stack_size;
- int lst_stack[FRAME_BUFFERS];
- int lst_stack_size;
- int gld_stack[FRAME_BUFFERS];
- int gld_stack_size;
-} RefBufferStack;
-
-typedef struct {
// Some misc info
int high_prec;
int q;
@@ -2919,11 +2908,6 @@
*/
unsigned char gf_frame_index;
- /*!
- * To control the reference frame buffer and selection.
- */
- RefBufferStack ref_buffer_stack;
-
#if CONFIG_INTERNAL_STATS
/*!\cond */
uint64_t time_compress_data;
@@ -3576,7 +3560,6 @@
void av1_update_frame_size(AV1_COMP *cpi);
-#if CONFIG_FRAME_PARALLEL_ENCODE
typedef struct {
int pyr_level;
int disp_order;
@@ -3616,7 +3599,7 @@
}
}
-#if CONFIG_FPMT_TEST
+#if CONFIG_FRAME_PARALLEL_ENCODE && CONFIG_FPMT_TEST
static AOM_INLINE void calc_frame_data_update_flag(
GF_GROUP *const gf_group, int gf_frame_index,
bool *const do_frame_data_update) {
@@ -3641,38 +3624,6 @@
}
}
#endif
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
-
-// TODO(jingning): Move these functions as primitive members for the new cpi
-// class.
-static INLINE void stack_push(int *stack, int *stack_size, int item) {
- for (int i = *stack_size - 1; i >= 0; --i) stack[i + 1] = stack[i];
- stack[0] = item;
- ++*stack_size;
-}
-
-static INLINE int stack_pop(int *stack, int *stack_size) {
- if (*stack_size <= 0) return -1;
-
- int item = stack[0];
- for (int i = 0; i < *stack_size; ++i) stack[i] = stack[i + 1];
- --*stack_size;
-
- return item;
-}
-
-static INLINE int stack_pop_end(int *stack, int *stack_size) {
- int item = stack[*stack_size - 1];
- stack[*stack_size - 1] = -1;
- --*stack_size;
-
- return item;
-}
-
-static INLINE void stack_reset(int *stack, int *stack_size) {
- for (int i = 0; i < *stack_size; ++i) stack[i] = INVALID_IDX;
- *stack_size = 0;
-}
// av1 uses 10,000,000 ticks/second as time stamp
#define TICKS_PER_SEC 10000000LL
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 354e085..8e2d11d 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1346,12 +1346,9 @@
assert(cpi->gf_frame_index == 0);
*pframe_qindex = 0;
-#if CONFIG_FRAME_PARALLEL_ENCODE
RefFrameMapPair ref_frame_map_pairs[REF_FRAMES];
init_ref_map_pair(cpi, ref_frame_map_pairs);
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- RefBufferStack ref_buffer_stack = cpi->ref_buffer_stack;
int remapped_ref_idx[REF_FRAMES];
EncodeFrameParams frame_params = *init_frame_params;
@@ -1425,25 +1422,17 @@
tpl_frame->tpl_stats_ptr = tpl_data->tpl_stats_pool[process_frame_count];
++process_frame_count;
}
-#if CONFIG_FRAME_PARALLEL_ENCODE
const int true_disp = (int)(tpl_frame->frame_display_index);
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- av1_get_ref_frames(&ref_buffer_stack,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- ref_frame_map_pairs, true_disp,
+ av1_get_ref_frames(ref_frame_map_pairs, true_disp,
#if CONFIG_FRAME_PARALLEL_ENCODE_2
cpi, gf_index, 0,
#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
remapped_ref_idx);
- int refresh_mask = av1_get_refresh_frame_flags(
- cpi, &frame_params, frame_update_type, gf_index,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- true_disp, ref_frame_map_pairs,
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- &ref_buffer_stack);
+ int refresh_mask =
+ av1_get_refresh_frame_flags(cpi, &frame_params, frame_update_type,
+ gf_index, true_disp, ref_frame_map_pairs);
#if CONFIG_FRAME_PARALLEL_ENCODE
// Make the frames marked as is_frame_non_ref to non-reference frames.
@@ -1451,13 +1440,7 @@
#endif // CONFIG_FRAME_PARALLEL_ENCODE
int refresh_frame_map_index = av1_get_refresh_ref_frame_map(refresh_mask);
-#if !CONFIG_FRAME_PARALLEL_ENCODE
- av1_update_ref_frame_map(cpi, frame_update_type,
- gf_group->refbuf_state[gf_index],
- refresh_frame_map_index, &ref_buffer_stack);
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
-#if CONFIG_FRAME_PARALLEL_ENCODE
if (refresh_frame_map_index < REF_FRAMES &&
refresh_frame_map_index != INVALID_IDX) {
ref_frame_map_pairs[refresh_frame_map_index].disp_order =
@@ -1466,7 +1449,6 @@
get_true_pyr_level(gf_group->layer_depth[gf_index], true_disp,
cpi->ppi->gf_group.max_layer_depth);
}
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
for (int i = LAST_FRAME; i <= ALTREF_FRAME; ++i)
tpl_frame->ref_map_index[i - LAST_FRAME] =
@@ -1527,31 +1509,17 @@
}
#endif // CONFIG_BITRATE_ACCURACY && CONFIG_THREE_PASS
gf_group->q_val[gf_index] = *pframe_qindex;
-#if CONFIG_FRAME_PARALLEL_ENCODE
const int true_disp = (int)(tpl_frame->frame_display_index);
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- av1_get_ref_frames(&ref_buffer_stack,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- ref_frame_map_pairs, true_disp,
+ av1_get_ref_frames(ref_frame_map_pairs, true_disp,
#if CONFIG_FRAME_PARALLEL_ENCODE_2
cpi, gf_index, 0,
-#endif // CONFIG_FRAME_PARALLEL_ENCODE_2
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
+#endif
remapped_ref_idx);
- int refresh_mask = av1_get_refresh_frame_flags(
- cpi, &frame_params, frame_update_type, gf_index,
-#if CONFIG_FRAME_PARALLEL_ENCODE
- true_disp, ref_frame_map_pairs,
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
- &ref_buffer_stack);
+ int refresh_mask =
+ av1_get_refresh_frame_flags(cpi, &frame_params, frame_update_type,
+ gf_index, true_disp, ref_frame_map_pairs);
int refresh_frame_map_index = av1_get_refresh_ref_frame_map(refresh_mask);
-#if !CONFIG_FRAME_PARALLEL_ENCODE
- av1_update_ref_frame_map(cpi, frame_update_type,
- gf_group->refbuf_state[gf_index],
- refresh_frame_map_index, &ref_buffer_stack);
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
-#if CONFIG_FRAME_PARALLEL_ENCODE
if (refresh_frame_map_index < REF_FRAMES &&
refresh_frame_map_index != INVALID_IDX) {
ref_frame_map_pairs[refresh_frame_map_index].disp_order =
@@ -1560,7 +1528,6 @@
get_true_pyr_level(gf_group->layer_depth[gf_index], true_disp,
cpi->ppi->gf_group.max_layer_depth);
}
-#endif // CONFIG_FRAME_PARALLEL_ENCODE
for (int i = LAST_FRAME; i <= ALTREF_FRAME; ++i)
tpl_frame->ref_map_index[i - LAST_FRAME] =