Index: source/libvpx/vp9/encoder/vp9_extend.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_extend.c (revision 292608) |
+++ source/libvpx/vp9/encoder/vp9_extend.c (working copy) |
@@ -55,6 +55,52 @@ |
} |
} |
+#if CONFIG_VP9_HIGHBITDEPTH |
+static void highbd_copy_and_extend_plane(const uint8_t *src8, int src_pitch, |
+ uint8_t *dst8, int dst_pitch, |
+ int w, int h, |
+ int extend_top, int extend_left, |
+ int extend_bottom, int extend_right) { |
+ int i, linesize; |
+ uint16_t *src = CONVERT_TO_SHORTPTR(src8); |
+ uint16_t *dst = CONVERT_TO_SHORTPTR(dst8); |
+ |
+ // copy the left and right most columns out |
+ const uint16_t *src_ptr1 = src; |
+ const uint16_t *src_ptr2 = src + w - 1; |
+ uint16_t *dst_ptr1 = dst - extend_left; |
+ uint16_t *dst_ptr2 = dst + w; |
+ |
+ for (i = 0; i < h; i++) { |
+ vpx_memset16(dst_ptr1, src_ptr1[0], extend_left); |
+ vpx_memcpy(dst_ptr1 + extend_left, src_ptr1, w * sizeof(uint16_t)); |
+ vpx_memset16(dst_ptr2, src_ptr2[0], extend_right); |
+ src_ptr1 += src_pitch; |
+ src_ptr2 += src_pitch; |
+ dst_ptr1 += dst_pitch; |
+ dst_ptr2 += dst_pitch; |
+ } |
+ |
+ // Now copy the top and bottom lines into each line of the respective |
+ // borders |
+ src_ptr1 = dst - extend_left; |
+ src_ptr2 = dst + dst_pitch * (h - 1) - extend_left; |
+ dst_ptr1 = dst + dst_pitch * (-extend_top) - extend_left; |
+ dst_ptr2 = dst + dst_pitch * (h) - extend_left; |
+ linesize = extend_left + extend_right + w; |
+ |
+ for (i = 0; i < extend_top; i++) { |
+ vpx_memcpy(dst_ptr1, src_ptr1, linesize * sizeof(uint16_t)); |
+ dst_ptr1 += dst_pitch; |
+ } |
+ |
+ for (i = 0; i < extend_bottom; i++) { |
+ vpx_memcpy(dst_ptr2, src_ptr2, linesize * sizeof(uint16_t)); |
+ dst_ptr2 += dst_pitch; |
+ } |
+} |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
+ |
void vp9_copy_and_extend_frame(const YV12_BUFFER_CONFIG *src, |
YV12_BUFFER_CONFIG *dst) { |
// Extend src frame in buffer |
@@ -64,10 +110,10 @@ |
// 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; |
@@ -75,19 +121,39 @@ |
const int eb_uv = eb_y >> uv_height_subsampling; |
const int er_uv = er_y >> uv_width_subsampling; |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ 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_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_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_crop_width, src->uv_crop_height, |
+ et_uv, el_uv, eb_uv, er_uv); |
+ return; |
+ } |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
+ |
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); |
} |