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