Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(576)

Side by Side Diff: source/libvpx/vpx_scale/generic/yv12extend.c

Issue 23600008: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vpx_scale/generic/yv12config.c ('k') | source/libvpx/vpx_scale/vpx_scale_rtcd.sh » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <assert.h> 11 #include <assert.h>
12 #include "./vpx_config.h" 12 #include "./vpx_config.h"
13 #include "vpx/vpx_integer.h"
14 #include "vpx_mem/vpx_mem.h"
13 #include "vpx_scale/yv12config.h" 15 #include "vpx_scale/yv12config.h"
14 #include "vpx_mem/vpx_mem.h"
15 #include "vpx_scale/vpx_scale.h"
16 16
17 /**************************************************************************** 17 static void extend_plane(uint8_t *const src, int src_stride,
18 * Exports 18 int width, int height,
19 ****************************************************************************/ 19 int extend_top, int extend_left,
20 20 int extend_bottom, int extend_right) {
21 /****************************************************************************
22 *
23 ****************************************************************************/
24 static void extend_plane(uint8_t *s, /* source */
25 int sp, /* source pitch */
26 int w, /* width */
27 int h, /* height */
28 int et, /* extend top border */
29 int el, /* extend left border */
30 int eb, /* extend bottom border */
31 int er) { /* extend right border */
32 int i; 21 int i;
33 uint8_t *src_ptr1, *src_ptr2; 22 const int linesize = extend_left + extend_right + width;
34 uint8_t *dest_ptr1, *dest_ptr2;
35 int linesize;
36 23
37 /* copy the left and right most columns out */ 24 /* copy the left and right most columns out */
38 src_ptr1 = s; 25 uint8_t *src_ptr1 = src;
39 src_ptr2 = s + w - 1; 26 uint8_t *src_ptr2 = src + width - 1;
40 dest_ptr1 = s - el; 27 uint8_t *dst_ptr1 = src - extend_left;
41 dest_ptr2 = s + w; 28 uint8_t *dst_ptr2 = src + width;
42 29
43 for (i = 0; i < h; i++) { 30 for (i = 0; i < height; ++i) {
44 vpx_memset(dest_ptr1, src_ptr1[0], el); 31 vpx_memset(dst_ptr1, src_ptr1[0], extend_left);
45 vpx_memset(dest_ptr2, src_ptr2[0], er); 32 vpx_memset(dst_ptr2, src_ptr2[0], extend_right);
46 src_ptr1 += sp; 33 src_ptr1 += src_stride;
47 src_ptr2 += sp; 34 src_ptr2 += src_stride;
48 dest_ptr1 += sp; 35 dst_ptr1 += src_stride;
49 dest_ptr2 += sp; 36 dst_ptr2 += src_stride;
50 } 37 }
51 38
52 /* Now copy the top and bottom lines into each line of the respective 39 /* Now copy the top and bottom lines into each line of the respective
53 * borders 40 * borders
54 */ 41 */
55 src_ptr1 = s - el; 42 src_ptr1 = src - extend_left;
56 src_ptr2 = s + sp * (h - 1) - el; 43 src_ptr2 = src + src_stride * (height - 1) - extend_left;
57 dest_ptr1 = s + sp * (-et) - el; 44 dst_ptr1 = src + src_stride * -extend_top - extend_left;
58 dest_ptr2 = s + sp * (h) - el; 45 dst_ptr2 = src + src_stride * height - extend_left;
59 linesize = el + er + w;
60 46
61 for (i = 0; i < et; i++) { 47 for (i = 0; i < extend_top; ++i) {
62 vpx_memcpy(dest_ptr1, src_ptr1, linesize); 48 vpx_memcpy(dst_ptr1, src_ptr1, linesize);
63 dest_ptr1 += sp; 49 dst_ptr1 += src_stride;
64 } 50 }
65 51
66 for (i = 0; i < eb; i++) { 52 for (i = 0; i < extend_bottom; ++i) {
67 vpx_memcpy(dest_ptr2, src_ptr2, linesize); 53 vpx_memcpy(dst_ptr2, src_ptr2, linesize);
68 dest_ptr2 += sp; 54 dst_ptr2 += src_stride;
69 } 55 }
70 } 56 }
71 57
72 void 58 void vp8_yv12_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf) {
73 vp8_yv12_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf) {
74 assert(ybf->y_height - ybf->y_crop_height < 16); 59 assert(ybf->y_height - ybf->y_crop_height < 16);
75 assert(ybf->y_width - ybf->y_crop_width < 16); 60 assert(ybf->y_width - ybf->y_crop_width < 16);
76 assert(ybf->y_height - ybf->y_crop_height >= 0); 61 assert(ybf->y_height - ybf->y_crop_height >= 0);
77 assert(ybf->y_width - ybf->y_crop_width >= 0); 62 assert(ybf->y_width - ybf->y_crop_width >= 0);
78 63
79 extend_plane(ybf->y_buffer, ybf->y_stride, 64 extend_plane(ybf->y_buffer, ybf->y_stride,
80 ybf->y_crop_width, ybf->y_crop_height, 65 ybf->y_crop_width, ybf->y_crop_height,
81 ybf->border, ybf->border, 66 ybf->border, ybf->border,
82 ybf->border + ybf->y_height - ybf->y_crop_height, 67 ybf->border + ybf->y_height - ybf->y_crop_height,
83 ybf->border + ybf->y_width - ybf->y_crop_width); 68 ybf->border + ybf->y_width - ybf->y_crop_width);
84 69
85 extend_plane(ybf->u_buffer, ybf->uv_stride, 70 extend_plane(ybf->u_buffer, ybf->uv_stride,
86 (ybf->y_crop_width + 1) / 2, (ybf->y_crop_height + 1) / 2, 71 (ybf->y_crop_width + 1) / 2, (ybf->y_crop_height + 1) / 2,
87 ybf->border / 2, ybf->border / 2, 72 ybf->border / 2, ybf->border / 2,
88 (ybf->border + ybf->y_height - ybf->y_crop_height + 1) / 2, 73 (ybf->border + ybf->y_height - ybf->y_crop_height + 1) / 2,
89 (ybf->border + ybf->y_width - ybf->y_crop_width + 1) / 2); 74 (ybf->border + ybf->y_width - ybf->y_crop_width + 1) / 2);
90 75
91 extend_plane(ybf->v_buffer, ybf->uv_stride, 76 extend_plane(ybf->v_buffer, ybf->uv_stride,
92 (ybf->y_crop_width + 1) / 2, (ybf->y_crop_height + 1) / 2, 77 (ybf->y_crop_width + 1) / 2, (ybf->y_crop_height + 1) / 2,
93 ybf->border / 2, ybf->border / 2, 78 ybf->border / 2, ybf->border / 2,
94 (ybf->border + ybf->y_height - ybf->y_crop_height + 1) / 2, 79 (ybf->border + ybf->y_height - ybf->y_crop_height + 1) / 2,
95 (ybf->border + ybf->y_width - ybf->y_crop_width + 1) / 2); 80 (ybf->border + ybf->y_width - ybf->y_crop_width + 1) / 2);
96 } 81 }
97 82
98 #if CONFIG_VP9 83 #if CONFIG_VP9
99 static void extend_frame(YV12_BUFFER_CONFIG *ybf, 84 static void extend_frame(YV12_BUFFER_CONFIG *const ybf,
100 int subsampling_x, int subsampling_y, 85 int subsampling_x, int subsampling_y,
101 int ext_size) { 86 int ext_size) {
102 const int c_w = (ybf->y_crop_width + subsampling_x) >> subsampling_x; 87 const int c_w = (ybf->y_crop_width + subsampling_x) >> subsampling_x;
103 const int c_h = (ybf->y_crop_height + subsampling_y) >> subsampling_y; 88 const int c_h = (ybf->y_crop_height + subsampling_y) >> subsampling_y;
104 const int c_et = ext_size >> subsampling_y; 89 const int c_et = ext_size >> subsampling_y;
105 const int c_el = ext_size >> subsampling_x; 90 const int c_el = ext_size >> subsampling_x;
106 const int c_eb = (ext_size + ybf->y_height - ybf->y_crop_height + 91 const int c_eb = (ext_size + ybf->y_height - ybf->y_crop_height +
107 subsampling_y) >> subsampling_y; 92 subsampling_y) >> subsampling_y;
108 const int c_er = (ext_size + ybf->y_width - ybf->y_crop_width + 93 const int c_er = (ext_size + ybf->y_width - ybf->y_crop_width +
109 subsampling_x) >> subsampling_x; 94 subsampling_x) >> subsampling_x;
110 95
111 assert(ybf->y_height - ybf->y_crop_height < 16); 96 assert(ybf->y_height - ybf->y_crop_height < 16);
112 assert(ybf->y_width - ybf->y_crop_width < 16); 97 assert(ybf->y_width - ybf->y_crop_width < 16);
113 assert(ybf->y_height - ybf->y_crop_height >= 0); 98 assert(ybf->y_height - ybf->y_crop_height >= 0);
114 assert(ybf->y_width - ybf->y_crop_width >= 0); 99 assert(ybf->y_width - ybf->y_crop_width >= 0);
115 100
116 extend_plane(ybf->y_buffer, ybf->y_stride, 101 extend_plane(ybf->y_buffer, ybf->y_stride,
117 ybf->y_crop_width, ybf->y_crop_height, 102 ybf->y_crop_width, ybf->y_crop_height,
118 ext_size, ext_size, 103 ext_size, ext_size,
119 ext_size + ybf->y_height - ybf->y_crop_height, 104 ext_size + ybf->y_height - ybf->y_crop_height,
120 ext_size + ybf->y_width - ybf->y_crop_width); 105 ext_size + ybf->y_width - ybf->y_crop_width);
121 106
122 extend_plane(ybf->u_buffer, ybf->uv_stride, 107 extend_plane(ybf->u_buffer, ybf->uv_stride,
123 c_w, c_h, c_et, c_el, c_eb, c_er); 108 c_w, c_h, c_et, c_el, c_eb, c_er);
124 109
125 extend_plane(ybf->v_buffer, ybf->uv_stride, 110 extend_plane(ybf->v_buffer, ybf->uv_stride,
126 c_w, c_h, c_et, c_el, c_eb, c_er); 111 c_w, c_h, c_et, c_el, c_eb, c_er);
127 } 112 }
128 113
129
130 void vp9_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf, 114 void vp9_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf,
131 int subsampling_x, int subsampling_y) { 115 int subsampling_x, int subsampling_y) {
132 extend_frame(ybf, subsampling_x, subsampling_y, ybf->border); 116 extend_frame(ybf, subsampling_x, subsampling_y, ybf->border);
133 } 117 }
134 118
135 void vp9_extend_frame_inner_borders_c(YV12_BUFFER_CONFIG *ybf, 119 void vp9_extend_frame_inner_borders_c(YV12_BUFFER_CONFIG *ybf,
136 int subsampling_x, int subsampling_y) { 120 int subsampling_x, int subsampling_y) {
137 const int inner_bw = ybf->border > VP9INNERBORDERINPIXLES ? 121 const int inner_bw = (ybf->border > VP9INNERBORDERINPIXELS) ?
138 VP9INNERBORDERINPIXLES : ybf->border; 122 VP9INNERBORDERINPIXELS : ybf->border;
139 extend_frame(ybf, subsampling_x, subsampling_y, inner_bw); 123 extend_frame(ybf, subsampling_x, subsampling_y, inner_bw);
140 } 124 }
141 #endif 125 #endif // CONFIG_VP9
142 126
143 /**************************************************************************** 127 // Copies the source image into the destination image and updates the
144 * 128 // destination's UMV borders.
145 * ROUTINE : vp8_yv12_copy_frame 129 // Note: The frames are assumed to be identical in size.
146 * 130 void vp8_yv12_copy_frame_c(const YV12_BUFFER_CONFIG *src_ybc,
147 * INPUTS : 131 YV12_BUFFER_CONFIG *dst_ybc) {
148 *
149 * OUTPUTS : None.
150 *
151 * RETURNS : void
152 *
153 * FUNCTION : Copies the source image into the destination image and
154 * updates the destination's UMV borders.
155 *
156 * SPECIAL NOTES : The frames are assumed to be identical in size.
157 *
158 ****************************************************************************/
159 void
160 vp8_yv12_copy_frame_c(YV12_BUFFER_CONFIG *src_ybc,
161 YV12_BUFFER_CONFIG *dst_ybc) {
162 int row; 132 int row;
163 unsigned char *source, *dest; 133 const uint8_t *src = src_ybc->y_buffer;
134 uint8_t *dst = dst_ybc->y_buffer;
164 135
165 #if 0 136 #if 0
166 /* These assertions are valid in the codec, but the libvpx-tester uses 137 /* These assertions are valid in the codec, but the libvpx-tester uses
167 * this code slightly differently. 138 * this code slightly differently.
168 */ 139 */
169 assert(src_ybc->y_width == dst_ybc->y_width); 140 assert(src_ybc->y_width == dst_ybc->y_width);
170 assert(src_ybc->y_height == dst_ybc->y_height); 141 assert(src_ybc->y_height == dst_ybc->y_height);
171 #endif 142 #endif
172 143
173 source = src_ybc->y_buffer; 144 for (row = 0; row < src_ybc->y_height; ++row) {
174 dest = dst_ybc->y_buffer; 145 vpx_memcpy(dst, src, src_ybc->y_width);
175 146 src += src_ybc->y_stride;
176 for (row = 0; row < src_ybc->y_height; row++) { 147 dst += dst_ybc->y_stride;
177 vpx_memcpy(dest, source, src_ybc->y_width);
178 source += src_ybc->y_stride;
179 dest += dst_ybc->y_stride;
180 } 148 }
181 149
182 source = src_ybc->u_buffer; 150 src = src_ybc->u_buffer;
183 dest = dst_ybc->u_buffer; 151 dst = dst_ybc->u_buffer;
184 152
185 for (row = 0; row < src_ybc->uv_height; row++) { 153 for (row = 0; row < src_ybc->uv_height; ++row) {
186 vpx_memcpy(dest, source, src_ybc->uv_width); 154 vpx_memcpy(dst, src, src_ybc->uv_width);
187 source += src_ybc->uv_stride; 155 src += src_ybc->uv_stride;
188 dest += dst_ybc->uv_stride; 156 dst += dst_ybc->uv_stride;
189 } 157 }
190 158
191 source = src_ybc->v_buffer; 159 src = src_ybc->v_buffer;
192 dest = dst_ybc->v_buffer; 160 dst = dst_ybc->v_buffer;
193 161
194 for (row = 0; row < src_ybc->uv_height; row++) { 162 for (row = 0; row < src_ybc->uv_height; ++row) {
195 vpx_memcpy(dest, source, src_ybc->uv_width); 163 vpx_memcpy(dst, src, src_ybc->uv_width);
196 source += src_ybc->uv_stride; 164 src += src_ybc->uv_stride;
197 dest += dst_ybc->uv_stride; 165 dst += dst_ybc->uv_stride;
198 } 166 }
199 167
200 vp8_yv12_extend_frame_borders_c(dst_ybc); 168 vp8_yv12_extend_frame_borders_c(dst_ybc);
201 } 169 }
202 170
203 void vp8_yv12_copy_y_c(YV12_BUFFER_CONFIG *src_ybc, 171 void vpx_yv12_copy_y_c(const YV12_BUFFER_CONFIG *src_ybc,
204 YV12_BUFFER_CONFIG *dst_ybc) { 172 YV12_BUFFER_CONFIG *dst_ybc) {
205 int row; 173 int row;
206 unsigned char *source, *dest; 174 const uint8_t *src = src_ybc->y_buffer;
175 uint8_t *dst = dst_ybc->y_buffer;
207 176
208 177 for (row = 0; row < src_ybc->y_height; ++row) {
209 source = src_ybc->y_buffer; 178 vpx_memcpy(dst, src, src_ybc->y_width);
210 dest = dst_ybc->y_buffer; 179 src += src_ybc->y_stride;
211 180 dst += dst_ybc->y_stride;
212 for (row = 0; row < src_ybc->y_height; row++) {
213 vpx_memcpy(dest, source, src_ybc->y_width);
214 source += src_ybc->y_stride;
215 dest += dst_ybc->y_stride;
216 } 181 }
217 } 182 }
OLDNEW
« no previous file with comments | « source/libvpx/vpx_scale/generic/yv12config.c ('k') | source/libvpx/vpx_scale/vpx_scale_rtcd.sh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698