From d602500d4ae6e8936ee630e92b56f87005a14828 Mon Sep 17 00:00:00 2001 From: Yaowu Xu Date: Wed, 8 Oct 2014 09:06:36 -0700 Subject: [PATCH] Fix src frame buffer copy and extend For input source with size that is not multiple of 8, the size is rounded to 8 and saved in width or height, the original source sizes are saved in crop_width and crop_height. This commit corrects the computation of bottom and right extension amounts to use the orignal sizes, hence crop_width and crop_height. In addition, this commit also adds the missed initialization for uv_crop_width and uv_crop_height. This addresses issue #834 Change-Id: I084543ca7645a4964b88f7cf8ff668f517d3a39b --- vp9/encoder/vp9_extend.c | 20 ++++++++++---------- vp9/vp9_iface_common.h | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/vp9/encoder/vp9_extend.c b/vp9/encoder/vp9_extend.c index 5b01bc9f2..c9b213142 100644 --- a/vp9/encoder/vp9_extend.c +++ b/vp9/encoder/vp9_extend.c @@ -110,10 +110,10 @@ void vp9_copy_and_extend_frame(const YV12_BUFFER_CONFIG *src, // Motion estimation may use src block variance with the block size up // to 64x64, so the right and bottom need to be extended to 64 multiple // or up to 16, whichever is greater. - const int eb_y = MAX(ALIGN_POWER_OF_TWO(src->y_width, 6) - src->y_width, - 16); - const int er_y = MAX(ALIGN_POWER_OF_TWO(src->y_height, 6) - src->y_height, - 16); + const int eb_y = MAX(src->y_width + 16, ALIGN_POWER_OF_TWO(src->y_width, 6)) + - src->y_crop_width; + const int er_y = MAX(src->y_height + 16, ALIGN_POWER_OF_TWO(src->y_height, 6)) + - src->y_crop_height; const int uv_width_subsampling = (src->uv_width != src->y_width); const int uv_height_subsampling = (src->uv_height != src->y_height); const int et_uv = et_y >> uv_height_subsampling; @@ -125,17 +125,17 @@ void vp9_copy_and_extend_frame(const YV12_BUFFER_CONFIG *src, if (src->flags & YV12_FLAG_HIGHBITDEPTH) { highbd_copy_and_extend_plane(src->y_buffer, src->y_stride, dst->y_buffer, dst->y_stride, - src->y_width, src->y_height, + src->y_crop_width, src->y_crop_height, et_y, el_y, eb_y, er_y); highbd_copy_and_extend_plane(src->u_buffer, src->uv_stride, dst->u_buffer, dst->uv_stride, - src->uv_width, src->uv_height, + src->uv_crop_width, src->uv_crop_height, et_uv, el_uv, eb_uv, er_uv); highbd_copy_and_extend_plane(src->v_buffer, src->uv_stride, dst->v_buffer, dst->uv_stride, - src->uv_width, src->uv_height, + src->uv_crop_width, src->uv_crop_height, et_uv, el_uv, eb_uv, er_uv); return; } @@ -143,17 +143,17 @@ void vp9_copy_and_extend_frame(const YV12_BUFFER_CONFIG *src, copy_and_extend_plane(src->y_buffer, src->y_stride, dst->y_buffer, dst->y_stride, - src->y_width, src->y_height, + src->y_crop_width, src->y_crop_height, et_y, el_y, eb_y, er_y); copy_and_extend_plane(src->u_buffer, src->uv_stride, dst->u_buffer, dst->uv_stride, - src->uv_width, src->uv_height, + src->uv_crop_width, src->uv_crop_height, et_uv, el_uv, eb_uv, er_uv); copy_and_extend_plane(src->v_buffer, src->uv_stride, dst->v_buffer, dst->uv_stride, - src->uv_width, src->uv_height, + src->uv_crop_width, src->uv_crop_height, et_uv, el_uv, eb_uv, er_uv); } diff --git a/vp9/vp9_iface_common.h b/vp9/vp9_iface_common.h index 1ce87ef82..00fbfdd7d 100644 --- a/vp9/vp9_iface_common.h +++ b/vp9/vp9_iface_common.h @@ -87,6 +87,8 @@ static vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, : yv12->y_width; yv12->uv_height = img->y_chroma_shift == 1 ? (1 + yv12->y_height) / 2 : yv12->y_height; + yv12->uv_crop_width = yv12->uv_width; + yv12->uv_crop_height = yv12->uv_height; yv12->y_stride = img->stride[VPX_PLANE_Y]; yv12->uv_stride = img->stride[VPX_PLANE_U];