ref: 989d53686152291884ca73220a3cf6aee5c88c20
parent: 86212bc3c19f4d3dd131d7e57b2fbcfb84f03144
parent: ac86dde3afd6dd17af3ac3ebaed64fa369c62913
author: Marco Paniconi <marpan@google.com>
date: Fri Apr 8 13:51:54 EDT 2016
Merge "vp9-denoiser: Avoid copy-block when denoising is at LowLow level."
--- a/vp9/encoder/vp9_denoiser.c
+++ b/vp9/encoder/vp9_denoiser.c
@@ -450,11 +450,12 @@
int resized) {
// Copy source into denoised reference buffers on KEY_FRAME or
// if the just encoded frame was resized.
- if (frame_type == KEY_FRAME || resized != 0) {
+ if (frame_type == KEY_FRAME || resized != 0 || denoiser->reset) {
int i;
// Start at 1 so as not to overwrite the INTRA_FRAME
for (i = 1; i < MAX_REF_FRAMES; ++i)
copy_frame(&denoiser->running_avg_y[i], &src);
+ denoiser->reset = 0;
return;
}
@@ -567,6 +568,8 @@
denoiser->increase_denoising = 0;
denoiser->frame_buffer_initialized = 1;
denoiser->denoising_level = kDenLow;
+ denoiser->prev_denoising_level = kDenLow;
+ denoiser->reset = 0;
return 0;
}
@@ -586,6 +589,12 @@
void vp9_denoiser_set_noise_level(VP9_DENOISER *denoiser,
int noise_level) {
denoiser->denoising_level = noise_level;
+ if (denoiser->denoising_level > kDenLowLow &&
+ denoiser->prev_denoising_level == kDenLowLow)
+ denoiser->reset = 1;
+ else
+ denoiser->reset = 0;
+ denoiser->prev_denoising_level = denoiser->denoising_level;
}
#ifdef OUTPUT_YUV_DENOISED
--- a/vp9/encoder/vp9_denoiser.h
+++ b/vp9/encoder/vp9_denoiser.h
@@ -40,7 +40,9 @@
YV12_BUFFER_CONFIG last_source;
int increase_denoising;
int frame_buffer_initialized;
+ int reset;
VP9_DENOISER_LEVEL denoising_level;
+ VP9_DENOISER_LEVEL prev_denoising_level;
} VP9_DENOISER;
struct VP9_COMP;
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -2839,7 +2839,8 @@
sizeof(cpi->interp_filter_selected[0]));
}
#if CONFIG_VP9_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity > 0) {
+ if (cpi->oxcf.noise_sensitivity > 0 &&
+ cpi->denoiser.denoising_level > kDenLowLow) {
vp9_denoiser_update_frame_info(&cpi->denoiser,
*cpi->Source,
cpi->common.frame_type,
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -1270,7 +1270,10 @@
}
#if CONFIG_VP9_TEMPORAL_DENOISING
- vp9_denoiser_reset_frame_stats(ctx);
+ if (cpi->oxcf.noise_sensitivity > 0 &&
+ cpi->denoiser.denoising_level > kDenLowLow) {
+ vp9_denoiser_reset_frame_stats(ctx);
+ }
#endif
if (cpi->rc.frames_since_golden == 0 && !cpi->use_svc) {
@@ -1642,7 +1645,8 @@
}
#if CONFIG_VP9_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity > 0) {
+ if (cpi->oxcf.noise_sensitivity > 0 &&
+ cpi->denoiser.denoising_level > kDenLowLow) {
vp9_denoiser_update_frame_stats(mi, sse_y, this_mode, ctx);
// Keep track of zero_last cost.
if (ref_frame == LAST_FRAME && frame_mv[this_mode][ref_frame].as_int == 0)
@@ -1823,7 +1827,9 @@
#if CONFIG_VP9_TEMPORAL_DENOISING
if (cpi->oxcf.noise_sensitivity > 0 &&
- cpi->resize_pending == 0) {
+ cpi->resize_pending == 0 &&
+ cpi->denoiser.denoising_level > kDenLowLow &&
+ cpi->denoiser.reset == 0) {
VP9_DENOISER_DECISION decision = COPY_BLOCK;
vp9_denoiser_denoise(cpi, x, mi_row, mi_col, VPXMAX(BLOCK_8X8, bsize),
ctx, &decision);
--
⑨