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