Let the encoder check show existing conditions for KF overlays.
This patch, together with commit 113341, adds proper support
for correcting artifacts in filtered keyframes.
BUG=aomedia:2683
STATS_CHANGED
Change-Id: I32148610a87a0f49ca8a20ac3fb17218a0790ff1
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 9b973b2..e67fde0 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -925,6 +925,7 @@
aom_copy_metadata_to_frame_buffer(frame_input->source,
source_buffer->metadata);
}
+ // Currently INTNL_ARF_UPDATE only do show_existing.
if (get_frame_update_type(&cpi->gf_group) == ARF_UPDATE) {
cpi->show_existing_alt_ref = show_existing_alt_ref;
}
@@ -1176,9 +1177,7 @@
}
av1_apply_encoding_flags(cpi, source->flags);
-
- if (!frame_params.show_existing_frame)
- *frame_flags = (source->flags & AOM_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
+ *frame_flags = (source->flags & AOM_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
// Shown frames and arf-overlay frames need frame-rate considering
if (frame_params.show_frame)
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 262b342..5cd06bc 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3188,8 +3188,15 @@
if (current_frame->frame_type == KEY_FRAME && !cpi->no_show_fwd_kf)
current_frame->frame_number = 0;
- current_frame->order_hint =
- current_frame->frame_number + frame_params->order_offset;
+ if (av1_check_keyframe_overlay(cpi->gf_group.index, &cpi->gf_group,
+ cpi->rc.frames_since_key)) {
+ current_frame->order_hint =
+ current_frame->frame_number + frame_params->order_offset - 1;
+ } else {
+ current_frame->order_hint =
+ current_frame->frame_number + frame_params->order_offset;
+ }
+
current_frame->display_order_hint = current_frame->order_hint;
current_frame->order_hint %=
(1 << (cm->seq_params.order_hint_info.order_hint_bits_minus_1 + 1));
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index ac8064f..59a4570 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -764,15 +764,16 @@
/*!\brief Does temporal filter for a given frame.
*
* \ingroup src_frame_proc
- * \param[in] cpi Top level encoder instance structure
- * \param[in] frames Frame buffers used for temporal filtering
- * \param[in] num_frames Number of frames in the frame buffer
- * \param[in] filter_frame_idx Index of the frame to be filtered
- * \param[in] is_key_frame Is the to-filter is a key frame
- * \param[in] block_size Block size used for temporal filtering
- * \param[in] scale Frame scaling factor
- * \param[in] noise_levels Estimated noise levels for each plane
- * in the frame (Y,U,V)
+ * \param[in] cpi Top level encoder instance structure
+ * \param[in] frames Frame buffers used for temporal filtering
+ * \param[in] num_frames Number of frames in the frame buffer
+ * \param[in] filter_frame_idx Index of the frame to be filtered
+ * \param[in] check_show_existing whether to accumulate diff for show
+ existing condition check
+ * \param[in] block_size Block size used for temporal filtering
+ * \param[in] scale Frame scaling factor
+ * \param[in] noise_levels Estimated noise levels for each plane
+ * in the frame (Y,U,V)
*
* \return Difference between filtered frame and the original frame
* (sum and sse)
@@ -780,7 +781,7 @@
static FRAME_DIFF tf_do_filtering(AV1_COMP *cpi, YV12_BUFFER_CONFIG **frames,
const int num_frames,
const int filter_frame_idx,
- const int is_key_frame,
+ const int check_show_existing,
const BLOCK_SIZE block_size,
const struct scale_factors *scale,
const double *noise_levels) {
@@ -920,7 +921,7 @@
tf_normalize_filtered_frame(mbd, block_size, mb_row, mb_col, num_planes,
accum, count, &cpi->alt_ref_buffer);
- if (!is_key_frame) {
+ if (check_show_existing) {
const int y_height = mb_height >> mbd->plane[0].subsampling_y;
const int y_width = mb_width >> mbd->plane[0].subsampling_x;
const int source_y_stride = frame_to_filter->y_stride;
@@ -1178,7 +1179,11 @@
}
// Do filtering.
- const int is_key_frame = (filter_frame_lookahead_idx <= 0);
+ // Check show existing condition for non-keyframes. For KFs, only check when
+ // KF overlay is enabled.
+ const int check_show_existing =
+ !(filter_frame_lookahead_idx <= 0) ||
+ cpi->oxcf.kf_cfg.enable_keyframe_filtering > 1;
// Setup scaling factors. Scaling on each of the arnr frames is not
// supported.
// ARF is produced at the native frame size and resized when coded.
@@ -1188,11 +1193,9 @@
frames[0]->y_crop_width, frames[0]->y_crop_height);
const FRAME_DIFF diff =
tf_do_filtering(cpi, frames, num_frames_for_filtering, filter_frame_idx,
- is_key_frame, TF_BLOCK_SIZE, &sf, noise_levels);
+ check_show_existing, TF_BLOCK_SIZE, &sf, noise_levels);
- if (is_key_frame) { // Key frame should always be filtered.
- return 1;
- }
+ if (!check_show_existing) return 1;
if (show_existing_arf != NULL || is_second_arf) {
const int frame_height = frames[filter_frame_idx]->y_crop_height;