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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 } | 102 } |
103 | 103 |
104 // ARGB little endian (bgra in memory) to I422 | 104 // ARGB little endian (bgra in memory) to I422 |
105 LIBYUV_API | 105 LIBYUV_API |
106 int ARGBToI422(const uint8* src_argb, int src_stride_argb, | 106 int ARGBToI422(const uint8* src_argb, int src_stride_argb, |
107 uint8* dst_y, int dst_stride_y, | 107 uint8* dst_y, int dst_stride_y, |
108 uint8* dst_u, int dst_stride_u, | 108 uint8* dst_u, int dst_stride_u, |
109 uint8* dst_v, int dst_stride_v, | 109 uint8* dst_v, int dst_stride_v, |
110 int width, int height) { | 110 int width, int height) { |
111 int y; | 111 int y; |
112 void (*ARGBToUV422Row)(const uint8* src_argb, uint8* dst_u, uint8* dst_v, | 112 void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb, |
113 int width) = ARGBToUV422Row_C; | 113 uint8* dst_u, uint8* dst_v, int width) = ARGBToUVRow_C; |
114 void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = | 114 void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = |
115 ARGBToYRow_C; | 115 ARGBToYRow_C; |
116 if (!src_argb || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) { | 116 if (!src_argb || |
| 117 !dst_y || !dst_u || !dst_v || |
| 118 width <= 0 || height == 0) { |
117 return -1; | 119 return -1; |
118 } | 120 } |
| 121 // Negative height means invert the image. |
119 if (height < 0) { | 122 if (height < 0) { |
120 height = -height; | 123 height = -height; |
121 src_argb = src_argb + (height - 1) * src_stride_argb; | 124 src_argb = src_argb + (height - 1) * src_stride_argb; |
122 src_stride_argb = -src_stride_argb; | 125 src_stride_argb = -src_stride_argb; |
123 } | 126 } |
124 // Coalesce rows. | 127 // Coalesce rows. |
125 if (src_stride_argb == width * 4 && | 128 if (src_stride_argb == width * 4 && |
126 dst_stride_y == width && | 129 dst_stride_y == width && |
127 dst_stride_u * 2 == width && | 130 dst_stride_u * 2 == width && |
128 dst_stride_v * 2 == width) { | 131 dst_stride_v * 2 == width) { |
129 width *= height; | 132 width *= height; |
130 height = 1; | 133 height = 1; |
131 src_stride_argb = dst_stride_y = dst_stride_u = dst_stride_v = 0; | 134 src_stride_argb = dst_stride_y = dst_stride_u = dst_stride_v = 0; |
132 } | 135 } |
133 #if defined(HAS_ARGBTOUV422ROW_SSSE3) | 136 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
134 if (TestCpuFlag(kCpuHasSSSE3)) { | 137 if (TestCpuFlag(kCpuHasSSSE3)) { |
135 ARGBToUV422Row = ARGBToUV422Row_Any_SSSE3; | 138 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
136 if (IS_ALIGNED(width, 16)) { | |
137 ARGBToUV422Row = ARGBToUV422Row_SSSE3; | |
138 } | |
139 } | |
140 #endif | |
141 #if defined(HAS_ARGBTOUV422ROW_NEON) | |
142 if (TestCpuFlag(kCpuHasNEON)) { | |
143 ARGBToUV422Row = ARGBToUV422Row_Any_NEON; | |
144 if (IS_ALIGNED(width, 16)) { | |
145 ARGBToUV422Row = ARGBToUV422Row_NEON; | |
146 } | |
147 } | |
148 #endif | |
149 #if defined(HAS_ARGBTOYROW_SSSE3) | |
150 if (TestCpuFlag(kCpuHasSSSE3)) { | |
151 ARGBToYRow = ARGBToYRow_Any_SSSE3; | 139 ARGBToYRow = ARGBToYRow_Any_SSSE3; |
152 if (IS_ALIGNED(width, 16)) { | 140 if (IS_ALIGNED(width, 16)) { |
| 141 ARGBToUVRow = ARGBToUVRow_SSSE3; |
153 ARGBToYRow = ARGBToYRow_SSSE3; | 142 ARGBToYRow = ARGBToYRow_SSSE3; |
154 } | 143 } |
155 } | 144 } |
156 #endif | 145 #endif |
157 #if defined(HAS_ARGBTOYROW_AVX2) | 146 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
158 if (TestCpuFlag(kCpuHasAVX2)) { | 147 if (TestCpuFlag(kCpuHasAVX2)) { |
| 148 ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
159 ARGBToYRow = ARGBToYRow_Any_AVX2; | 149 ARGBToYRow = ARGBToYRow_Any_AVX2; |
160 if (IS_ALIGNED(width, 32)) { | 150 if (IS_ALIGNED(width, 32)) { |
| 151 ARGBToUVRow = ARGBToUVRow_AVX2; |
161 ARGBToYRow = ARGBToYRow_AVX2; | 152 ARGBToYRow = ARGBToYRow_AVX2; |
162 } | 153 } |
163 } | 154 } |
164 #endif | 155 #endif |
165 #if defined(HAS_ARGBTOYROW_NEON) | 156 #if defined(HAS_ARGBTOYROW_NEON) |
166 if (TestCpuFlag(kCpuHasNEON)) { | 157 if (TestCpuFlag(kCpuHasNEON)) { |
167 ARGBToYRow = ARGBToYRow_Any_NEON; | 158 ARGBToYRow = ARGBToYRow_Any_NEON; |
168 if (IS_ALIGNED(width, 8)) { | 159 if (IS_ALIGNED(width, 8)) { |
169 ARGBToYRow = ARGBToYRow_NEON; | 160 ARGBToYRow = ARGBToYRow_NEON; |
170 } | 161 } |
171 } | 162 } |
172 #endif | 163 #endif |
| 164 #if defined(HAS_ARGBTOUVROW_NEON) |
| 165 if (TestCpuFlag(kCpuHasNEON)) { |
| 166 ARGBToUVRow = ARGBToUVRow_Any_NEON; |
| 167 if (IS_ALIGNED(width, 16)) { |
| 168 ARGBToUVRow = ARGBToUVRow_NEON; |
| 169 } |
| 170 } |
| 171 #endif |
173 | 172 |
174 for (y = 0; y < height; ++y) { | 173 for (y = 0; y < height; ++y) { |
175 ARGBToUV422Row(src_argb, dst_u, dst_v, width); | 174 ARGBToUVRow(src_argb, 0, dst_u, dst_v, width); |
176 ARGBToYRow(src_argb, dst_y, width); | 175 ARGBToYRow(src_argb, dst_y, width); |
177 src_argb += src_stride_argb; | 176 src_argb += src_stride_argb; |
178 dst_y += dst_stride_y; | 177 dst_y += dst_stride_y; |
179 dst_u += dst_stride_u; | 178 dst_u += dst_stride_u; |
180 dst_v += dst_stride_v; | 179 dst_v += dst_stride_v; |
181 } | 180 } |
182 return 0; | 181 return 0; |
183 } | 182 } |
184 | 183 |
185 // ARGB little endian (bgra in memory) to I411 | 184 // ARGB little endian (bgra in memory) to I411 |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 } | 470 } |
472 return 0; | 471 return 0; |
473 } | 472 } |
474 | 473 |
475 // Convert ARGB to YUY2. | 474 // Convert ARGB to YUY2. |
476 LIBYUV_API | 475 LIBYUV_API |
477 int ARGBToYUY2(const uint8* src_argb, int src_stride_argb, | 476 int ARGBToYUY2(const uint8* src_argb, int src_stride_argb, |
478 uint8* dst_yuy2, int dst_stride_yuy2, | 477 uint8* dst_yuy2, int dst_stride_yuy2, |
479 int width, int height) { | 478 int width, int height) { |
480 int y; | 479 int y; |
481 void (*ARGBToUV422Row)(const uint8* src_argb, uint8* dst_u, uint8* dst_v, | 480 void (*ARGBToUVRow)(const uint8* src_argb, int src_stride_argb, |
482 int width) = ARGBToUV422Row_C; | 481 uint8* dst_u, uint8* dst_v, int width) = ARGBToUVRow_C; |
483 void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = | 482 void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = |
484 ARGBToYRow_C; | 483 ARGBToYRow_C; |
485 void (*I422ToYUY2Row)(const uint8* src_y, const uint8* src_u, | 484 void (*I422ToYUY2Row)(const uint8* src_y, const uint8* src_u, |
486 const uint8* src_v, uint8* dst_yuy2, int width) = I422ToYUY2Row_C; | 485 const uint8* src_v, uint8* dst_yuy2, int width) = I422ToYUY2Row_C; |
487 | 486 |
488 if (!src_argb || !dst_yuy2 || | 487 if (!src_argb || !dst_yuy2 || |
489 width <= 0 || height == 0) { | 488 width <= 0 || height == 0) { |
490 return -1; | 489 return -1; |
491 } | 490 } |
492 // Negative height means invert the image. | 491 // Negative height means invert the image. |
493 if (height < 0) { | 492 if (height < 0) { |
494 height = -height; | 493 height = -height; |
495 dst_yuy2 = dst_yuy2 + (height - 1) * dst_stride_yuy2; | 494 dst_yuy2 = dst_yuy2 + (height - 1) * dst_stride_yuy2; |
496 dst_stride_yuy2 = -dst_stride_yuy2; | 495 dst_stride_yuy2 = -dst_stride_yuy2; |
497 } | 496 } |
498 // Coalesce rows. | 497 // Coalesce rows. |
499 if (src_stride_argb == width * 4 && | 498 if (src_stride_argb == width * 4 && |
500 dst_stride_yuy2 == width * 2) { | 499 dst_stride_yuy2 == width * 2) { |
501 width *= height; | 500 width *= height; |
502 height = 1; | 501 height = 1; |
503 src_stride_argb = dst_stride_yuy2 = 0; | 502 src_stride_argb = dst_stride_yuy2 = 0; |
504 } | 503 } |
505 #if defined(HAS_ARGBTOUV422ROW_SSSE3) | 504 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
506 if (TestCpuFlag(kCpuHasSSSE3)) { | 505 if (TestCpuFlag(kCpuHasSSSE3)) { |
507 ARGBToUV422Row = ARGBToUV422Row_Any_SSSE3; | 506 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
508 if (IS_ALIGNED(width, 16)) { | |
509 ARGBToUV422Row = ARGBToUV422Row_SSSE3; | |
510 } | |
511 } | |
512 #endif | |
513 #if defined(HAS_ARGBTOUV422ROW_NEON) | |
514 if (TestCpuFlag(kCpuHasNEON)) { | |
515 ARGBToUV422Row = ARGBToUV422Row_Any_NEON; | |
516 if (IS_ALIGNED(width, 16)) { | |
517 ARGBToUV422Row = ARGBToUV422Row_NEON; | |
518 } | |
519 } | |
520 #endif | |
521 #if defined(HAS_ARGBTOYROW_SSSE3) | |
522 if (TestCpuFlag(kCpuHasSSSE3)) { | |
523 ARGBToYRow = ARGBToYRow_Any_SSSE3; | 507 ARGBToYRow = ARGBToYRow_Any_SSSE3; |
524 if (IS_ALIGNED(width, 16)) { | 508 if (IS_ALIGNED(width, 16)) { |
| 509 ARGBToUVRow = ARGBToUVRow_SSSE3; |
525 ARGBToYRow = ARGBToYRow_SSSE3; | 510 ARGBToYRow = ARGBToYRow_SSSE3; |
526 } | 511 } |
527 } | 512 } |
528 #endif | 513 #endif |
529 #if defined(HAS_ARGBTOYROW_AVX2) | 514 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
530 if (TestCpuFlag(kCpuHasAVX2)) { | 515 if (TestCpuFlag(kCpuHasAVX2)) { |
| 516 ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
531 ARGBToYRow = ARGBToYRow_Any_AVX2; | 517 ARGBToYRow = ARGBToYRow_Any_AVX2; |
532 if (IS_ALIGNED(width, 32)) { | 518 if (IS_ALIGNED(width, 32)) { |
| 519 ARGBToUVRow = ARGBToUVRow_AVX2; |
533 ARGBToYRow = ARGBToYRow_AVX2; | 520 ARGBToYRow = ARGBToYRow_AVX2; |
534 } | 521 } |
535 } | 522 } |
536 #endif | 523 #endif |
537 #if defined(HAS_ARGBTOYROW_NEON) | 524 #if defined(HAS_ARGBTOYROW_NEON) |
538 if (TestCpuFlag(kCpuHasNEON)) { | 525 if (TestCpuFlag(kCpuHasNEON)) { |
539 ARGBToYRow = ARGBToYRow_Any_NEON; | 526 ARGBToYRow = ARGBToYRow_Any_NEON; |
540 if (IS_ALIGNED(width, 8)) { | 527 if (IS_ALIGNED(width, 8)) { |
541 ARGBToYRow = ARGBToYRow_NEON; | 528 ARGBToYRow = ARGBToYRow_NEON; |
542 } | 529 } |
543 } | 530 } |
544 #endif | 531 #endif |
545 | 532 #if defined(HAS_ARGBTOUVROW_NEON) |
| 533 if (TestCpuFlag(kCpuHasNEON)) { |
| 534 ARGBToUVRow = ARGBToUVRow_Any_NEON; |
| 535 if (IS_ALIGNED(width, 16)) { |
| 536 ARGBToUVRow = ARGBToUVRow_NEON; |
| 537 } |
| 538 } |
| 539 #endif |
546 #if defined(HAS_I422TOYUY2ROW_SSE2) | 540 #if defined(HAS_I422TOYUY2ROW_SSE2) |
547 if (TestCpuFlag(kCpuHasSSE2)) { | 541 if (TestCpuFlag(kCpuHasSSE2)) { |
548 I422ToYUY2Row = I422ToYUY2Row_Any_SSE2; | 542 I422ToYUY2Row = I422ToYUY2Row_Any_SSE2; |
549 if (IS_ALIGNED(width, 16)) { | 543 if (IS_ALIGNED(width, 16)) { |
550 I422ToYUY2Row = I422ToYUY2Row_SSE2; | 544 I422ToYUY2Row = I422ToYUY2Row_SSE2; |
551 } | 545 } |
552 } | 546 } |
553 #endif | 547 #endif |
554 #if defined(HAS_I422TOYUY2ROW_NEON) | 548 #if defined(HAS_I422TOYUY2ROW_NEON) |
555 if (TestCpuFlag(kCpuHasNEON)) { | 549 if (TestCpuFlag(kCpuHasNEON)) { |
556 I422ToYUY2Row = I422ToYUY2Row_Any_NEON; | 550 I422ToYUY2Row = I422ToYUY2Row_Any_NEON; |
557 if (IS_ALIGNED(width, 16)) { | 551 if (IS_ALIGNED(width, 16)) { |
558 I422ToYUY2Row = I422ToYUY2Row_NEON; | 552 I422ToYUY2Row = I422ToYUY2Row_NEON; |
559 } | 553 } |
560 } | 554 } |
561 #endif | 555 #endif |
562 | 556 |
563 { | 557 { |
564 // Allocate a rows of yuv. | 558 // Allocate a rows of yuv. |
565 align_buffer_64(row_y, ((width + 63) & ~63) * 2); | 559 align_buffer_64(row_y, ((width + 63) & ~63) * 2); |
566 uint8* row_u = row_y + ((width + 63) & ~63); | 560 uint8* row_u = row_y + ((width + 63) & ~63); |
567 uint8* row_v = row_u + ((width + 63) & ~63) / 2; | 561 uint8* row_v = row_u + ((width + 63) & ~63) / 2; |
568 | 562 |
569 for (y = 0; y < height; ++y) { | 563 for (y = 0; y < height; ++y) { |
570 ARGBToUV422Row(src_argb, row_u, row_v, width); | 564 ARGBToUVRow(src_argb, 0, row_u, row_v, width); |
571 ARGBToYRow(src_argb, row_y, width); | 565 ARGBToYRow(src_argb, row_y, width); |
572 I422ToYUY2Row(row_y, row_u, row_v, dst_yuy2, width); | 566 I422ToYUY2Row(row_y, row_u, row_v, dst_yuy2, width); |
573 src_argb += src_stride_argb; | 567 src_argb += src_stride_argb; |
574 dst_yuy2 += dst_stride_yuy2; | 568 dst_yuy2 += dst_stride_yuy2; |
575 } | 569 } |
576 | 570 |
577 free_aligned_buffer_64(row_y); | 571 free_aligned_buffer_64(row_y); |
578 } | 572 } |
579 return 0; | 573 return 0; |
580 } | 574 } |
581 | 575 |
582 // Convert ARGB to UYVY. | 576 // Convert ARGB to UYVY. |
583 LIBYUV_API | 577 LIBYUV_API |
584 int ARGBToUYVY(const uint8* src_argb, int src_stride_argb, | 578 int ARGBToUYVY(const uint8* src_argb, int src_stride_argb, |
585 uint8* dst_uyvy, int dst_stride_uyvy, | 579 uint8* dst_uyvy, int dst_stride_uyvy, |
586 int width, int height) { | 580 int width, int height) { |
587 int y; | 581 int y; |
588 void (*ARGBToUV422Row)(const uint8* src_argb, uint8* dst_u, uint8* dst_v, | 582 void (*ARGBToUVRow)(const uint8* src_argb, int src_stride_argb, |
589 int width) = ARGBToUV422Row_C; | 583 uint8* dst_u, uint8* dst_v, int width) = ARGBToUVRow_C; |
590 void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = | 584 void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = |
591 ARGBToYRow_C; | 585 ARGBToYRow_C; |
592 void (*I422ToUYVYRow)(const uint8* src_y, const uint8* src_u, | 586 void (*I422ToUYVYRow)(const uint8* src_y, const uint8* src_u, |
593 const uint8* src_v, uint8* dst_uyvy, int width) = I422ToUYVYRow_C; | 587 const uint8* src_v, uint8* dst_uyvy, int width) = I422ToUYVYRow_C; |
594 | 588 |
595 if (!src_argb || !dst_uyvy || | 589 if (!src_argb || !dst_uyvy || |
596 width <= 0 || height == 0) { | 590 width <= 0 || height == 0) { |
597 return -1; | 591 return -1; |
598 } | 592 } |
599 // Negative height means invert the image. | 593 // Negative height means invert the image. |
600 if (height < 0) { | 594 if (height < 0) { |
601 height = -height; | 595 height = -height; |
602 dst_uyvy = dst_uyvy + (height - 1) * dst_stride_uyvy; | 596 dst_uyvy = dst_uyvy + (height - 1) * dst_stride_uyvy; |
603 dst_stride_uyvy = -dst_stride_uyvy; | 597 dst_stride_uyvy = -dst_stride_uyvy; |
604 } | 598 } |
605 // Coalesce rows. | 599 // Coalesce rows. |
606 if (src_stride_argb == width * 4 && | 600 if (src_stride_argb == width * 4 && |
607 dst_stride_uyvy == width * 2) { | 601 dst_stride_uyvy == width * 2) { |
608 width *= height; | 602 width *= height; |
609 height = 1; | 603 height = 1; |
610 src_stride_argb = dst_stride_uyvy = 0; | 604 src_stride_argb = dst_stride_uyvy = 0; |
611 } | 605 } |
612 #if defined(HAS_ARGBTOUV422ROW_SSSE3) | 606 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
613 if (TestCpuFlag(kCpuHasSSSE3)) { | 607 if (TestCpuFlag(kCpuHasSSSE3)) { |
614 ARGBToUV422Row = ARGBToUV422Row_Any_SSSE3; | 608 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
615 if (IS_ALIGNED(width, 16)) { | |
616 ARGBToUV422Row = ARGBToUV422Row_SSSE3; | |
617 } | |
618 } | |
619 #endif | |
620 #if defined(HAS_ARGBTOUV422ROW_NEON) | |
621 if (TestCpuFlag(kCpuHasNEON)) { | |
622 ARGBToUV422Row = ARGBToUV422Row_Any_NEON; | |
623 if (IS_ALIGNED(width, 16)) { | |
624 ARGBToUV422Row = ARGBToUV422Row_NEON; | |
625 } | |
626 } | |
627 #endif | |
628 #if defined(HAS_ARGBTOYROW_SSSE3) | |
629 if (TestCpuFlag(kCpuHasSSSE3)) { | |
630 ARGBToYRow = ARGBToYRow_Any_SSSE3; | 609 ARGBToYRow = ARGBToYRow_Any_SSSE3; |
631 if (IS_ALIGNED(width, 16)) { | 610 if (IS_ALIGNED(width, 16)) { |
| 611 ARGBToUVRow = ARGBToUVRow_SSSE3; |
632 ARGBToYRow = ARGBToYRow_SSSE3; | 612 ARGBToYRow = ARGBToYRow_SSSE3; |
633 } | 613 } |
634 } | 614 } |
635 #endif | 615 #endif |
636 #if defined(HAS_ARGBTOYROW_AVX2) | 616 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
637 if (TestCpuFlag(kCpuHasAVX2)) { | 617 if (TestCpuFlag(kCpuHasAVX2)) { |
| 618 ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
638 ARGBToYRow = ARGBToYRow_Any_AVX2; | 619 ARGBToYRow = ARGBToYRow_Any_AVX2; |
639 if (IS_ALIGNED(width, 32)) { | 620 if (IS_ALIGNED(width, 32)) { |
| 621 ARGBToUVRow = ARGBToUVRow_AVX2; |
640 ARGBToYRow = ARGBToYRow_AVX2; | 622 ARGBToYRow = ARGBToYRow_AVX2; |
641 } | 623 } |
642 } | 624 } |
643 #endif | 625 #endif |
644 #if defined(HAS_ARGBTOYROW_NEON) | 626 #if defined(HAS_ARGBTOYROW_NEON) |
645 if (TestCpuFlag(kCpuHasNEON)) { | 627 if (TestCpuFlag(kCpuHasNEON)) { |
646 ARGBToYRow = ARGBToYRow_Any_NEON; | 628 ARGBToYRow = ARGBToYRow_Any_NEON; |
647 if (IS_ALIGNED(width, 8)) { | 629 if (IS_ALIGNED(width, 8)) { |
648 ARGBToYRow = ARGBToYRow_NEON; | 630 ARGBToYRow = ARGBToYRow_NEON; |
649 } | 631 } |
650 } | 632 } |
651 #endif | 633 #endif |
652 | 634 #if defined(HAS_ARGBTOUVROW_NEON) |
| 635 if (TestCpuFlag(kCpuHasNEON)) { |
| 636 ARGBToUVRow = ARGBToUVRow_Any_NEON; |
| 637 if (IS_ALIGNED(width, 16)) { |
| 638 ARGBToUVRow = ARGBToUVRow_NEON; |
| 639 } |
| 640 } |
| 641 #endif |
653 #if defined(HAS_I422TOUYVYROW_SSE2) | 642 #if defined(HAS_I422TOUYVYROW_SSE2) |
654 if (TestCpuFlag(kCpuHasSSE2)) { | 643 if (TestCpuFlag(kCpuHasSSE2)) { |
655 I422ToUYVYRow = I422ToUYVYRow_Any_SSE2; | 644 I422ToUYVYRow = I422ToUYVYRow_Any_SSE2; |
656 if (IS_ALIGNED(width, 16)) { | 645 if (IS_ALIGNED(width, 16)) { |
657 I422ToUYVYRow = I422ToUYVYRow_SSE2; | 646 I422ToUYVYRow = I422ToUYVYRow_SSE2; |
658 } | 647 } |
659 } | 648 } |
660 #endif | 649 #endif |
661 #if defined(HAS_I422TOUYVYROW_NEON) | 650 #if defined(HAS_I422TOUYVYROW_NEON) |
662 if (TestCpuFlag(kCpuHasNEON)) { | 651 if (TestCpuFlag(kCpuHasNEON)) { |
663 I422ToUYVYRow = I422ToUYVYRow_Any_NEON; | 652 I422ToUYVYRow = I422ToUYVYRow_Any_NEON; |
664 if (IS_ALIGNED(width, 16)) { | 653 if (IS_ALIGNED(width, 16)) { |
665 I422ToUYVYRow = I422ToUYVYRow_NEON; | 654 I422ToUYVYRow = I422ToUYVYRow_NEON; |
666 } | 655 } |
667 } | 656 } |
668 #endif | 657 #endif |
669 | 658 |
670 { | 659 { |
671 // Allocate a rows of yuv. | 660 // Allocate a rows of yuv. |
672 align_buffer_64(row_y, ((width + 63) & ~63) * 2); | 661 align_buffer_64(row_y, ((width + 63) & ~63) * 2); |
673 uint8* row_u = row_y + ((width + 63) & ~63); | 662 uint8* row_u = row_y + ((width + 63) & ~63); |
674 uint8* row_v = row_u + ((width + 63) & ~63) / 2; | 663 uint8* row_v = row_u + ((width + 63) & ~63) / 2; |
675 | 664 |
676 for (y = 0; y < height; ++y) { | 665 for (y = 0; y < height; ++y) { |
677 ARGBToUV422Row(src_argb, row_u, row_v, width); | 666 ARGBToUVRow(src_argb, 0, row_u, row_v, width); |
678 ARGBToYRow(src_argb, row_y, width); | 667 ARGBToYRow(src_argb, row_y, width); |
679 I422ToUYVYRow(row_y, row_u, row_v, dst_uyvy, width); | 668 I422ToUYVYRow(row_y, row_u, row_v, dst_uyvy, width); |
680 src_argb += src_stride_argb; | 669 src_argb += src_stride_argb; |
681 dst_uyvy += dst_stride_uyvy; | 670 dst_uyvy += dst_stride_uyvy; |
682 } | 671 } |
683 | 672 |
684 free_aligned_buffer_64(row_y); | 673 free_aligned_buffer_64(row_y); |
685 } | 674 } |
686 return 0; | 675 return 0; |
687 } | 676 } |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 dst_u += dst_stride_u; | 1139 dst_u += dst_stride_u; |
1151 dst_v += dst_stride_v; | 1140 dst_v += dst_stride_v; |
1152 } | 1141 } |
1153 if (height & 1) { | 1142 if (height & 1) { |
1154 ARGBToUVJRow(src_argb, 0, dst_u, dst_v, width); | 1143 ARGBToUVJRow(src_argb, 0, dst_u, dst_v, width); |
1155 ARGBToYJRow(src_argb, dst_yj, width); | 1144 ARGBToYJRow(src_argb, dst_yj, width); |
1156 } | 1145 } |
1157 return 0; | 1146 return 0; |
1158 } | 1147 } |
1159 | 1148 |
1160 // ARGB little endian (bgra in memory) to J422 | 1149 // Convert ARGB to J422. (JPeg full range I422). |
1161 LIBYUV_API | 1150 LIBYUV_API |
1162 int ARGBToJ422(const uint8* src_argb, int src_stride_argb, | 1151 int ARGBToJ422(const uint8* src_argb, int src_stride_argb, |
1163 uint8* dst_y, int dst_stride_y, | 1152 uint8* dst_yj, int dst_stride_yj, |
1164 uint8* dst_u, int dst_stride_u, | 1153 uint8* dst_u, int dst_stride_u, |
1165 uint8* dst_v, int dst_stride_v, | 1154 uint8* dst_v, int dst_stride_v, |
1166 int width, int height) { | 1155 int width, int height) { |
1167 int y; | 1156 int y; |
1168 void (*ARGBToUVJ422Row)(const uint8* src_argb, uint8* dst_u, uint8* dst_v, | 1157 void (*ARGBToUVJRow)(const uint8* src_argb0, int src_stride_argb, |
1169 int width) = ARGBToUVJ422Row_C; | 1158 uint8* dst_u, uint8* dst_v, int width) = ARGBToUVJRow_C; |
1170 void (*ARGBToYJRow)(const uint8* src_argb, uint8* dst_y, int width) = | 1159 void (*ARGBToYJRow)(const uint8* src_argb, uint8* dst_yj, int width) = |
1171 ARGBToYJRow_C; | 1160 ARGBToYJRow_C; |
1172 if (!src_argb || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) { | 1161 if (!src_argb || |
| 1162 !dst_yj || !dst_u || !dst_v || |
| 1163 width <= 0 || height == 0) { |
1173 return -1; | 1164 return -1; |
1174 } | 1165 } |
| 1166 // Negative height means invert the image. |
1175 if (height < 0) { | 1167 if (height < 0) { |
1176 height = -height; | 1168 height = -height; |
1177 src_argb = src_argb + (height - 1) * src_stride_argb; | 1169 src_argb = src_argb + (height - 1) * src_stride_argb; |
1178 src_stride_argb = -src_stride_argb; | 1170 src_stride_argb = -src_stride_argb; |
1179 } | 1171 } |
1180 // Coalesce rows. | 1172 // Coalesce rows. |
1181 if (src_stride_argb == width * 4 && | 1173 if (src_stride_argb == width * 4 && |
1182 dst_stride_y == width && | 1174 dst_stride_yj == width && |
1183 dst_stride_u * 2 == width && | 1175 dst_stride_u * 2 == width && |
1184 dst_stride_v * 2 == width) { | 1176 dst_stride_v * 2 == width) { |
1185 width *= height; | 1177 width *= height; |
1186 height = 1; | 1178 height = 1; |
1187 src_stride_argb = dst_stride_y = dst_stride_u = dst_stride_v = 0; | 1179 src_stride_argb = dst_stride_yj = dst_stride_u = dst_stride_v = 0; |
1188 } | 1180 } |
1189 #if defined(HAS_ARGBTOUVJ422ROW_SSSE3) | 1181 #if defined(HAS_ARGBTOYJROW_SSSE3) && defined(HAS_ARGBTOUVJROW_SSSE3) |
1190 if (TestCpuFlag(kCpuHasSSSE3)) { | 1182 if (TestCpuFlag(kCpuHasSSSE3)) { |
1191 ARGBToUVJ422Row = ARGBToUVJ422Row_Any_SSSE3; | 1183 ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3; |
1192 if (IS_ALIGNED(width, 16)) { | |
1193 ARGBToUVJ422Row = ARGBToUVJ422Row_SSSE3; | |
1194 } | |
1195 } | |
1196 #endif | |
1197 #if defined(HAS_ARGBTOUVJ422ROW_NEON) | |
1198 if (TestCpuFlag(kCpuHasNEON)) { | |
1199 ARGBToUVJ422Row = ARGBToUVJ422Row_Any_NEON; | |
1200 if (IS_ALIGNED(width, 16)) { | |
1201 ARGBToUVJ422Row = ARGBToUVJ422Row_NEON; | |
1202 } | |
1203 } | |
1204 #endif | |
1205 | |
1206 #if defined(HAS_ARGBTOYJROW_SSSE3) | |
1207 if (TestCpuFlag(kCpuHasSSSE3)) { | |
1208 ARGBToYJRow = ARGBToYJRow_Any_SSSE3; | 1184 ARGBToYJRow = ARGBToYJRow_Any_SSSE3; |
1209 if (IS_ALIGNED(width, 16)) { | 1185 if (IS_ALIGNED(width, 16)) { |
| 1186 ARGBToUVJRow = ARGBToUVJRow_SSSE3; |
1210 ARGBToYJRow = ARGBToYJRow_SSSE3; | 1187 ARGBToYJRow = ARGBToYJRow_SSSE3; |
1211 } | 1188 } |
1212 } | 1189 } |
1213 #endif | 1190 #endif |
1214 #if defined(HAS_ARGBTOYJROW_AVX2) | 1191 #if defined(HAS_ARGBTOYJROW_AVX2) |
1215 if (TestCpuFlag(kCpuHasAVX2)) { | 1192 if (TestCpuFlag(kCpuHasAVX2)) { |
1216 ARGBToYJRow = ARGBToYJRow_Any_AVX2; | 1193 ARGBToYJRow = ARGBToYJRow_Any_AVX2; |
1217 if (IS_ALIGNED(width, 32)) { | 1194 if (IS_ALIGNED(width, 32)) { |
1218 ARGBToYJRow = ARGBToYJRow_AVX2; | 1195 ARGBToYJRow = ARGBToYJRow_AVX2; |
1219 } | 1196 } |
1220 } | 1197 } |
1221 #endif | 1198 #endif |
1222 #if defined(HAS_ARGBTOYJROW_NEON) | 1199 #if defined(HAS_ARGBTOYJROW_NEON) |
1223 if (TestCpuFlag(kCpuHasNEON)) { | 1200 if (TestCpuFlag(kCpuHasNEON)) { |
1224 ARGBToYJRow = ARGBToYJRow_Any_NEON; | 1201 ARGBToYJRow = ARGBToYJRow_Any_NEON; |
1225 if (IS_ALIGNED(width, 8)) { | 1202 if (IS_ALIGNED(width, 8)) { |
1226 ARGBToYJRow = ARGBToYJRow_NEON; | 1203 ARGBToYJRow = ARGBToYJRow_NEON; |
1227 } | 1204 } |
1228 } | 1205 } |
1229 #endif | 1206 #endif |
| 1207 #if defined(HAS_ARGBTOUVJROW_NEON) |
| 1208 if (TestCpuFlag(kCpuHasNEON)) { |
| 1209 ARGBToUVJRow = ARGBToUVJRow_Any_NEON; |
| 1210 if (IS_ALIGNED(width, 16)) { |
| 1211 ARGBToUVJRow = ARGBToUVJRow_NEON; |
| 1212 } |
| 1213 } |
| 1214 #endif |
1230 | 1215 |
1231 for (y = 0; y < height; ++y) { | 1216 for (y = 0; y < height; ++y) { |
1232 ARGBToUVJ422Row(src_argb, dst_u, dst_v, width); | 1217 ARGBToUVJRow(src_argb, 0, dst_u, dst_v, width); |
1233 ARGBToYJRow(src_argb, dst_y, width); | 1218 ARGBToYJRow(src_argb, dst_yj, width); |
1234 src_argb += src_stride_argb; | 1219 src_argb += src_stride_argb; |
1235 dst_y += dst_stride_y; | 1220 dst_yj += dst_stride_yj; |
1236 dst_u += dst_stride_u; | 1221 dst_u += dst_stride_u; |
1237 dst_v += dst_stride_v; | 1222 dst_v += dst_stride_v; |
1238 } | 1223 } |
1239 return 0; | 1224 return 0; |
1240 } | 1225 } |
1241 | 1226 |
1242 // Convert ARGB to J400. | 1227 // Convert ARGB to J400. |
1243 LIBYUV_API | 1228 LIBYUV_API |
1244 int ARGBToJ400(const uint8* src_argb, int src_stride_argb, | 1229 int ARGBToJ400(const uint8* src_argb, int src_stride_argb, |
1245 uint8* dst_yj, int dst_stride_yj, | 1230 uint8* dst_yj, int dst_stride_yj, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1292 src_argb += src_stride_argb; | 1277 src_argb += src_stride_argb; |
1293 dst_yj += dst_stride_yj; | 1278 dst_yj += dst_stride_yj; |
1294 } | 1279 } |
1295 return 0; | 1280 return 0; |
1296 } | 1281 } |
1297 | 1282 |
1298 #ifdef __cplusplus | 1283 #ifdef __cplusplus |
1299 } // extern "C" | 1284 } // extern "C" |
1300 } // namespace libyuv | 1285 } // namespace libyuv |
1301 #endif | 1286 #endif |
OLD | NEW |