diff options
author | Marco <marpan@google.com> | 2015-01-11 15:26:44 -0800 |
---|---|---|
committer | Marco <marpan@google.com> | 2015-01-12 11:53:26 -0800 |
commit | 2c6d9c574fc123b3488ac950872fb5487b429941 (patch) | |
tree | 5a2fcb502d748bf882c7f77af74b020404a6f896 /vp8/encoder | |
parent | fe3f21099fc864e2e4db5e2f30bb5adb3155c883 (diff) | |
download | libvpx-2c6d9c574fc123b3488ac950872fb5487b429941.tar libvpx-2c6d9c574fc123b3488ac950872fb5487b429941.tar.gz libvpx-2c6d9c574fc123b3488ac950872fb5487b429941.tar.bz2 libvpx-2c6d9c574fc123b3488ac950872fb5487b429941.zip |
vp8: Fix to crash in pick_inter.
Added unittest that triggers the crash without this fix.
Issue: https://code.google.com/p/webm/issues/detail?id=911
Change-Id: If5208ceb210c821891675fdf3d9951ab83d52ae6
Diffstat (limited to 'vp8/encoder')
-rw-r--r-- | vp8/encoder/pickinter.c | 67 |
1 files changed, 34 insertions, 33 deletions
diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c index fc026aa9c..d02cd30b9 100644 --- a/vp8/encoder/pickinter.c +++ b/vp8/encoder/pickinter.c @@ -753,45 +753,46 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int ref_frame_map[4]; int sign_bias = 0; int dot_artifact_candidate = 0; - // For detecting dot artifact. - unsigned char* target = x->src.y_buffer; - unsigned char* target_u = x->block[16].src + *x->block[16].base_src; - unsigned char* target_v = x->block[20].src + *x->block[20].base_src; - int stride = x->src.y_stride; - int stride_uv = x->block[16].src_stride; + get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset); + + // If the current frame is using LAST as a reference, check for + // biasing the mode selection for dot artifacts. + if (cpi->ref_frame_flags & VP8_LAST_FRAME) { + unsigned char* target_y = x->src.y_buffer; + unsigned char* target_u = x->block[16].src + *x->block[16].base_src; + unsigned char* target_v = x->block[20].src + *x->block[20].base_src; + int stride = x->src.y_stride; + int stride_uv = x->block[16].src_stride; #if CONFIG_TEMPORAL_DENOISING - if (cpi->oxcf.noise_sensitivity) { - int uv_denoise = (cpi->oxcf.noise_sensitivity >= 2) ? 1 : 0; - target = - cpi->denoiser.yv12_running_avg[LAST_FRAME].y_buffer + recon_yoffset; - stride = cpi->denoiser.yv12_running_avg[LAST_FRAME].y_stride; - if (uv_denoise) { - target_u = - cpi->denoiser.yv12_running_avg[LAST_FRAME].u_buffer + recon_uvoffset; - target_v = - cpi->denoiser.yv12_running_avg[LAST_FRAME].v_buffer + recon_uvoffset; - stride_uv = cpi->denoiser.yv12_running_avg[LAST_FRAME].uv_stride; + if (cpi->oxcf.noise_sensitivity) { + const int uv_denoise = (cpi->oxcf.noise_sensitivity >= 2) ? 1 : 0; + target_y = + cpi->denoiser.yv12_running_avg[LAST_FRAME].y_buffer + recon_yoffset; + stride = cpi->denoiser.yv12_running_avg[LAST_FRAME].y_stride; + if (uv_denoise) { + target_u = + cpi->denoiser.yv12_running_avg[LAST_FRAME].u_buffer + + recon_uvoffset; + target_v = + cpi->denoiser.yv12_running_avg[LAST_FRAME].v_buffer + + recon_uvoffset; + stride_uv = cpi->denoiser.yv12_running_avg[LAST_FRAME].uv_stride; + } } - } #endif - - get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset); - - dot_artifact_candidate = - check_dot_artifact_candidate(cpi, x, - target, stride, - plane[LAST_FRAME][0], mb_row, mb_col, 0); - // If not found in Y channel, check UV channel. - if (!dot_artifact_candidate) { dot_artifact_candidate = - check_dot_artifact_candidate(cpi, x, - target_u, stride_uv, - plane[LAST_FRAME][1], mb_row, mb_col, 1); + check_dot_artifact_candidate(cpi, x, target_y, stride, + plane[LAST_FRAME][0], mb_row, mb_col, 0); + // If not found in Y channel, check UV channel. if (!dot_artifact_candidate) { dot_artifact_candidate = - check_dot_artifact_candidate(cpi, x, - target_v, stride_uv, - plane[LAST_FRAME][2], mb_row, mb_col, 2); + check_dot_artifact_candidate(cpi, x, target_u, stride_uv, + plane[LAST_FRAME][1], mb_row, mb_col, 1); + if (!dot_artifact_candidate) { + dot_artifact_candidate = + check_dot_artifact_candidate(cpi, x, target_v, stride_uv, + plane[LAST_FRAME][2], mb_row, mb_col, 2); + } } } |