1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include <assert.h>
1210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#include "./vpx_config.h"
1353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#include "vpx/vpx_integer.h"
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h"
1553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#include "vpx_scale/yv12config.h"
16d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH
17d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#include "vp9/common/vp9_common.h"
18d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
2053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgstatic void extend_plane(uint8_t *const src, int src_stride,
2153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                         int width, int height,
2253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                         int extend_top, int extend_left,
2353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                         int extend_bottom, int extend_right) {
24ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  int i;
2553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  const int linesize = extend_left + extend_right + width;
26ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
27ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  /* copy the left and right most columns out */
2853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  uint8_t *src_ptr1 = src;
2953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  uint8_t *src_ptr2 = src + width - 1;
3053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  uint8_t *dst_ptr1 = src - extend_left;
3153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  uint8_t *dst_ptr2 = src + width;
3253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org
3353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  for (i = 0; i < height; ++i) {
3453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memset(dst_ptr1, src_ptr1[0], extend_left);
3553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memset(dst_ptr2, src_ptr2[0], extend_right);
3653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    src_ptr1 += src_stride;
3753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    src_ptr2 += src_stride;
3853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    dst_ptr1 += src_stride;
3953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    dst_ptr2 += src_stride;
40ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
41ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
42923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  /* Now copy the top and bottom lines into each line of the respective
43923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   * borders
44923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   */
4553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  src_ptr1 = src - extend_left;
4653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  src_ptr2 = src + src_stride * (height - 1) - extend_left;
4753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  dst_ptr1 = src + src_stride * -extend_top - extend_left;
4853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  dst_ptr2 = src + src_stride * height - extend_left;
4953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org
5053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  for (i = 0; i < extend_top; ++i) {
5153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memcpy(dst_ptr1, src_ptr1, linesize);
5253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    dst_ptr1 += src_stride;
53ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
54ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
5553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  for (i = 0; i < extend_bottom; ++i) {
5653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memcpy(dst_ptr2, src_ptr2, linesize);
5753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    dst_ptr2 += src_stride;
58ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
61d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH
62d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgstatic void extend_plane_high(uint8_t *const src8, int src_stride,
63d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                              int width, int height,
64d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                              int extend_top, int extend_left,
65d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                              int extend_bottom, int extend_right) {
66d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  int i;
67d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  const int linesize = extend_left + extend_right + width;
68d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  uint16_t *src = CONVERT_TO_SHORTPTR(src8);
69d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
70d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  /* copy the left and right most columns out */
71d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  uint16_t *src_ptr1 = src;
72d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  uint16_t *src_ptr2 = src + width - 1;
73d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  uint16_t *dst_ptr1 = src - extend_left;
74d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  uint16_t *dst_ptr2 = src + width;
75d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
76d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  for (i = 0; i < height; ++i) {
77d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    vpx_memset16(dst_ptr1, src_ptr1[0], extend_left);
78d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    vpx_memset16(dst_ptr2, src_ptr2[0], extend_right);
79d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    src_ptr1 += src_stride;
80d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    src_ptr2 += src_stride;
81d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    dst_ptr1 += src_stride;
82d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    dst_ptr2 += src_stride;
83d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  }
84d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
85d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  /* Now copy the top and bottom lines into each line of the respective
86d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org   * borders
87d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org   */
88d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  src_ptr1 = src - extend_left;
89d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  src_ptr2 = src + src_stride * (height - 1) - extend_left;
90d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  dst_ptr1 = src + src_stride * -extend_top - extend_left;
91d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  dst_ptr2 = src + src_stride * height - extend_left;
92d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
93d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  for (i = 0; i < extend_top; ++i) {
94d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    vpx_memcpy(dst_ptr1, src_ptr1, linesize * sizeof(uint16_t));
95d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    dst_ptr1 += src_stride;
96d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  }
97d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
98d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  for (i = 0; i < extend_bottom; ++i) {
99d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    vpx_memcpy(dst_ptr2, src_ptr2, linesize * sizeof(uint16_t));
100d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    dst_ptr2 += src_stride;
101d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  }
102d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org}
103d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif
104d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
10553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgvoid vp8_yv12_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf) {
10641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const int uv_border = ybf->border / 2;
10741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
10841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  assert(ybf->border % 2 == 0);
109923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  assert(ybf->y_height - ybf->y_crop_height < 16);
110923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  assert(ybf->y_width - ybf->y_crop_width < 16);
111923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  assert(ybf->y_height - ybf->y_crop_height >= 0);
112923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  assert(ybf->y_width - ybf->y_crop_width >= 0);
113923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
114d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH
115d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  if (ybf->flags & YV12_FLAG_HIGHBITDEPTH) {
116d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    extend_plane_high(
117d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->y_buffer, ybf->y_stride,
118d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->y_crop_width, ybf->y_crop_height,
119d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->border, ybf->border,
120d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->border + ybf->y_height - ybf->y_crop_height,
121d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->border + ybf->y_width - ybf->y_crop_width);
122d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
123d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    extend_plane_high(
124d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->u_buffer, ybf->uv_stride,
125d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        (ybf->y_crop_width + 1) / 2, (ybf->y_crop_height + 1) / 2,
126d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->border / 2, ybf->border / 2,
127d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        (ybf->border + ybf->y_height - ybf->y_crop_height + 1) / 2,
128d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        (ybf->border + ybf->y_width - ybf->y_crop_width + 1) / 2);
129d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
130d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    extend_plane_high(
131d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->v_buffer, ybf->uv_stride,
132d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        (ybf->y_crop_width + 1) / 2, (ybf->y_crop_height + 1) / 2,
133d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        ybf->border / 2, ybf->border / 2,
134d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        (ybf->border + ybf->y_height - ybf->y_crop_height + 1) / 2,
135d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org        (ybf->border + ybf->y_width - ybf->y_crop_width + 1) / 2);
136d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    return;
137d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  }
138d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif
139923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  extend_plane(ybf->y_buffer, ybf->y_stride,
140923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org               ybf->y_crop_width, ybf->y_crop_height,
141923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org               ybf->border, ybf->border,
142923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org               ybf->border + ybf->y_height - ybf->y_crop_height,
143923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org               ybf->border + ybf->y_width - ybf->y_crop_width);
144923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
145923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  extend_plane(ybf->u_buffer, ybf->uv_stride,
14641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               ybf->uv_crop_width, ybf->uv_crop_height,
14741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               uv_border, uv_border,
14841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               uv_border + ybf->uv_height - ybf->uv_crop_height,
14941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               uv_border + ybf->uv_width - ybf->uv_crop_width);
150923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
151923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  extend_plane(ybf->v_buffer, ybf->uv_stride,
15241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               ybf->uv_crop_width, ybf->uv_crop_height,
15341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               uv_border, uv_border,
15441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               uv_border + ybf->uv_height - ybf->uv_crop_height,
15541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org               uv_border + ybf->uv_width - ybf->uv_crop_width);
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
15810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#if CONFIG_VP9
159411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgstatic void extend_frame(YV12_BUFFER_CONFIG *const ybf, int ext_size) {
160d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  const int c_w = ybf->uv_crop_width;
161d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  const int c_h = ybf->uv_crop_height;
16288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int ss_x = ybf->uv_width < ybf->y_width;
16388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int ss_y = ybf->uv_height < ybf->y_height;
16488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int c_et = ext_size >> ss_y;
16588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int c_el = ext_size >> ss_x;
16688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int c_eb = c_et + ybf->uv_height - ybf->uv_crop_height;
16788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const int c_er = c_el + ybf->uv_width - ybf->uv_crop_width;
16810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
16910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  assert(ybf->y_height - ybf->y_crop_height < 16);
17010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  assert(ybf->y_width - ybf->y_crop_width < 16);
17110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  assert(ybf->y_height - ybf->y_crop_height >= 0);
17210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  assert(ybf->y_width - ybf->y_crop_width >= 0);
17310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
174d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
175d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  if (ybf->flags & YV12_FLAG_HIGHBITDEPTH) {
176d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    extend_plane_high(ybf->y_buffer, ybf->y_stride,
177d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                      ybf->y_crop_width, ybf->y_crop_height,
178d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                      ext_size, ext_size,
179d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                      ext_size + ybf->y_height - ybf->y_crop_height,
180d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                      ext_size + ybf->y_width - ybf->y_crop_width);
181d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    extend_plane_high(ybf->u_buffer, ybf->uv_stride,
182d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                      c_w, c_h, c_et, c_el, c_eb, c_er);
183d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    extend_plane_high(ybf->v_buffer, ybf->uv_stride,
184d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org                      c_w, c_h, c_et, c_el, c_eb, c_er);
185d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    return;
186d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  }
187d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif
18810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  extend_plane(ybf->y_buffer, ybf->y_stride,
18910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org               ybf->y_crop_width, ybf->y_crop_height,
1901caff2f5cf4bc45ee1798419784f1416d5787dfefgalligan@chromium.org               ext_size, ext_size,
1911caff2f5cf4bc45ee1798419784f1416d5787dfefgalligan@chromium.org               ext_size + ybf->y_height - ybf->y_crop_height,
1921caff2f5cf4bc45ee1798419784f1416d5787dfefgalligan@chromium.org               ext_size + ybf->y_width - ybf->y_crop_width);
19310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
19410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  extend_plane(ybf->u_buffer, ybf->uv_stride,
19510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org               c_w, c_h, c_et, c_el, c_eb, c_er);
19610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
19710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  extend_plane(ybf->v_buffer, ybf->uv_stride,
19810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org               c_w, c_h, c_et, c_el, c_eb, c_er);
19910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}
2001caff2f5cf4bc45ee1798419784f1416d5787dfefgalligan@chromium.org
201411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgvoid vp9_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf) {
202411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org  extend_frame(ybf, ybf->border);
2031caff2f5cf4bc45ee1798419784f1416d5787dfefgalligan@chromium.org}
2041caff2f5cf4bc45ee1798419784f1416d5787dfefgalligan@chromium.org
205411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgvoid vp9_extend_frame_inner_borders_c(YV12_BUFFER_CONFIG *ybf) {
20653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  const int inner_bw = (ybf->border > VP9INNERBORDERINPIXELS) ?
20753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                       VP9INNERBORDERINPIXELS : ybf->border;
208411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org  extend_frame(ybf, inner_bw);
2091caff2f5cf4bc45ee1798419784f1416d5787dfefgalligan@chromium.org}
210d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
211d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
212d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid memcpy_short_addr(uint8_t *dst8, const uint8_t *src8, int num) {
213d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  uint16_t *dst = CONVERT_TO_SHORTPTR(dst8);
214d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  uint16_t *src = CONVERT_TO_SHORTPTR(src8);
215d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  vpx_memcpy(dst, src, num * sizeof(uint16_t));
216d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org}
217d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif  // CONFIG_VP9_HIGHBITDEPTH
21853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#endif  // CONFIG_VP9
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
22053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org// Copies the source image into the destination image and updates the
22153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org// destination's UMV borders.
22253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org// Note: The frames are assumed to be identical in size.
22353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgvoid vp8_yv12_copy_frame_c(const YV12_BUFFER_CONFIG *src_ybc,
22453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                           YV12_BUFFER_CONFIG *dst_ybc) {
225ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  int row;
22653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  const uint8_t *src = src_ybc->y_buffer;
22753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  uint8_t *dst = dst_ybc->y_buffer;
228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
229923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if 0
230923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  /* These assertions are valid in the codec, but the libvpx-tester uses
231923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   * this code slightly differently.
232923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   */
233923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  assert(src_ybc->y_width == dst_ybc->y_width);
234923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  assert(src_ybc->y_height == dst_ybc->y_height);
235923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#endif
236923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
237d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH
238d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  if (src_ybc->flags & YV12_FLAG_HIGHBITDEPTH) {
239d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    assert(dst_ybc->flags & YV12_FLAG_HIGHBITDEPTH);
240d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    for (row = 0; row < src_ybc->y_height; ++row) {
241d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      memcpy_short_addr(dst, src, src_ybc->y_width);
242d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      src += src_ybc->y_stride;
243d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      dst += dst_ybc->y_stride;
244d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    }
245d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
246d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    src = src_ybc->u_buffer;
247d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    dst = dst_ybc->u_buffer;
248d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
249d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    for (row = 0; row < src_ybc->uv_height; ++row) {
250d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      memcpy_short_addr(dst, src, src_ybc->uv_width);
251d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      src += src_ybc->uv_stride;
252d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      dst += dst_ybc->uv_stride;
253d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    }
254d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
255d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    src = src_ybc->v_buffer;
256d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    dst = dst_ybc->v_buffer;
257d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
258d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    for (row = 0; row < src_ybc->uv_height; ++row) {
259d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      memcpy_short_addr(dst, src, src_ybc->uv_width);
260d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      src += src_ybc->uv_stride;
261d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      dst += dst_ybc->uv_stride;
262d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    }
263d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
264d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    vp8_yv12_extend_frame_borders_c(dst_ybc);
265d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    return;
266d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  } else {
267d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    assert(!(dst_ybc->flags & YV12_FLAG_HIGHBITDEPTH));
268d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  }
269d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif
270d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
27153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  for (row = 0; row < src_ybc->y_height; ++row) {
27253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memcpy(dst, src, src_ybc->y_width);
27353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    src += src_ybc->y_stride;
27453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    dst += dst_ybc->y_stride;
275ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
276ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
27753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  src = src_ybc->u_buffer;
27853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  dst = dst_ybc->u_buffer;
279ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
28053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  for (row = 0; row < src_ybc->uv_height; ++row) {
28153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memcpy(dst, src, src_ybc->uv_width);
28253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    src += src_ybc->uv_stride;
28353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    dst += dst_ybc->uv_stride;
284ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
285ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
28653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  src = src_ybc->v_buffer;
28753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  dst = dst_ybc->v_buffer;
288ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
28953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  for (row = 0; row < src_ybc->uv_height; ++row) {
29053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memcpy(dst, src, src_ybc->uv_width);
29153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    src += src_ybc->uv_stride;
29253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    dst += dst_ybc->uv_stride;
293ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vp8_yv12_extend_frame_borders_c(dst_ybc);
296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
29853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgvoid vpx_yv12_copy_y_c(const YV12_BUFFER_CONFIG *src_ybc,
299ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                       YV12_BUFFER_CONFIG *dst_ybc) {
300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  int row;
30153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  const uint8_t *src = src_ybc->y_buffer;
30253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  uint8_t *dst = dst_ybc->y_buffer;
303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
304d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH
305d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  if (src_ybc->flags & YV12_FLAG_HIGHBITDEPTH) {
306d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    const uint16_t *src16 = CONVERT_TO_SHORTPTR(src);
307d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    uint16_t *dst16 = CONVERT_TO_SHORTPTR(dst);
308d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    for (row = 0; row < src_ybc->y_height; ++row) {
309d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      vpx_memcpy(dst16, src16, src_ybc->y_width * sizeof(uint16_t));
310d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      src16 += src_ybc->y_stride;
311d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org      dst16 += dst_ybc->y_stride;
312d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    }
313d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org    return;
314d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  }
315d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif
316d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
31753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  for (row = 0; row < src_ybc->y_height; ++row) {
31853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memcpy(dst, src, src_ybc->y_width);
31953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    src += src_ybc->y_stride;
32053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    dst += dst_ybc->y_stride;
321ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
323