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

Side by Side Diff: source/libvpx/third_party/libyuv/source/convert_from_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 2012 The LibYuv Project Authors. All rights reserved. 2 * Copyright 2012 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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 } 65 }
66 } 66 }
67 #endif 67 #endif
68 #if defined(HAS_ARGBTOYROW_SSSE3) 68 #if defined(HAS_ARGBTOYROW_SSSE3)
69 if (TestCpuFlag(kCpuHasSSSE3)) { 69 if (TestCpuFlag(kCpuHasSSSE3)) {
70 ARGBToYRow = ARGBToYRow_Any_SSSE3; 70 ARGBToYRow = ARGBToYRow_Any_SSSE3;
71 if (IS_ALIGNED(width, 16)) { 71 if (IS_ALIGNED(width, 16)) {
72 ARGBToYRow = ARGBToYRow_SSSE3; 72 ARGBToYRow = ARGBToYRow_SSSE3;
73 } 73 }
74 } 74 }
75 75 #endif
76 #if defined(HAS_ARGBTOYROW_AVX2)
77 if (TestCpuFlag(kCpuHasAVX2)) {
78 ARGBToYRow = ARGBToYRow_Any_AVX2;
79 if (IS_ALIGNED(width, 32)) {
80 ARGBToYRow = ARGBToYRow_AVX2;
81 }
82 }
76 #endif 83 #endif
77 #if defined(HAS_ARGBTOYROW_NEON) 84 #if defined(HAS_ARGBTOYROW_NEON)
78 if (TestCpuFlag(kCpuHasNEON)) { 85 if (TestCpuFlag(kCpuHasNEON)) {
79 ARGBToYRow = ARGBToYRow_Any_NEON; 86 ARGBToYRow = ARGBToYRow_Any_NEON;
80 if (IS_ALIGNED(width, 8)) { 87 if (IS_ALIGNED(width, 8)) {
81 ARGBToYRow = ARGBToYRow_NEON; 88 ARGBToYRow = ARGBToYRow_NEON;
82 } 89 }
83 } 90 }
84 #endif 91 #endif
85 92
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 } 139 }
133 #endif 140 #endif
134 #if defined(HAS_ARGBTOUV422ROW_NEON) 141 #if defined(HAS_ARGBTOUV422ROW_NEON)
135 if (TestCpuFlag(kCpuHasNEON)) { 142 if (TestCpuFlag(kCpuHasNEON)) {
136 ARGBToUV422Row = ARGBToUV422Row_Any_NEON; 143 ARGBToUV422Row = ARGBToUV422Row_Any_NEON;
137 if (IS_ALIGNED(width, 16)) { 144 if (IS_ALIGNED(width, 16)) {
138 ARGBToUV422Row = ARGBToUV422Row_NEON; 145 ARGBToUV422Row = ARGBToUV422Row_NEON;
139 } 146 }
140 } 147 }
141 #endif 148 #endif
142
143 #if defined(HAS_ARGBTOYROW_SSSE3) 149 #if defined(HAS_ARGBTOYROW_SSSE3)
144 if (TestCpuFlag(kCpuHasSSSE3)) { 150 if (TestCpuFlag(kCpuHasSSSE3)) {
145 ARGBToYRow = ARGBToYRow_Any_SSSE3; 151 ARGBToYRow = ARGBToYRow_Any_SSSE3;
146 if (IS_ALIGNED(width, 16)) { 152 if (IS_ALIGNED(width, 16)) {
147 ARGBToYRow = ARGBToYRow_SSSE3; 153 ARGBToYRow = ARGBToYRow_SSSE3;
148 } 154 }
149 } 155 }
150 #endif 156 #endif
157 #if defined(HAS_ARGBTOYROW_AVX2)
158 if (TestCpuFlag(kCpuHasAVX2)) {
159 ARGBToYRow = ARGBToYRow_Any_AVX2;
160 if (IS_ALIGNED(width, 32)) {
161 ARGBToYRow = ARGBToYRow_AVX2;
162 }
163 }
164 #endif
151 #if defined(HAS_ARGBTOYROW_NEON) 165 #if defined(HAS_ARGBTOYROW_NEON)
152 if (TestCpuFlag(kCpuHasNEON)) { 166 if (TestCpuFlag(kCpuHasNEON)) {
153 ARGBToYRow = ARGBToYRow_Any_NEON; 167 ARGBToYRow = ARGBToYRow_Any_NEON;
154 if (IS_ALIGNED(width, 8)) { 168 if (IS_ALIGNED(width, 8)) {
155 ARGBToYRow = ARGBToYRow_NEON; 169 ARGBToYRow = ARGBToYRow_NEON;
156 } 170 }
157 } 171 }
158 #endif 172 #endif
159 173
160 for (y = 0; y < height; ++y) { 174 for (y = 0; y < height; ++y) {
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) 282 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3)
269 if (TestCpuFlag(kCpuHasSSSE3)) { 283 if (TestCpuFlag(kCpuHasSSSE3)) {
270 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; 284 ARGBToUVRow = ARGBToUVRow_Any_SSSE3;
271 ARGBToYRow = ARGBToYRow_Any_SSSE3; 285 ARGBToYRow = ARGBToYRow_Any_SSSE3;
272 if (IS_ALIGNED(width, 16)) { 286 if (IS_ALIGNED(width, 16)) {
273 ARGBToUVRow = ARGBToUVRow_SSSE3; 287 ARGBToUVRow = ARGBToUVRow_SSSE3;
274 ARGBToYRow = ARGBToYRow_SSSE3; 288 ARGBToYRow = ARGBToYRow_SSSE3;
275 } 289 }
276 } 290 }
277 #endif 291 #endif
292 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2)
293 if (TestCpuFlag(kCpuHasAVX2)) {
294 ARGBToUVRow = ARGBToUVRow_Any_AVX2;
295 ARGBToYRow = ARGBToYRow_Any_AVX2;
296 if (IS_ALIGNED(width, 32)) {
297 ARGBToUVRow = ARGBToUVRow_AVX2;
298 ARGBToYRow = ARGBToYRow_AVX2;
299 }
300 }
301 #endif
278 #if defined(HAS_ARGBTOYROW_NEON) 302 #if defined(HAS_ARGBTOYROW_NEON)
279 if (TestCpuFlag(kCpuHasNEON)) { 303 if (TestCpuFlag(kCpuHasNEON)) {
280 ARGBToYRow = ARGBToYRow_Any_NEON; 304 ARGBToYRow = ARGBToYRow_Any_NEON;
281 if (IS_ALIGNED(width, 8)) { 305 if (IS_ALIGNED(width, 8)) {
282 ARGBToYRow = ARGBToYRow_NEON; 306 ARGBToYRow = ARGBToYRow_NEON;
283 } 307 }
284 } 308 }
285 #endif 309 #endif
286 #if defined(HAS_ARGBTOUVROW_NEON) 310 #if defined(HAS_ARGBTOUVROW_NEON)
287 if (TestCpuFlag(kCpuHasNEON)) { 311 if (TestCpuFlag(kCpuHasNEON)) {
(...skipping 22 matching lines...) Expand all
310 #if defined(HAS_MERGEUVROW_NEON) 334 #if defined(HAS_MERGEUVROW_NEON)
311 if (TestCpuFlag(kCpuHasNEON)) { 335 if (TestCpuFlag(kCpuHasNEON)) {
312 MergeUVRow_ = MergeUVRow_Any_NEON; 336 MergeUVRow_ = MergeUVRow_Any_NEON;
313 if (IS_ALIGNED(halfwidth, 16)) { 337 if (IS_ALIGNED(halfwidth, 16)) {
314 MergeUVRow_ = MergeUVRow_NEON; 338 MergeUVRow_ = MergeUVRow_NEON;
315 } 339 }
316 } 340 }
317 #endif 341 #endif
318 { 342 {
319 // Allocate a rows of uv. 343 // Allocate a rows of uv.
320 align_buffer_64(row_u, ((halfwidth + 15) & ~15) * 2); 344 align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2);
321 uint8* row_v = row_u + ((halfwidth + 15) & ~15); 345 uint8* row_v = row_u + ((halfwidth + 31) & ~31);
322 346
323 for (y = 0; y < height - 1; y += 2) { 347 for (y = 0; y < height - 1; y += 2) {
324 ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width); 348 ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width);
325 MergeUVRow_(row_u, row_v, dst_uv, halfwidth); 349 MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
326 ARGBToYRow(src_argb, dst_y, width); 350 ARGBToYRow(src_argb, dst_y, width);
327 ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width); 351 ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width);
328 src_argb += src_stride_argb * 2; 352 src_argb += src_stride_argb * 2;
329 dst_y += dst_stride_y * 2; 353 dst_y += dst_stride_y * 2;
330 dst_uv += dst_stride_uv; 354 dst_uv += dst_stride_uv;
331 } 355 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) 391 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3)
368 if (TestCpuFlag(kCpuHasSSSE3)) { 392 if (TestCpuFlag(kCpuHasSSSE3)) {
369 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; 393 ARGBToUVRow = ARGBToUVRow_Any_SSSE3;
370 ARGBToYRow = ARGBToYRow_Any_SSSE3; 394 ARGBToYRow = ARGBToYRow_Any_SSSE3;
371 if (IS_ALIGNED(width, 16)) { 395 if (IS_ALIGNED(width, 16)) {
372 ARGBToUVRow = ARGBToUVRow_SSSE3; 396 ARGBToUVRow = ARGBToUVRow_SSSE3;
373 ARGBToYRow = ARGBToYRow_SSSE3; 397 ARGBToYRow = ARGBToYRow_SSSE3;
374 } 398 }
375 } 399 }
376 #endif 400 #endif
401 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2)
402 if (TestCpuFlag(kCpuHasAVX2)) {
403 ARGBToUVRow = ARGBToUVRow_Any_AVX2;
404 ARGBToYRow = ARGBToYRow_Any_AVX2;
405 if (IS_ALIGNED(width, 32)) {
406 ARGBToUVRow = ARGBToUVRow_AVX2;
407 ARGBToYRow = ARGBToYRow_AVX2;
408 }
409 }
410 #endif
377 #if defined(HAS_ARGBTOYROW_NEON) 411 #if defined(HAS_ARGBTOYROW_NEON)
378 if (TestCpuFlag(kCpuHasNEON)) { 412 if (TestCpuFlag(kCpuHasNEON)) {
379 ARGBToYRow = ARGBToYRow_Any_NEON; 413 ARGBToYRow = ARGBToYRow_Any_NEON;
380 if (IS_ALIGNED(width, 8)) { 414 if (IS_ALIGNED(width, 8)) {
381 ARGBToYRow = ARGBToYRow_NEON; 415 ARGBToYRow = ARGBToYRow_NEON;
382 } 416 }
383 } 417 }
384 #endif 418 #endif
385 #if defined(HAS_ARGBTOUVROW_NEON) 419 #if defined(HAS_ARGBTOUVROW_NEON)
386 if (TestCpuFlag(kCpuHasNEON)) { 420 if (TestCpuFlag(kCpuHasNEON)) {
(...skipping 22 matching lines...) Expand all
409 #if defined(HAS_MERGEUVROW_NEON) 443 #if defined(HAS_MERGEUVROW_NEON)
410 if (TestCpuFlag(kCpuHasNEON)) { 444 if (TestCpuFlag(kCpuHasNEON)) {
411 MergeUVRow_ = MergeUVRow_Any_NEON; 445 MergeUVRow_ = MergeUVRow_Any_NEON;
412 if (IS_ALIGNED(halfwidth, 16)) { 446 if (IS_ALIGNED(halfwidth, 16)) {
413 MergeUVRow_ = MergeUVRow_NEON; 447 MergeUVRow_ = MergeUVRow_NEON;
414 } 448 }
415 } 449 }
416 #endif 450 #endif
417 { 451 {
418 // Allocate a rows of uv. 452 // Allocate a rows of uv.
419 align_buffer_64(row_u, ((halfwidth + 15) & ~15) * 2); 453 align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2);
420 uint8* row_v = row_u + ((halfwidth + 15) & ~15); 454 uint8* row_v = row_u + ((halfwidth + 31) & ~31);
421 455
422 for (y = 0; y < height - 1; y += 2) { 456 for (y = 0; y < height - 1; y += 2) {
423 ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width); 457 ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width);
424 MergeUVRow_(row_v, row_u, dst_uv, halfwidth); 458 MergeUVRow_(row_v, row_u, dst_uv, halfwidth);
425 ARGBToYRow(src_argb, dst_y, width); 459 ARGBToYRow(src_argb, dst_y, width);
426 ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width); 460 ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width);
427 src_argb += src_stride_argb * 2; 461 src_argb += src_stride_argb * 2;
428 dst_y += dst_stride_y * 2; 462 dst_y += dst_stride_y * 2;
429 dst_uv += dst_stride_uv; 463 dst_uv += dst_stride_uv;
430 } 464 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 } 519 }
486 #endif 520 #endif
487 #if defined(HAS_ARGBTOYROW_SSSE3) 521 #if defined(HAS_ARGBTOYROW_SSSE3)
488 if (TestCpuFlag(kCpuHasSSSE3)) { 522 if (TestCpuFlag(kCpuHasSSSE3)) {
489 ARGBToYRow = ARGBToYRow_Any_SSSE3; 523 ARGBToYRow = ARGBToYRow_Any_SSSE3;
490 if (IS_ALIGNED(width, 16)) { 524 if (IS_ALIGNED(width, 16)) {
491 ARGBToYRow = ARGBToYRow_SSSE3; 525 ARGBToYRow = ARGBToYRow_SSSE3;
492 } 526 }
493 } 527 }
494 #endif 528 #endif
529 #if defined(HAS_ARGBTOYROW_AVX2)
530 if (TestCpuFlag(kCpuHasAVX2)) {
531 ARGBToYRow = ARGBToYRow_Any_AVX2;
532 if (IS_ALIGNED(width, 32)) {
533 ARGBToYRow = ARGBToYRow_AVX2;
534 }
535 }
536 #endif
495 #if defined(HAS_ARGBTOYROW_NEON) 537 #if defined(HAS_ARGBTOYROW_NEON)
496 if (TestCpuFlag(kCpuHasNEON)) { 538 if (TestCpuFlag(kCpuHasNEON)) {
497 ARGBToYRow = ARGBToYRow_Any_NEON; 539 ARGBToYRow = ARGBToYRow_Any_NEON;
498 if (IS_ALIGNED(width, 8)) { 540 if (IS_ALIGNED(width, 8)) {
499 ARGBToYRow = ARGBToYRow_NEON; 541 ARGBToYRow = ARGBToYRow_NEON;
500 } 542 }
501 } 543 }
502 #endif 544 #endif
503 545
504 #if defined(HAS_I422TOYUY2ROW_SSE2) 546 #if defined(HAS_I422TOYUY2ROW_SSE2)
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 } 626 }
585 #endif 627 #endif
586 #if defined(HAS_ARGBTOYROW_SSSE3) 628 #if defined(HAS_ARGBTOYROW_SSSE3)
587 if (TestCpuFlag(kCpuHasSSSE3)) { 629 if (TestCpuFlag(kCpuHasSSSE3)) {
588 ARGBToYRow = ARGBToYRow_Any_SSSE3; 630 ARGBToYRow = ARGBToYRow_Any_SSSE3;
589 if (IS_ALIGNED(width, 16)) { 631 if (IS_ALIGNED(width, 16)) {
590 ARGBToYRow = ARGBToYRow_SSSE3; 632 ARGBToYRow = ARGBToYRow_SSSE3;
591 } 633 }
592 } 634 }
593 #endif 635 #endif
636 #if defined(HAS_ARGBTOYROW_AVX2)
637 if (TestCpuFlag(kCpuHasAVX2)) {
638 ARGBToYRow = ARGBToYRow_Any_AVX2;
639 if (IS_ALIGNED(width, 32)) {
640 ARGBToYRow = ARGBToYRow_AVX2;
641 }
642 }
643 #endif
594 #if defined(HAS_ARGBTOYROW_NEON) 644 #if defined(HAS_ARGBTOYROW_NEON)
595 if (TestCpuFlag(kCpuHasNEON)) { 645 if (TestCpuFlag(kCpuHasNEON)) {
596 ARGBToYRow = ARGBToYRow_Any_NEON; 646 ARGBToYRow = ARGBToYRow_Any_NEON;
597 if (IS_ALIGNED(width, 8)) { 647 if (IS_ALIGNED(width, 8)) {
598 ARGBToYRow = ARGBToYRow_NEON; 648 ARGBToYRow = ARGBToYRow_NEON;
599 } 649 }
600 } 650 }
601 #endif 651 #endif
602 652
603 #if defined(HAS_I422TOUYVYROW_SSE2) 653 #if defined(HAS_I422TOUYVYROW_SSE2)
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 #endif 847 #endif
798 848
799 for (y = 0; y < height; ++y) { 849 for (y = 0; y < height; ++y) {
800 ARGBToRAWRow(src_argb, dst_raw, width); 850 ARGBToRAWRow(src_argb, dst_raw, width);
801 src_argb += src_stride_argb; 851 src_argb += src_stride_argb;
802 dst_raw += dst_stride_raw; 852 dst_raw += dst_stride_raw;
803 } 853 }
804 return 0; 854 return 0;
805 } 855 }
806 856
807 static const uint8 kDither8x8[64] = { 857 // Ordered 8x8 dither for 888 to 565. Values from 0 to 7.
808 0, 128, 32, 160, 8, 136, 40, 168, 858 static const uint8 kDither565_4x4[16] = {
809 192, 64, 224, 96, 200, 72, 232, 104, 859 0, 4, 1, 5,
810 48, 176, 16, 144, 56, 184, 24, 152, 860 6, 2, 7, 3,
811 240, 112, 208, 80, 248, 120, 216, 88, 861 1, 5, 0, 4,
812 12, 140, 44, 172, 4, 132, 36, 164, 862 7, 3, 6, 2,
813 204, 76, 236, 108, 196, 68, 228, 100,
814 60, 188, 28, 156, 52, 180, 20, 148,
815 252, 124, 220, 92, 244, 116, 212, 84,
816 }; 863 };
817 864
818 // Convert ARGB To RGB565 with 8x8 dither matrix (64 bytes). 865 // Convert ARGB To RGB565 with 4x4 dither matrix (16 bytes).
819 LIBYUV_API 866 LIBYUV_API
820 int ARGBToRGB565Dither(const uint8* src_argb, int src_stride_argb, 867 int ARGBToRGB565Dither(const uint8* src_argb, int src_stride_argb,
821 uint8* dst_rgb565, int dst_stride_rgb565, 868 uint8* dst_rgb565, int dst_stride_rgb565,
822 const uint8* dither8x8, int width, int height) { 869 const uint8* dither4x4, int width, int height) {
823 int y; 870 int y;
824 void (*ARGBToRGB565DitherRow)(const uint8* src_argb, uint8* dst_rgb, 871 void (*ARGBToRGB565DitherRow)(const uint8* src_argb, uint8* dst_rgb,
825 const uint8* dither8x8, int pix) = ARGBToRGB565DitherRow_C; 872 const uint32 dither4, int pix) = ARGBToRGB565DitherRow_C;
826 if (!src_argb || !dst_rgb565 || width <= 0 || height == 0) { 873 if (!src_argb || !dst_rgb565 || width <= 0 || height == 0) {
827 return -1; 874 return -1;
828 } 875 }
829 if (height < 0) { 876 if (height < 0) {
830 height = -height; 877 height = -height;
831 src_argb = src_argb + (height - 1) * src_stride_argb; 878 src_argb = src_argb + (height - 1) * src_stride_argb;
832 src_stride_argb = -src_stride_argb; 879 src_stride_argb = -src_stride_argb;
833 } 880 }
834 if (!dither8x8) { 881 if (!dither4x4) {
835 dither8x8 = kDither8x8; 882 dither4x4 = kDither565_4x4;
836
837 } 883 }
884 #if defined(HAS_ARGBTORGB565DITHERROW_SSE2)
885 if (TestCpuFlag(kCpuHasSSE2)) {
886 ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_SSE2;
887 if (IS_ALIGNED(width, 4)) {
888 ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_SSE2;
889 }
890 }
891 #endif
892 #if defined(HAS_ARGBTORGB565DITHERROW_AVX2)
893 if (TestCpuFlag(kCpuHasAVX2)) {
894 ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_AVX2;
895 if (IS_ALIGNED(width, 8)) {
896 ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_AVX2;
897 }
898 }
899 #endif
900 #if defined(HAS_ARGBTORGB565DITHERROW_NEON)
901 if (TestCpuFlag(kCpuHasNEON)) {
902 ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_NEON;
903 if (IS_ALIGNED(width, 8)) {
904 ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_NEON;
905 }
906 }
907 #endif
838 for (y = 0; y < height; ++y) { 908 for (y = 0; y < height; ++y) {
839 ARGBToRGB565DitherRow(src_argb, dst_rgb565, 909 ARGBToRGB565DitherRow(src_argb, dst_rgb565,
840 dither8x8 + ((y & 7) << 3), width); 910 *(uint32*)(dither4x4 + ((y & 3) << 2)), width);
841 src_argb += src_stride_argb; 911 src_argb += src_stride_argb;
842 dst_rgb565 += dst_stride_rgb565; 912 dst_rgb565 += dst_stride_rgb565;
843 } 913 }
844 return 0; 914 return 0;
845 } 915 }
846 916
847 // Convert ARGB To RGB565. 917 // Convert ARGB To RGB565.
918 // TODO(fbarchard): Consider using dither function low level with zeros.
848 LIBYUV_API 919 LIBYUV_API
849 int ARGBToRGB565(const uint8* src_argb, int src_stride_argb, 920 int ARGBToRGB565(const uint8* src_argb, int src_stride_argb,
850 uint8* dst_rgb565, int dst_stride_rgb565, 921 uint8* dst_rgb565, int dst_stride_rgb565,
851 int width, int height) { 922 int width, int height) {
852 int y; 923 int y;
853 void (*ARGBToRGB565Row)(const uint8* src_argb, uint8* dst_rgb, int pix) = 924 void (*ARGBToRGB565Row)(const uint8* src_argb, uint8* dst_rgb, int pix) =
854 ARGBToRGB565Row_C; 925 ARGBToRGB565Row_C;
855 if (!src_argb || !dst_rgb565 || width <= 0 || height == 0) { 926 if (!src_argb || !dst_rgb565 || width <= 0 || height == 0) {
856 return -1; 927 return -1;
857 } 928 }
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 1085
1015 // Convert ARGB to J420. (JPeg full range I420). 1086 // Convert ARGB to J420. (JPeg full range I420).
1016 LIBYUV_API 1087 LIBYUV_API
1017 int ARGBToJ420(const uint8* src_argb, int src_stride_argb, 1088 int ARGBToJ420(const uint8* src_argb, int src_stride_argb,
1018 uint8* dst_yj, int dst_stride_yj, 1089 uint8* dst_yj, int dst_stride_yj,
1019 uint8* dst_u, int dst_stride_u, 1090 uint8* dst_u, int dst_stride_u,
1020 uint8* dst_v, int dst_stride_v, 1091 uint8* dst_v, int dst_stride_v,
1021 int width, int height) { 1092 int width, int height) {
1022 int y; 1093 int y;
1023 void (*ARGBToUVJRow)(const uint8* src_argb0, int src_stride_argb, 1094 void (*ARGBToUVJRow)(const uint8* src_argb0, int src_stride_argb,
1024 uint8* dst_u, uint8* dst_v, int width) = ARGBToUVJRow_C; 1095 uint8* dst_u, uint8* dst_v, int width) = ARGBToUVJRow_C;
1025 void (*ARGBToYJRow)(const uint8* src_argb, uint8* dst_yj, int pix) = 1096 void (*ARGBToYJRow)(const uint8* src_argb, uint8* dst_yj, int pix) =
1026 ARGBToYJRow_C; 1097 ARGBToYJRow_C;
1027 if (!src_argb || 1098 if (!src_argb ||
1028 !dst_yj || !dst_u || !dst_v || 1099 !dst_yj || !dst_u || !dst_v ||
1029 width <= 0 || height == 0) { 1100 width <= 0 || height == 0) {
1030 return -1; 1101 return -1;
1031 } 1102 }
1032 // Negative height means invert the image. 1103 // Negative height means invert the image.
1033 if (height < 0) { 1104 if (height < 0) {
1034 height = -height; 1105 height = -height;
1035 src_argb = src_argb + (height - 1) * src_stride_argb; 1106 src_argb = src_argb + (height - 1) * src_stride_argb;
1036 src_stride_argb = -src_stride_argb; 1107 src_stride_argb = -src_stride_argb;
1037 } 1108 }
1038 #if defined(HAS_ARGBTOYJROW_SSSE3) && defined(HAS_ARGBTOUVJROW_SSSE3) 1109 #if defined(HAS_ARGBTOYJROW_SSSE3) && defined(HAS_ARGBTOUVJROW_SSSE3)
1039 if (TestCpuFlag(kCpuHasSSSE3)) { 1110 if (TestCpuFlag(kCpuHasSSSE3)) {
1040 ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3; 1111 ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3;
1041 ARGBToYJRow = ARGBToYJRow_Any_SSSE3; 1112 ARGBToYJRow = ARGBToYJRow_Any_SSSE3;
1042 if (IS_ALIGNED(width, 16)) { 1113 if (IS_ALIGNED(width, 16)) {
1043 ARGBToUVJRow = ARGBToUVJRow_SSSE3; 1114 ARGBToUVJRow = ARGBToUVJRow_SSSE3;
1044 ARGBToYJRow = ARGBToYJRow_SSSE3; 1115 ARGBToYJRow = ARGBToYJRow_SSSE3;
1045 } 1116 }
1046 } 1117 }
1047 #endif 1118 #endif
1048 #if defined(HAS_ARGBTOYJROW_AVX2) && defined(HAS_ARGBTOUVJROW_AVX2) 1119 #if defined(HAS_ARGBTOYJROW_AVX2)
1049 if (TestCpuFlag(kCpuHasAVX2)) { 1120 if (TestCpuFlag(kCpuHasAVX2)) {
1050 ARGBToYJRow = ARGBToYJRow_Any_AVX2; 1121 ARGBToYJRow = ARGBToYJRow_Any_AVX2;
1051 if (IS_ALIGNED(width, 32)) { 1122 if (IS_ALIGNED(width, 32)) {
1052 ARGBToYJRow = ARGBToYJRow_AVX2; 1123 ARGBToYJRow = ARGBToYJRow_AVX2;
1053 } 1124 }
1054 } 1125 }
1055 #endif 1126 #endif
1056 #if defined(HAS_ARGBTOYJROW_NEON) 1127 #if defined(HAS_ARGBTOYJROW_NEON)
1057 if (TestCpuFlag(kCpuHasNEON)) { 1128 if (TestCpuFlag(kCpuHasNEON)) {
1058 ARGBToYJRow = ARGBToYJRow_Any_NEON; 1129 ARGBToYJRow = ARGBToYJRow_Any_NEON;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 #endif 1204 #endif
1134 1205
1135 #if defined(HAS_ARGBTOYJROW_SSSE3) 1206 #if defined(HAS_ARGBTOYJROW_SSSE3)
1136 if (TestCpuFlag(kCpuHasSSSE3)) { 1207 if (TestCpuFlag(kCpuHasSSSE3)) {
1137 ARGBToYJRow = ARGBToYJRow_Any_SSSE3; 1208 ARGBToYJRow = ARGBToYJRow_Any_SSSE3;
1138 if (IS_ALIGNED(width, 16)) { 1209 if (IS_ALIGNED(width, 16)) {
1139 ARGBToYJRow = ARGBToYJRow_SSSE3; 1210 ARGBToYJRow = ARGBToYJRow_SSSE3;
1140 } 1211 }
1141 } 1212 }
1142 #endif 1213 #endif
1214 #if defined(HAS_ARGBTOYJROW_AVX2)
1215 if (TestCpuFlag(kCpuHasAVX2)) {
1216 ARGBToYJRow = ARGBToYJRow_Any_AVX2;
1217 if (IS_ALIGNED(width, 32)) {
1218 ARGBToYJRow = ARGBToYJRow_AVX2;
1219 }
1220 }
1221 #endif
1143 #if defined(HAS_ARGBTOYJROW_NEON) 1222 #if defined(HAS_ARGBTOYJROW_NEON)
1144 if (TestCpuFlag(kCpuHasNEON)) { 1223 if (TestCpuFlag(kCpuHasNEON)) {
1145 ARGBToYJRow = ARGBToYJRow_Any_NEON; 1224 ARGBToYJRow = ARGBToYJRow_Any_NEON;
1146 if (IS_ALIGNED(width, 8)) { 1225 if (IS_ALIGNED(width, 8)) {
1147 ARGBToYJRow = ARGBToYJRow_NEON; 1226 ARGBToYJRow = ARGBToYJRow_NEON;
1148 } 1227 }
1149 } 1228 }
1150 #endif 1229 #endif
1151 1230
1152 for (y = 0; y < height; ++y) { 1231 for (y = 0; y < height; ++y) {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1213 src_argb += src_stride_argb; 1292 src_argb += src_stride_argb;
1214 dst_yj += dst_stride_yj; 1293 dst_yj += dst_stride_yj;
1215 } 1294 }
1216 return 0; 1295 return 0;
1217 } 1296 }
1218 1297
1219 #ifdef __cplusplus 1298 #ifdef __cplusplus
1220 } // extern "C" 1299 } // extern "C"
1221 } // namespace libyuv 1300 } // namespace libyuv
1222 #endif 1301 #endif
OLDNEW
« no previous file with comments | « source/libvpx/third_party/libyuv/source/convert_from.cc ('k') | source/libvpx/third_party/libyuv/source/cpu_id.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698