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 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "extend.h" 13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void copy_and_extend_plane 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *s, /* source */ 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int sp, /* source pitch */ 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *d, /* destination */ 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dp, /* destination pitch */ 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int h, /* height */ 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int w, /* width */ 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int et, /* extend top border */ 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int el, /* extend left border */ 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int eb, /* extend bottom border */ 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int er /* extend right border */ 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr1, *src_ptr2; 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dest_ptr1, *dest_ptr2; 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int linesize; 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* copy the left and right most columns out */ 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr1 = s; 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr2 = s + w - 1; 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest_ptr1 = d - el; 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest_ptr2 = d + w; 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < h; i++) 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(dest_ptr1, src_ptr1[0], el); 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(dest_ptr1 + el, src_ptr1, w); 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(dest_ptr2, src_ptr2[0], er); 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr1 += sp; 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr2 += sp; 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest_ptr1 += dp; 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest_ptr2 += dp; 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Now copy the top and bottom lines into each line of the respective 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * borders 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr1 = d - el; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr2 = d + dp * (h - 1) - el; 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest_ptr1 = d + dp * (-et) - el; 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest_ptr2 = d + dp * (h) - el; 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org linesize = el + er + w; 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < et; i++) 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(dest_ptr1, src_ptr1, linesize); 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest_ptr1 += dp; 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < eb; i++) 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(dest_ptr2, src_ptr2, linesize); 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dest_ptr2 += dp; 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_copy_and_extend_frame(YV12_BUFFER_CONFIG *src, 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YV12_BUFFER_CONFIG *dst) 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int et = dst->border; 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int el = dst->border; 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int eb = dst->border + dst->y_height - src->y_height; 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int er = dst->border + dst->y_width - src->y_width; 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org copy_and_extend_plane(src->y_buffer, src->y_stride, 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst->y_buffer, dst->y_stride, 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src->y_height, src->y_width, 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org et, el, eb, er); 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org et = dst->border >> 1; 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org el = dst->border >> 1; 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org eb = (dst->border >> 1) + dst->uv_height - src->uv_height; 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org er = (dst->border >> 1) + dst->uv_width - src->uv_width; 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org copy_and_extend_plane(src->u_buffer, src->uv_stride, 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst->u_buffer, dst->uv_stride, 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src->uv_height, src->uv_width, 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org et, el, eb, er); 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org copy_and_extend_plane(src->v_buffer, src->uv_stride, 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst->v_buffer, dst->uv_stride, 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src->uv_height, src->uv_width, 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org et, el, eb, er); 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 105167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_copy_and_extend_frame_with_rect(YV12_BUFFER_CONFIG *src, 106167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org YV12_BUFFER_CONFIG *dst, 107167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int srcy, int srcx, 108167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int srch, int srcw) 109167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 110167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int et = dst->border; 111167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int el = dst->border; 112167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int eb = dst->border + dst->y_height - src->y_height; 113167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int er = dst->border + dst->y_width - src->y_width; 114167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int src_y_offset = srcy * src->y_stride + srcx; 115167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int dst_y_offset = srcy * dst->y_stride + srcx; 116167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int src_uv_offset = ((srcy * src->uv_stride) >> 1) + (srcx >> 1); 117167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int dst_uv_offset = ((srcy * dst->uv_stride) >> 1) + (srcx >> 1); 118167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* If the side is not touching the bounder then don't extend. */ 120167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (srcy) 121167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org et = 0; 122167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (srcx) 123167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org el = 0; 124167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (srcy + srch != src->y_height) 125167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org eb = 0; 126167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (srcx + srcw != src->y_width) 127167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org er = 0; 128167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 129167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org copy_and_extend_plane(src->y_buffer + src_y_offset, 130167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org src->y_stride, 131167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst->y_buffer + dst_y_offset, 132167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst->y_stride, 133167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org srch, srcw, 134167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org et, el, eb, er); 135167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 136167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org et = (et + 1) >> 1; 137167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org el = (el + 1) >> 1; 138167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org eb = (eb + 1) >> 1; 139167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org er = (er + 1) >> 1; 140167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org srch = (srch + 1) >> 1; 141167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org srcw = (srcw + 1) >> 1; 142167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 143167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org copy_and_extend_plane(src->u_buffer + src_uv_offset, 144167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org src->uv_stride, 145167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst->u_buffer + dst_uv_offset, 146167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst->uv_stride, 147167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org srch, srcw, 148167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org et, el, eb, er); 149167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 150167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org copy_and_extend_plane(src->v_buffer + src_uv_offset, 151167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org src->uv_stride, 152167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst->v_buffer + dst_uv_offset, 153167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst->uv_stride, 154167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org srch, srcw, 155167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org et, el, eb, er); 156167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 157167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 158167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* note the extension is only for the last row, for intra prediction purpose */ 160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_extend_mb_row(YV12_BUFFER_CONFIG *ybf, 161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *YPtr, 162ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *UPtr, 163ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *VPtr) 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YPtr += ybf->y_stride * 14; 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org UPtr += ybf->uv_stride * 6; 169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPtr += ybf->uv_stride * 6; 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 4; i++) 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YPtr[i] = YPtr[-1]; 174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org UPtr[i] = UPtr[-1]; 175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPtr[i] = VPtr[-1]; 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YPtr += ybf->y_stride; 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org UPtr += ybf->uv_stride; 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPtr += ybf->uv_stride; 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 4; i++) 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YPtr[i] = YPtr[-1]; 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org UPtr[i] = UPtr[-1]; 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPtr[i] = VPtr[-1]; 187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 189