The denoiser was writing to LAST_FRAME buffer. If LAST_FRAME isn't being updated, the reference frame buffers were out of sync between the encoder and the denoised raw buffers. This patch resolves the discrepancy by always writing to a work buffer (INTRA_FRAME) and then copying from that buffer to any buffers that needs to be updated.
Unified · Split
| @@ -140,8 +140,7 @@ int vp8_denoiser_allocate(VP8_DENOISER *denoiser, int width, int height) · 139 unmodified lines | ||
| 140 | 140 | int i; |
| 141 | 141 | assert(denoiser); |
| 142 | 142 | |
| 143 | − /* don't need one for intra start at 1 */ | |
| 144 | − for (i = 1; i < MAX_REF_FRAMES; i++) | |
| 143 | + for (i = 0; i < MAX_REF_FRAMES; i++) | |
| 145 | 144 | { |
| 146 | 145 | denoiser->yv12_running_avg[i].flags = 0; |
| 147 | 146 | |
| @@ -175,8 +174,7 @@ void vp8_denoiser_free(VP8_DENOISER *denoiser) · 27 unmodified lines | ||
| 175 | 174 | int i; |
| 176 | 175 | assert(denoiser); |
| 177 | 176 | |
| 178 | − /* we don't have one for intra ref frame */ | |
| 179 | − for (i = 1; i < MAX_REF_FRAMES ; i++) | |
| 177 | + for (i = 0; i < MAX_REF_FRAMES ; i++) | |
| 180 | 178 | { |
| 181 | 179 | vp8_yv12_de_alloc_frame_buffer(&denoiser->yv12_running_avg[i]); |
| 182 | 180 | } |
| @@ -291,7 +289,7 @@ void vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser, · 108 unmodified lines | ||
| 291 | 289 | { |
| 292 | 290 | /* Filter. */ |
| 293 | 291 | decision = vp8_denoiser_filter(&denoiser->yv12_mc_running_avg, |
| 294 | − &denoiser->yv12_running_avg[LAST_FRAME], | |
| 292 | + &denoiser->yv12_running_avg[INTRA_FRAME], | |
| 295 | 293 | x, |
| 296 | 294 | motion_magnitude2, |
| 297 | 295 | recon_yoffset, recon_uvoffset); |
| @@ -303,7 +301,7 @@ void vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser, · 5 unmodified lines | ||
| 303 | 301 | */ |
| 304 | 302 | vp8_copy_mem16x16( |
| 305 | 303 | x->thismb, 16, |
| 306 | − denoiser->yv12_running_avg[LAST_FRAME].y_buffer + recon_yoffset, | |
| 307 | − denoiser->yv12_running_avg[LAST_FRAME].y_stride); | |
| 304 | + denoiser->yv12_running_avg[INTRA_FRAME].y_buffer + recon_yoffset, | |
| 305 | + denoiser->yv12_running_avg[INTRA_FRAME].y_stride); | |
| 308 | 306 | } |
| 309 | 307 | } |
| @@ -3177,8 +3177,6 @@ void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) · 3176 unmodified lines | ||
| 3177 | 3177 | #if CONFIG_TEMPORAL_DENOISING |
| 3178 | 3178 | if (cpi->oxcf.noise_sensitivity) |
| 3179 | 3179 | { |
| 3180 | − | |
| 3181 | − | |
| 3182 | 3180 | /* we shouldn't have to keep multiple copies as we know in advance which |
| 3183 | 3181 | * buffer we should start - for now to get something up and running |
| 3184 | 3182 | * I've chosen to copy the buffers |
| @@ -3195,26 +3193,32 @@ void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) · 10 unmodified lines | ||
| 3195 | 3193 | |
| 3196 | 3194 | for (i = 2; i < MAX_REF_FRAMES - 1; i++) |
| 3197 | 3195 | vp8_yv12_copy_frame( |
| 3198 | − cpi->Source, | |
| 3196 | + &cpi->denoiser.yv12_running_avg[LAST_FRAME], | |
| 3199 | 3197 | &cpi->denoiser.yv12_running_avg[i]); |
| 3200 | 3198 | } |
| 3201 | 3199 | else /* For non key frames */ |
| 3202 | 3200 | { |
| 3203 | 3201 | vp8_yv12_extend_frame_borders( |
| 3204 | − &cpi->denoiser.yv12_running_avg[LAST_FRAME]); | |
| 3202 | + &cpi->denoiser.yv12_running_avg[INTRA_FRAME]); | |
| 3205 | 3203 | |
| 3206 | 3204 | if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf) |
| 3207 | 3205 | { |
| 3208 | 3206 | vp8_yv12_copy_frame( |
| 3209 | − &cpi->denoiser.yv12_running_avg[LAST_FRAME], | |
| 3207 | + &cpi->denoiser.yv12_running_avg[INTRA_FRAME], | |
| 3210 | 3208 | &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]); |
| 3211 | 3209 | } |
| 3212 | 3210 | if (cm->refresh_golden_frame || cm->copy_buffer_to_gf) |
| 3213 | 3211 | { |
| 3214 | 3212 | vp8_yv12_copy_frame( |
| 3215 | − &cpi->denoiser.yv12_running_avg[LAST_FRAME], | |
| 3213 | + &cpi->denoiser.yv12_running_avg[INTRA_FRAME], | |
| 3216 | 3214 | &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]); |
| 3217 | 3215 | } |
| 3216 | + if(cm->refresh_last_frame) | |
| 3217 | + { | |
| 3218 | + vp8_yv12_copy_frame( | |
| 3219 | + &cpi->denoiser.yv12_running_avg[INTRA_FRAME], | |
| 3220 | + &cpi->denoiser.yv12_running_avg[LAST_FRAME]); | |
| 3221 | + } | |
| 3218 | 3222 | } |
| 3219 | 3223 | |
| 3220 | 3224 | } |