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

Side by Side Diff: source/libvpx/third_party/libyuv/source/scale_argb.cc

Issue 1302353004: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 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
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. 2 * Copyright 2011 The LibYuv 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
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 assert(dx == 65536 * 2); // Test scale factor of 2. 46 assert(dx == 65536 * 2); // Test scale factor of 2.
47 assert((dy & 0x1ffff) == 0); // Test vertical scale is multiple of 2. 47 assert((dy & 0x1ffff) == 0); // Test vertical scale is multiple of 2.
48 // Advance to odd row, even column. 48 // Advance to odd row, even column.
49 if (filtering == kFilterBilinear) { 49 if (filtering == kFilterBilinear) {
50 src_argb += (y >> 16) * src_stride + (x >> 16) * 4; 50 src_argb += (y >> 16) * src_stride + (x >> 16) * 4;
51 } else { 51 } else {
52 src_argb += (y >> 16) * src_stride + ((x >> 16) - 1) * 4; 52 src_argb += (y >> 16) * src_stride + ((x >> 16) - 1) * 4;
53 } 53 }
54 54
55 #if defined(HAS_SCALEARGBROWDOWN2_SSE2) 55 #if defined(HAS_SCALEARGBROWDOWN2_SSE2)
56 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 4)) { 56 if (TestCpuFlag(kCpuHasSSE2)) {
57 ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_SSE2 : 57 ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_Any_SSE2 :
58 (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_SSE2 : 58 (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_Any_SSE2 :
59 ScaleARGBRowDown2Box_SSE2); 59 ScaleARGBRowDown2Box_Any_SSE2);
60 if (IS_ALIGNED(dst_width, 4)) {
61 ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_SSE2 :
62 (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_SSE2 :
63 ScaleARGBRowDown2Box_SSE2);
64 }
60 } 65 }
61 #endif 66 #endif
62 #if defined(HAS_SCALEARGBROWDOWN2_NEON) 67 #if defined(HAS_SCALEARGBROWDOWN2_NEON)
63 if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(dst_width, 8)) { 68 if (TestCpuFlag(kCpuHasNEON)) {
64 ScaleARGBRowDown2 = filtering ? ScaleARGBRowDown2Box_NEON : 69 ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_Any_NEON :
65 ScaleARGBRowDown2_NEON; 70 (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_Any_NEON :
71 ScaleARGBRowDown2Box_Any_NEON);
72 if (IS_ALIGNED(dst_width, 8)) {
73 ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_NEON :
74 (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_NEON :
75 ScaleARGBRowDown2Box_NEON);
76 }
66 } 77 }
67 #endif 78 #endif
68 79
69 if (filtering == kFilterLinear) { 80 if (filtering == kFilterLinear) {
70 src_stride = 0; 81 src_stride = 0;
71 } 82 }
72 for (j = 0; j < dst_height; ++j) { 83 for (j = 0; j < dst_height; ++j) {
73 ScaleARGBRowDown2(src_argb, src_stride, dst_argb, dst_width); 84 ScaleARGBRowDown2(src_argb, src_stride, dst_argb, dst_width);
74 src_argb += row_stride; 85 src_argb += row_stride;
75 dst_argb += dst_stride; 86 dst_argb += dst_stride;
76 } 87 }
77 } 88 }
78 89
79 // ScaleARGB ARGB, 1/4 90 // ScaleARGB ARGB, 1/4
80 // This is an optimized version for scaling down a ARGB to 1/4 of 91 // This is an optimized version for scaling down a ARGB to 1/4 of
81 // its original size. 92 // its original size.
82 static void ScaleARGBDown4Box(int src_width, int src_height, 93 static void ScaleARGBDown4Box(int src_width, int src_height,
83 int dst_width, int dst_height, 94 int dst_width, int dst_height,
84 int src_stride, int dst_stride, 95 int src_stride, int dst_stride,
85 const uint8* src_argb, uint8* dst_argb, 96 const uint8* src_argb, uint8* dst_argb,
86 int x, int dx, int y, int dy) { 97 int x, int dx, int y, int dy) {
87 int j; 98 int j;
88 // Allocate 2 rows of ARGB. 99 // Allocate 2 rows of ARGB.
89 const int kRowSize = (dst_width * 2 * 4 + 15) & ~15; 100 const int kRowSize = (dst_width * 2 * 4 + 31) & ~31;
90 align_buffer_64(row, kRowSize * 2); 101 align_buffer_64(row, kRowSize * 2);
91 int row_stride = src_stride * (dy >> 16); 102 int row_stride = src_stride * (dy >> 16);
92 void (*ScaleARGBRowDown2)(const uint8* src_argb, ptrdiff_t src_stride, 103 void (*ScaleARGBRowDown2)(const uint8* src_argb, ptrdiff_t src_stride,
93 uint8* dst_argb, int dst_width) = ScaleARGBRowDown2Box_C; 104 uint8* dst_argb, int dst_width) = ScaleARGBRowDown2Box_C;
94 // Advance to odd row, even column. 105 // Advance to odd row, even column.
95 src_argb += (y >> 16) * src_stride + (x >> 16) * 4; 106 src_argb += (y >> 16) * src_stride + (x >> 16) * 4;
96 assert(dx == 65536 * 4); // Test scale factor of 4. 107 assert(dx == 65536 * 4); // Test scale factor of 4.
97 assert((dy & 0x3ffff) == 0); // Test vertical scale is multiple of 4. 108 assert((dy & 0x3ffff) == 0); // Test vertical scale is multiple of 4.
98 #if defined(HAS_SCALEARGBROWDOWN2_SSE2) 109 #if defined(HAS_SCALEARGBROWDOWN2_SSE2)
99 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 4)) { 110 if (TestCpuFlag(kCpuHasSSE2)) {
100 ScaleARGBRowDown2 = ScaleARGBRowDown2Box_SSE2; 111 ScaleARGBRowDown2 = ScaleARGBRowDown2Box_Any_SSE2;
112 if (IS_ALIGNED(dst_width, 4)) {
113 ScaleARGBRowDown2 = ScaleARGBRowDown2Box_SSE2;
114 }
101 } 115 }
102 #endif 116 #endif
103 #if defined(HAS_SCALEARGBROWDOWN2_NEON) 117 #if defined(HAS_SCALEARGBROWDOWN2_NEON)
104 if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(dst_width, 8)) { 118 if (TestCpuFlag(kCpuHasNEON)) {
105 ScaleARGBRowDown2 = ScaleARGBRowDown2Box_NEON; 119 ScaleARGBRowDown2 = ScaleARGBRowDown2Box_Any_NEON;
120 if (IS_ALIGNED(dst_width, 8)) {
121 ScaleARGBRowDown2 = ScaleARGBRowDown2Box_NEON;
122 }
106 } 123 }
107 #endif 124 #endif
125
108 for (j = 0; j < dst_height; ++j) { 126 for (j = 0; j < dst_height; ++j) {
109 ScaleARGBRowDown2(src_argb, src_stride, row, dst_width * 2); 127 ScaleARGBRowDown2(src_argb, src_stride, row, dst_width * 2);
110 ScaleARGBRowDown2(src_argb + src_stride * 2, src_stride, 128 ScaleARGBRowDown2(src_argb + src_stride * 2, src_stride,
111 row + kRowSize, dst_width * 2); 129 row + kRowSize, dst_width * 2);
112 ScaleARGBRowDown2(row, kRowSize, dst_argb, dst_width); 130 ScaleARGBRowDown2(row, kRowSize, dst_argb, dst_width);
113 src_argb += row_stride; 131 src_argb += row_stride;
114 dst_argb += dst_stride; 132 dst_argb += dst_stride;
115 } 133 }
116 free_aligned_buffer_64(row); 134 free_aligned_buffer_64(row);
117 } 135 }
(...skipping 10 matching lines...) Expand all
128 int j; 146 int j;
129 int col_step = dx >> 16; 147 int col_step = dx >> 16;
130 int row_stride = (dy >> 16) * src_stride; 148 int row_stride = (dy >> 16) * src_stride;
131 void (*ScaleARGBRowDownEven)(const uint8* src_argb, ptrdiff_t src_stride, 149 void (*ScaleARGBRowDownEven)(const uint8* src_argb, ptrdiff_t src_stride,
132 int src_step, uint8* dst_argb, int dst_width) = 150 int src_step, uint8* dst_argb, int dst_width) =
133 filtering ? ScaleARGBRowDownEvenBox_C : ScaleARGBRowDownEven_C; 151 filtering ? ScaleARGBRowDownEvenBox_C : ScaleARGBRowDownEven_C;
134 assert(IS_ALIGNED(src_width, 2)); 152 assert(IS_ALIGNED(src_width, 2));
135 assert(IS_ALIGNED(src_height, 2)); 153 assert(IS_ALIGNED(src_height, 2));
136 src_argb += (y >> 16) * src_stride + (x >> 16) * 4; 154 src_argb += (y >> 16) * src_stride + (x >> 16) * 4;
137 #if defined(HAS_SCALEARGBROWDOWNEVEN_SSE2) 155 #if defined(HAS_SCALEARGBROWDOWNEVEN_SSE2)
138 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 4)) { 156 if (TestCpuFlag(kCpuHasSSE2)) {
139 ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_SSE2 : 157 ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_Any_SSE2 :
140 ScaleARGBRowDownEven_SSE2; 158 ScaleARGBRowDownEven_Any_SSE2;
159 if (IS_ALIGNED(dst_width, 4)) {
160 ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_SSE2 :
161 ScaleARGBRowDownEven_SSE2;
162 }
141 } 163 }
142 #endif 164 #endif
143 #if defined(HAS_SCALEARGBROWDOWNEVEN_NEON) 165 #if defined(HAS_SCALEARGBROWDOWNEVEN_NEON)
144 if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(dst_width, 4)) { 166 if (TestCpuFlag(kCpuHasNEON)) {
145 ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_NEON : 167 ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_Any_NEON :
146 ScaleARGBRowDownEven_NEON; 168 ScaleARGBRowDownEven_Any_NEON;
169 if (IS_ALIGNED(dst_width, 4)) {
170 ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_NEON :
171 ScaleARGBRowDownEven_NEON;
172 }
147 } 173 }
148 #endif 174 #endif
149 175
150 if (filtering == kFilterLinear) { 176 if (filtering == kFilterLinear) {
151 src_stride = 0; 177 src_stride = 0;
152 } 178 }
153 for (j = 0; j < dst_height; ++j) { 179 for (j = 0; j < dst_height; ++j) {
154 ScaleARGBRowDownEven(src_argb, src_stride, col_step, dst_argb, dst_width); 180 ScaleARGBRowDownEven(src_argb, src_stride, col_step, dst_argb, dst_width);
155 src_argb += row_stride; 181 src_argb += row_stride;
156 dst_argb += dst_stride; 182 dst_argb += dst_stride;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 if (IS_ALIGNED(clip_src_width, 4)) { 249 if (IS_ALIGNED(clip_src_width, 4)) {
224 InterpolateRow = InterpolateRow_MIPS_DSPR2; 250 InterpolateRow = InterpolateRow_MIPS_DSPR2;
225 } 251 }
226 } 252 }
227 #endif 253 #endif
228 #if defined(HAS_SCALEARGBFILTERCOLS_SSSE3) 254 #if defined(HAS_SCALEARGBFILTERCOLS_SSSE3)
229 if (TestCpuFlag(kCpuHasSSSE3) && src_width < 32768) { 255 if (TestCpuFlag(kCpuHasSSSE3) && src_width < 32768) {
230 ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3; 256 ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3;
231 } 257 }
232 #endif 258 #endif
259 #if defined(HAS_SCALEARGBFILTERCOLS_NEON)
260 if (TestCpuFlag(kCpuHasNEON)) {
261 ScaleARGBFilterCols = ScaleARGBFilterCols_Any_NEON;
262 if (IS_ALIGNED(dst_width, 4)) {
263 ScaleARGBFilterCols = ScaleARGBFilterCols_NEON;
264 }
265 }
266 #endif
233 // TODO(fbarchard): Consider not allocating row buffer for kFilterLinear. 267 // TODO(fbarchard): Consider not allocating row buffer for kFilterLinear.
234 // Allocate a row of ARGB. 268 // Allocate a row of ARGB.
235 { 269 {
236 align_buffer_64(row, clip_src_width * 4); 270 align_buffer_64(row, clip_src_width * 4);
237 271
238 const int max_y = (src_height - 1) << 16; 272 const int max_y = (src_height - 1) << 16;
239 if (y > max_y) { 273 if (y > max_y) {
240 y = max_y; 274 y = max_y;
241 } 275 }
242 for (j = 0; j < dst_height; ++j) { 276 for (j = 0; j < dst_height; ++j) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 #endif 348 #endif
315 if (src_width >= 32768) { 349 if (src_width >= 32768) {
316 ScaleARGBFilterCols = filtering ? 350 ScaleARGBFilterCols = filtering ?
317 ScaleARGBFilterCols64_C : ScaleARGBCols64_C; 351 ScaleARGBFilterCols64_C : ScaleARGBCols64_C;
318 } 352 }
319 #if defined(HAS_SCALEARGBFILTERCOLS_SSSE3) 353 #if defined(HAS_SCALEARGBFILTERCOLS_SSSE3)
320 if (filtering && TestCpuFlag(kCpuHasSSSE3) && src_width < 32768) { 354 if (filtering && TestCpuFlag(kCpuHasSSSE3) && src_width < 32768) {
321 ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3; 355 ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3;
322 } 356 }
323 #endif 357 #endif
358 #if defined(HAS_SCALEARGBFILTERCOLS_NEON)
359 if (filtering && TestCpuFlag(kCpuHasNEON)) {
360 ScaleARGBFilterCols = ScaleARGBFilterCols_Any_NEON;
361 if (IS_ALIGNED(dst_width, 4)) {
362 ScaleARGBFilterCols = ScaleARGBFilterCols_NEON;
363 }
364 }
365 #endif
324 #if defined(HAS_SCALEARGBCOLS_SSE2) 366 #if defined(HAS_SCALEARGBCOLS_SSE2)
325 if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) { 367 if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
326 ScaleARGBFilterCols = ScaleARGBCols_SSE2; 368 ScaleARGBFilterCols = ScaleARGBCols_SSE2;
327 } 369 }
328 #endif 370 #endif
371 #if defined(HAS_SCALEARGBCOLS_NEON)
372 if (!filtering && TestCpuFlag(kCpuHasNEON)) {
373 ScaleARGBFilterCols = ScaleARGBCols_Any_NEON;
374 if (IS_ALIGNED(dst_width, 8)) {
375 ScaleARGBFilterCols = ScaleARGBCols_NEON;
376 }
377 }
378 #endif
329 if (!filtering && src_width * 2 == dst_width && x < 0x8000) { 379 if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
330 ScaleARGBFilterCols = ScaleARGBColsUp2_C; 380 ScaleARGBFilterCols = ScaleARGBColsUp2_C;
331 #if defined(HAS_SCALEARGBCOLSUP2_SSE2) 381 #if defined(HAS_SCALEARGBCOLSUP2_SSE2)
332 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 8)) { 382 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 8)) {
333 ScaleARGBFilterCols = ScaleARGBColsUp2_SSE2; 383 ScaleARGBFilterCols = ScaleARGBColsUp2_SSE2;
334 } 384 }
335 #endif 385 #endif
336 } 386 }
337 387
338 if (y > max_y) { 388 if (y > max_y) {
339 y = max_y; 389 y = max_y;
340 } 390 }
341 391
342 { 392 {
343 int yi = y >> 16; 393 int yi = y >> 16;
344 const uint8* src = src_argb + yi * src_stride; 394 const uint8* src = src_argb + yi * src_stride;
345 395
346 // Allocate 2 rows of ARGB. 396 // Allocate 2 rows of ARGB.
347 const int kRowSize = (dst_width * 4 + 15) & ~15; 397 const int kRowSize = (dst_width * 4 + 31) & ~31;
348 align_buffer_64(row, kRowSize * 2); 398 align_buffer_64(row, kRowSize * 2);
349 399
350 uint8* rowptr = row; 400 uint8* rowptr = row;
351 int rowstride = kRowSize; 401 int rowstride = kRowSize;
352 int lasty = yi; 402 int lasty = yi;
353 403
354 ScaleARGBFilterCols(rowptr, src, dst_width, x, dx); 404 ScaleARGBFilterCols(rowptr, src, dst_width, x, dx);
355 if (src_height > 1) { 405 if (src_height > 1) {
356 src += src_stride; 406 src += src_stride;
357 } 407 }
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 filtering ? ScaleARGBFilterCols_C : ScaleARGBCols_C; 538 filtering ? ScaleARGBFilterCols_C : ScaleARGBCols_C;
489 if (src_width >= 32768) { 539 if (src_width >= 32768) {
490 ScaleARGBFilterCols = filtering ? 540 ScaleARGBFilterCols = filtering ?
491 ScaleARGBFilterCols64_C : ScaleARGBCols64_C; 541 ScaleARGBFilterCols64_C : ScaleARGBCols64_C;
492 } 542 }
493 #if defined(HAS_SCALEARGBFILTERCOLS_SSSE3) 543 #if defined(HAS_SCALEARGBFILTERCOLS_SSSE3)
494 if (filtering && TestCpuFlag(kCpuHasSSSE3) && src_width < 32768) { 544 if (filtering && TestCpuFlag(kCpuHasSSSE3) && src_width < 32768) {
495 ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3; 545 ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3;
496 } 546 }
497 #endif 547 #endif
548 #if defined(HAS_SCALEARGBFILTERCOLS_NEON)
549 if (filtering && TestCpuFlag(kCpuHasNEON)) {
550 ScaleARGBFilterCols = ScaleARGBFilterCols_Any_NEON;
551 if (IS_ALIGNED(dst_width, 4)) {
552 ScaleARGBFilterCols = ScaleARGBFilterCols_NEON;
553 }
554 }
555 #endif
498 #if defined(HAS_SCALEARGBCOLS_SSE2) 556 #if defined(HAS_SCALEARGBCOLS_SSE2)
499 if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) { 557 if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
500 ScaleARGBFilterCols = ScaleARGBCols_SSE2; 558 ScaleARGBFilterCols = ScaleARGBCols_SSE2;
501 } 559 }
502 #endif 560 #endif
561 #if defined(HAS_SCALEARGBCOLS_NEON)
562 if (!filtering && TestCpuFlag(kCpuHasNEON)) {
563 ScaleARGBFilterCols = ScaleARGBCols_Any_NEON;
564 if (IS_ALIGNED(dst_width, 8)) {
565 ScaleARGBFilterCols = ScaleARGBCols_NEON;
566 }
567 }
568 #endif
503 if (!filtering && src_width * 2 == dst_width && x < 0x8000) { 569 if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
504 ScaleARGBFilterCols = ScaleARGBColsUp2_C; 570 ScaleARGBFilterCols = ScaleARGBColsUp2_C;
505 #if defined(HAS_SCALEARGBCOLSUP2_SSE2) 571 #if defined(HAS_SCALEARGBCOLSUP2_SSE2)
506 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 8)) { 572 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 8)) {
507 ScaleARGBFilterCols = ScaleARGBColsUp2_SSE2; 573 ScaleARGBFilterCols = ScaleARGBColsUp2_SSE2;
508 } 574 }
509 #endif 575 #endif
510 } 576 }
511 577
512 const int max_y = (src_height - 1) << 16; 578 const int max_y = (src_height - 1) << 16;
513 if (y > max_y) { 579 if (y > max_y) {
514 y = max_y; 580 y = max_y;
515 } 581 }
516 const int kYShift = 1; // Shift Y by 1 to convert Y plane to UV coordinate. 582 const int kYShift = 1; // Shift Y by 1 to convert Y plane to UV coordinate.
517 int yi = y >> 16; 583 int yi = y >> 16;
518 int uv_yi = yi >> kYShift; 584 int uv_yi = yi >> kYShift;
519 const uint8* src_row_y = src_y + yi * src_stride_y; 585 const uint8* src_row_y = src_y + yi * src_stride_y;
520 const uint8* src_row_u = src_u + uv_yi * src_stride_u; 586 const uint8* src_row_u = src_u + uv_yi * src_stride_u;
521 const uint8* src_row_v = src_v + uv_yi * src_stride_v; 587 const uint8* src_row_v = src_v + uv_yi * src_stride_v;
522 588
523 // Allocate 2 rows of ARGB. 589 // Allocate 2 rows of ARGB.
524 const int kRowSize = (dst_width * 4 + 15) & ~15; 590 const int kRowSize = (dst_width * 4 + 31) & ~31;
525 align_buffer_64(row, kRowSize * 2); 591 align_buffer_64(row, kRowSize * 2);
526 592
527 // Allocate 1 row of ARGB for source conversion. 593 // Allocate 1 row of ARGB for source conversion.
528 align_buffer_64(argb_row, src_width * 4); 594 align_buffer_64(argb_row, src_width * 4);
529 595
530 uint8* rowptr = row; 596 uint8* rowptr = row;
531 int rowstride = kRowSize; 597 int rowstride = kRowSize;
532 int lasty = yi; 598 int lasty = yi;
533 599
534 // TODO(fbarchard): Convert first 2 rows of YUV to ARGB. 600 // TODO(fbarchard): Convert first 2 rows of YUV to ARGB.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 int x, int dx, int y, int dy) { 666 int x, int dx, int y, int dy) {
601 int j; 667 int j;
602 void (*ScaleARGBCols)(uint8* dst_argb, const uint8* src_argb, 668 void (*ScaleARGBCols)(uint8* dst_argb, const uint8* src_argb,
603 int dst_width, int x, int dx) = 669 int dst_width, int x, int dx) =
604 (src_width >= 32768) ? ScaleARGBCols64_C : ScaleARGBCols_C; 670 (src_width >= 32768) ? ScaleARGBCols64_C : ScaleARGBCols_C;
605 #if defined(HAS_SCALEARGBCOLS_SSE2) 671 #if defined(HAS_SCALEARGBCOLS_SSE2)
606 if (TestCpuFlag(kCpuHasSSE2) && src_width < 32768) { 672 if (TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
607 ScaleARGBCols = ScaleARGBCols_SSE2; 673 ScaleARGBCols = ScaleARGBCols_SSE2;
608 } 674 }
609 #endif 675 #endif
676 #if defined(HAS_SCALEARGBCOLS_NEON)
677 if (TestCpuFlag(kCpuHasNEON)) {
678 ScaleARGBCols = ScaleARGBCols_Any_NEON;
679 if (IS_ALIGNED(dst_width, 8)) {
680 ScaleARGBCols = ScaleARGBCols_NEON;
681 }
682 }
683 #endif
610 if (src_width * 2 == dst_width && x < 0x8000) { 684 if (src_width * 2 == dst_width && x < 0x8000) {
611 ScaleARGBCols = ScaleARGBColsUp2_C; 685 ScaleARGBCols = ScaleARGBColsUp2_C;
612 #if defined(HAS_SCALEARGBCOLSUP2_SSE2) 686 #if defined(HAS_SCALEARGBCOLSUP2_SSE2)
613 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 8)) { 687 if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 8)) {
614 ScaleARGBCols = ScaleARGBColsUp2_SSE2; 688 ScaleARGBCols = ScaleARGBColsUp2_SSE2;
615 } 689 }
616 #endif 690 #endif
617 } 691 }
618 692
619 for (j = 0; j < dst_height; ++j) { 693 for (j = 0; j < dst_height; ++j) {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 LIBYUV_API 811 LIBYUV_API
738 int ARGBScaleClip(const uint8* src_argb, int src_stride_argb, 812 int ARGBScaleClip(const uint8* src_argb, int src_stride_argb,
739 int src_width, int src_height, 813 int src_width, int src_height,
740 uint8* dst_argb, int dst_stride_argb, 814 uint8* dst_argb, int dst_stride_argb,
741 int dst_width, int dst_height, 815 int dst_width, int dst_height,
742 int clip_x, int clip_y, int clip_width, int clip_height, 816 int clip_x, int clip_y, int clip_width, int clip_height,
743 enum FilterMode filtering) { 817 enum FilterMode filtering) {
744 if (!src_argb || src_width == 0 || src_height == 0 || 818 if (!src_argb || src_width == 0 || src_height == 0 ||
745 !dst_argb || dst_width <= 0 || dst_height <= 0 || 819 !dst_argb || dst_width <= 0 || dst_height <= 0 ||
746 clip_x < 0 || clip_y < 0 || 820 clip_x < 0 || clip_y < 0 ||
821 clip_width > 32768 || clip_height > 32768 ||
747 (clip_x + clip_width) > dst_width || 822 (clip_x + clip_width) > dst_width ||
748 (clip_y + clip_height) > dst_height) { 823 (clip_y + clip_height) > dst_height) {
749 return -1; 824 return -1;
750 } 825 }
751 ScaleARGB(src_argb, src_stride_argb, src_width, src_height, 826 ScaleARGB(src_argb, src_stride_argb, src_width, src_height,
752 dst_argb, dst_stride_argb, dst_width, dst_height, 827 dst_argb, dst_stride_argb, dst_width, dst_height,
753 clip_x, clip_y, clip_width, clip_height, filtering); 828 clip_x, clip_y, clip_width, clip_height, filtering);
754 return 0; 829 return 0;
755 } 830 }
756 831
757 // Scale an ARGB image. 832 // Scale an ARGB image.
758 LIBYUV_API 833 LIBYUV_API
759 int ARGBScale(const uint8* src_argb, int src_stride_argb, 834 int ARGBScale(const uint8* src_argb, int src_stride_argb,
760 int src_width, int src_height, 835 int src_width, int src_height,
761 uint8* dst_argb, int dst_stride_argb, 836 uint8* dst_argb, int dst_stride_argb,
762 int dst_width, int dst_height, 837 int dst_width, int dst_height,
763 enum FilterMode filtering) { 838 enum FilterMode filtering) {
764 if (!src_argb || src_width == 0 || src_height == 0 || 839 if (!src_argb || src_width == 0 || src_height == 0 ||
840 src_width > 32768 || src_height > 32768 ||
765 !dst_argb || dst_width <= 0 || dst_height <= 0) { 841 !dst_argb || dst_width <= 0 || dst_height <= 0) {
766 return -1; 842 return -1;
767 } 843 }
768 ScaleARGB(src_argb, src_stride_argb, src_width, src_height, 844 ScaleARGB(src_argb, src_stride_argb, src_width, src_height,
769 dst_argb, dst_stride_argb, dst_width, dst_height, 845 dst_argb, dst_stride_argb, dst_width, dst_height,
770 0, 0, dst_width, dst_height, filtering); 846 0, 0, dst_width, dst_height, filtering);
771 return 0; 847 return 0;
772 } 848 }
773 849
774 #ifdef __cplusplus 850 #ifdef __cplusplus
775 } // extern "C" 851 } // extern "C"
776 } // namespace libyuv 852 } // namespace libyuv
777 #endif 853 #endif
OLDNEW
« no previous file with comments | « source/libvpx/third_party/libyuv/source/scale_any.cc ('k') | source/libvpx/third_party/libyuv/source/scale_common.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698