OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |