| 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 |