summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco <marpan@google.com>2017-03-30 17:08:44 -0700
committerMarco <marpan@google.com>2017-03-31 10:05:32 -0700
commitc824eda6ccf84ddbc55f2b78cb8ad57525db066b (patch)
treec37bb2eee02a92f3fe082665c690b7eaef114605
parent8e7c5a3c8db28b5367ae4431b5f2bf22b072b0b0 (diff)
downloadlibvpx-c824eda6ccf84ddbc55f2b78cb8ad57525db066b.tar
libvpx-c824eda6ccf84ddbc55f2b78cb8ad57525db066b.tar.gz
libvpx-c824eda6ccf84ddbc55f2b78cb8ad57525db066b.tar.bz2
libvpx-c824eda6ccf84ddbc55f2b78cb8ad57525db066b.zip
vp9: SVC: Fix issue with artifact for svc-denoising.
Issue/bug happens for denoising with spatial layers, where the golden (spatial) reference is used in pickmode, but denoising is only done wrt to last (temporal). Fix is to make sure set_ref_ptrs is set before build predictors in denoiser. Change-Id: I793cf441341edf7c4a88b8ab1e1b22b3cb0eb508
-rw-r--r--vp9/encoder/vp9_denoiser.c8
-rw-r--r--vp9/encoder/vp9_pickmode.c15
2 files changed, 6 insertions, 17 deletions
diff --git a/vp9/encoder/vp9_denoiser.c b/vp9/encoder/vp9_denoiser.c
index b0cbfa932..55b6a83f3 100644
--- a/vp9/encoder/vp9_denoiser.c
+++ b/vp9/encoder/vp9_denoiser.c
@@ -187,7 +187,7 @@ static uint8_t *block_start(uint8_t *framebuf, int stride, int mi_row,
}
static VP9_DENOISER_DECISION perform_motion_compensation(
- VP9_DENOISER *denoiser, MACROBLOCK *mb, BLOCK_SIZE bs,
+ VP9_COMMON *const cm, VP9_DENOISER *denoiser, MACROBLOCK *mb, BLOCK_SIZE bs,
int increase_denoising, int mi_row, int mi_col, PICK_MODE_CONTEXT *ctx,
int motion_magnitude, int is_skin, int *zeromv_filter, int consec_zeromv,
int num_spatial_layers, int width) {
@@ -199,6 +199,7 @@ static VP9_DENOISER_DECISION perform_motion_compensation(
int i;
struct buf_2d saved_dst[MAX_MB_PLANE];
struct buf_2d saved_pre[MAX_MB_PLANE];
+ RefBuffer *saved_block_refs[2];
frame = ctx->best_reference_frame;
saved_mi = *mi;
@@ -260,6 +261,7 @@ static VP9_DENOISER_DECISION perform_motion_compensation(
saved_pre[i] = filter_mbd->plane[i].pre[0];
saved_dst[i] = filter_mbd->plane[i].dst;
}
+ saved_block_refs[0] = filter_mbd->block_refs[0];
// Set the pointers in the MACROBLOCKD to point to the buffers in the denoiser
// struct.
@@ -289,10 +291,12 @@ static VP9_DENOISER_DECISION perform_motion_compensation(
denoiser->mc_running_avg_y.uv_stride, mi_row, mi_col);
filter_mbd->plane[2].dst.stride = denoiser->mc_running_avg_y.uv_stride;
+ set_ref_ptrs(cm, filter_mbd, frame, NONE);
vp9_build_inter_predictors_sby(filter_mbd, mi_row, mi_col, bs);
// Restore everything to its original state
*mi = saved_mi;
+ filter_mbd->block_refs[0] = saved_block_refs[0];
for (i = 0; i < MAX_MB_PLANE; ++i) {
filter_mbd->plane[i].pre[0] = saved_pre[i];
filter_mbd->plane[i].dst = saved_dst[i];
@@ -363,7 +367,7 @@ void vp9_denoiser_denoise(VP9_COMP *cpi, MACROBLOCK *mb, int mi_row, int mi_col,
if (denoiser->denoising_level >= kDenLow)
decision = perform_motion_compensation(
- denoiser, mb, bs, increase_denoising, mi_row, mi_col, ctx,
+ &cpi->common, denoiser, mb, bs, increase_denoising, mi_row, mi_col, ctx,
motion_magnitude, is_skin, &zeromv_filter, consec_zeromv,
cpi->svc.number_spatial_layers, cpi->Source->y_width);
diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c
index 8874a5a41..fc5bfea22 100644
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -1587,14 +1587,6 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
!svc_force_zero_mode[GOLDEN_FRAME - 1] && !force_skip_low_temp_var))
use_golden_nonzeromv = 0;
-#if CONFIG_VP9_TEMPORAL_DENOISING
- // TODO(marpan): Allowing golden as the (spatial) reference for SVC with
- // denoising causes bad artifact. Remove this condition when artifact issue
- // is resolved.
- if (cpi->use_svc && cpi->oxcf.noise_sensitivity > 0 && denoise_svc_pickmode)
- usable_ref_frame = LAST_FRAME;
-#endif
-
if (cpi->oxcf.speed >= 8 && !cpi->use_svc &&
((cpi->rc.frames_since_golden + 1) < x->last_sb_high_content ||
x->last_sb_high_content > 40))
@@ -2036,13 +2028,6 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
!(cpi->ref_frame_flags & flag_list[GOLDEN_FRAME]) ||
(!cpi->svc.layer_context[cpi->svc.temporal_layer_id].is_key_frame &&
svc_force_zero_mode[best_ref_frame - 1]);
-#if CONFIG_VP9_TEMPORAL_DENOISING
- // TODO(marpan): Temporary fix to keep intra prediction on as we currently
- // disallow golden as the (spatial) reference for SVC with denoising due to
- // artifact issue, Remove this condition when artifact issue is resolved.
- if (cpi->use_svc && cpi->oxcf.noise_sensitivity > 0 && denoise_svc_pickmode)
- perform_intra_pred = 1;
-#endif
inter_mode_thresh = (inter_mode_thresh << 1) + inter_mode_thresh;
}
if (cpi->oxcf.lag_in_frames > 0 && cpi->oxcf.rc_mode == VPX_VBR &&