diff options
author | Jingning Han <jingning@google.com> | 2015-01-07 18:30:50 -0800 |
---|---|---|
committer | Jingning Han <jingning@google.com> | 2015-01-07 18:33:13 -0800 |
commit | ea061a885deea564e52145d3affaf33c0f7871a6 (patch) | |
tree | 50d25272b11ba1ca56aaa6a268808cb136a655dd /vp9/encoder | |
parent | 29a5deb40cd1c86da04bff0cd448cd43324c7ec4 (diff) | |
download | libvpx-ea061a885deea564e52145d3affaf33c0f7871a6.tar libvpx-ea061a885deea564e52145d3affaf33c0f7871a6.tar.gz libvpx-ea061a885deea564e52145d3affaf33c0f7871a6.tar.bz2 libvpx-ea061a885deea564e52145d3affaf33c0f7871a6.zip |
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
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_denoiser.c | 40 |
1 files changed, 25 insertions, 15 deletions
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]); } } |