From: Jingning Han Date: Thu, 8 Jan 2015 02:30:50 +0000 (-0800) Subject: Refactor denoiser frame buffer update X-Git-Tag: v1.4.0~272^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ea061a885deea564e52145d3affaf33c0f7871a6;p=libvpx Refactor denoiser frame buffer update Use frame buffer pointer swap instead of memcpy when possible. These two CLs make the denoiser when running on vidyo1 720p at speed -6 over 10% faster. Change-Id: I64fe8a2422cafca6787a50c7f4dfb961191c0a9d --- diff --git a/vp9/encoder/vp9_denoiser.c b/vp9/encoder/vp9_denoiser.c index 1444c3782..dec340d8a 100644 --- a/vp9/encoder/vp9_denoiser.c +++ b/vp9/encoder/vp9_denoiser.c @@ -365,6 +365,15 @@ static void copy_frame(YV12_BUFFER_CONFIG dest, const YV12_BUFFER_CONFIG src) { } } +static void swap_frame_buffer(YV12_BUFFER_CONFIG dest, + YV12_BUFFER_CONFIG src) { + uint8_t *tmp_buf = dest.y_buffer; + assert(dest.y_width == src.y_width); + assert(dest.y_height == src.y_height); + dest.y_buffer = src.y_buffer; + src.y_buffer = tmp_buf; +} + void vp9_denoiser_update_frame_info(VP9_DENOISER *denoiser, YV12_BUFFER_CONFIG src, FRAME_TYPE frame_type, @@ -374,22 +383,23 @@ void vp9_denoiser_update_frame_info(VP9_DENOISER *denoiser, if (frame_type == KEY_FRAME) { int i; // Start at 1 so as not to overwrite the INTRA_FRAME - for (i = 1; i < MAX_REF_FRAMES; ++i) { + for (i = 1; i < MAX_REF_FRAMES; ++i) copy_frame(denoiser->running_avg_y[i], src); - } - } else { /* For non key frames */ - if (refresh_alt_ref_frame) { - copy_frame(denoiser->running_avg_y[ALTREF_FRAME], - denoiser->running_avg_y[INTRA_FRAME]); - } - if (refresh_golden_frame) { - copy_frame(denoiser->running_avg_y[GOLDEN_FRAME], - denoiser->running_avg_y[INTRA_FRAME]); - } - if (refresh_last_frame) { - copy_frame(denoiser->running_avg_y[LAST_FRAME], - denoiser->running_avg_y[INTRA_FRAME]); - } + return; + } + + /* For non key frames */ + if (refresh_alt_ref_frame) { + swap_frame_buffer(denoiser->running_avg_y[ALTREF_FRAME], + denoiser->running_avg_y[INTRA_FRAME]); + } + if (refresh_golden_frame) { + swap_frame_buffer(denoiser->running_avg_y[GOLDEN_FRAME], + denoiser->running_avg_y[INTRA_FRAME]); + } + if (refresh_last_frame) { + swap_frame_buffer(denoiser->running_avg_y[LAST_FRAME], + denoiser->running_avg_y[INTRA_FRAME]); } }