- Timestamp:
- Nov 21, 2017 9:25:11 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/third_party/yuv/source/planar_functions.cc
r5633 r5699 322 322 } 323 323 #endif 324 #if defined(HAS_SPLITUVROW_MSA) 325 if (TestCpuFlag(kCpuHasMSA)) { 326 SplitUVRow = SplitUVRow_Any_MSA; 327 if (IS_ALIGNED(width, 32)) { 328 SplitUVRow = SplitUVRow_MSA; 329 } 330 } 331 #endif 324 332 325 333 for (y = 0; y < height; ++y) { … … 397 405 src_v += src_stride_v; 398 406 dst_uv += dst_stride_uv; 407 } 408 } 409 410 // Support function for NV12 etc RGB channels. 411 // Width and height are plane sizes (typically half pixel width). 412 LIBYUV_API 413 void SplitRGBPlane(const uint8* src_rgb, 414 int src_stride_rgb, 415 uint8* dst_r, 416 int dst_stride_r, 417 uint8* dst_g, 418 int dst_stride_g, 419 uint8* dst_b, 420 int dst_stride_b, 421 int width, 422 int height) { 423 int y; 424 void (*SplitRGBRow)(const uint8* src_rgb, uint8* dst_r, uint8* dst_g, 425 uint8* dst_b, int width) = SplitRGBRow_C; 426 // Negative height means invert the image. 427 if (height < 0) { 428 height = -height; 429 dst_r = dst_r + (height - 1) * dst_stride_r; 430 dst_g = dst_g + (height - 1) * dst_stride_g; 431 dst_b = dst_b + (height - 1) * dst_stride_b; 432 dst_stride_r = -dst_stride_r; 433 dst_stride_g = -dst_stride_g; 434 dst_stride_b = -dst_stride_b; 435 } 436 // Coalesce rows. 437 if (src_stride_rgb == width * 3 && dst_stride_r == width && 438 dst_stride_g == width && dst_stride_b == width) { 439 width *= height; 440 height = 1; 441 src_stride_rgb = dst_stride_r = dst_stride_g = dst_stride_b = 0; 442 } 443 #if defined(HAS_SPLITRGBROW_SSSE3) 444 if (TestCpuFlag(kCpuHasSSSE3)) { 445 SplitRGBRow = SplitRGBRow_Any_SSSE3; 446 if (IS_ALIGNED(width, 16)) { 447 SplitRGBRow = SplitRGBRow_SSSE3; 448 } 449 } 450 #endif 451 #if defined(HAS_SPLITRGBROW_NEON) 452 if (TestCpuFlag(kCpuHasNEON)) { 453 SplitRGBRow = SplitRGBRow_Any_NEON; 454 if (IS_ALIGNED(width, 16)) { 455 SplitRGBRow = SplitRGBRow_NEON; 456 } 457 } 458 #endif 459 460 for (y = 0; y < height; ++y) { 461 // Copy a row of RGB. 462 SplitRGBRow(src_rgb, dst_r, dst_g, dst_b, width); 463 dst_r += dst_stride_r; 464 dst_g += dst_stride_g; 465 dst_b += dst_stride_b; 466 src_rgb += src_stride_rgb; 467 } 468 } 469 470 LIBYUV_API 471 void MergeRGBPlane(const uint8* src_r, 472 int src_stride_r, 473 const uint8* src_g, 474 int src_stride_g, 475 const uint8* src_b, 476 int src_stride_b, 477 uint8* dst_rgb, 478 int dst_stride_rgb, 479 int width, 480 int height) { 481 int y; 482 void (*MergeRGBRow)(const uint8* src_r, const uint8* src_g, 483 const uint8* src_b, uint8* dst_rgb, int width) = 484 MergeRGBRow_C; 485 // Coalesce rows. 486 // Negative height means invert the image. 487 if (height < 0) { 488 height = -height; 489 dst_rgb = dst_rgb + (height - 1) * dst_stride_rgb; 490 dst_stride_rgb = -dst_stride_rgb; 491 } 492 // Coalesce rows. 493 if (src_stride_r == width && src_stride_g == width && src_stride_b == width && 494 dst_stride_rgb == width * 3) { 495 width *= height; 496 height = 1; 497 src_stride_r = src_stride_g = src_stride_b = dst_stride_rgb = 0; 498 } 499 #if defined(HAS_MERGERGBROW_SSSE3) 500 if (TestCpuFlag(kCpuHasSSSE3)) { 501 MergeRGBRow = MergeRGBRow_Any_SSSE3; 502 if (IS_ALIGNED(width, 16)) { 503 MergeRGBRow = MergeRGBRow_SSSE3; 504 } 505 } 506 #endif 507 #if defined(HAS_MERGERGBROW_NEON) 508 if (TestCpuFlag(kCpuHasNEON)) { 509 MergeRGBRow = MergeRGBRow_Any_NEON; 510 if (IS_ALIGNED(width, 16)) { 511 MergeRGBRow = MergeRGBRow_NEON; 512 } 513 } 514 #endif 515 516 for (y = 0; y < height; ++y) { 517 // Merge a row of U and V into a row of RGB. 518 MergeRGBRow(src_r, src_g, src_b, dst_rgb, width); 519 src_r += src_stride_r; 520 src_g += src_stride_g; 521 src_b += src_stride_b; 522 dst_rgb += dst_stride_rgb; 399 523 } 400 524 } … … 845 969 if (TestCpuFlag(kCpuHasNEON)) { 846 970 ARGBBlendRow = ARGBBlendRow_NEON; 971 } 972 #endif 973 #if defined(HAS_ARGBBLENDROW_MSA) 974 if (TestCpuFlag(kCpuHasMSA)) { 975 ARGBBlendRow = ARGBBlendRow_MSA; 847 976 } 848 977 #endif … … 1575 1704 } 1576 1705 #endif 1706 #if defined(HAS_SETROW_MSA) 1707 if (TestCpuFlag(kCpuHasMSA) && IS_ALIGNED(width, 16)) { 1708 SetRow = SetRow_MSA; 1709 } 1710 #endif 1577 1711 1578 1712 // Set plane … … 1975 2109 } 1976 2110 #endif 2111 #if defined(HAS_ARGBCOLORMATRIXROW_MSA) 2112 if (TestCpuFlag(kCpuHasMSA) && IS_ALIGNED(width, 8)) { 2113 ARGBColorMatrixRow = ARGBColorMatrixRow_MSA; 2114 } 2115 #endif 1977 2116 for (y = 0; y < height; ++y) { 1978 2117 ARGBColorMatrixRow(src_argb, dst_argb, matrix_argb, width); … … 2133 2272 if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(width, 8)) { 2134 2273 ARGBQuantizeRow = ARGBQuantizeRow_NEON; 2274 } 2275 #endif 2276 #if defined(HAS_ARGBQUANTIZEROW_MSA) 2277 if (TestCpuFlag(kCpuHasMSA) && IS_ALIGNED(width, 8)) { 2278 ARGBQuantizeRow = ARGBQuantizeRow_MSA; 2135 2279 } 2136 2280 #endif … … 2620 2764 } 2621 2765 #endif 2766 #if defined(HAS_SOBELYROW_MSA) 2767 if (TestCpuFlag(kCpuHasMSA)) { 2768 SobelYRow = SobelYRow_MSA; 2769 } 2770 #endif 2622 2771 #if defined(HAS_SOBELXROW_SSE2) 2623 2772 if (TestCpuFlag(kCpuHasSSE2)) { … … 2628 2777 if (TestCpuFlag(kCpuHasNEON)) { 2629 2778 SobelXRow = SobelXRow_NEON; 2779 } 2780 #endif 2781 #if defined(HAS_SOBELXROW_MSA) 2782 if (TestCpuFlag(kCpuHasMSA)) { 2783 SobelXRow = SobelXRow_MSA; 2630 2784 } 2631 2785 #endif … … 2904 3058 } 2905 3059 #endif 3060 #if defined(HAS_HALFFLOATROW_MSA) 3061 if (TestCpuFlag(kCpuHasMSA)) { 3062 HalfFloatRow = HalfFloatRow_Any_MSA; 3063 if (IS_ALIGNED(width, 32)) { 3064 HalfFloatRow = HalfFloatRow_MSA; 3065 } 3066 } 3067 #endif 2906 3068 2907 3069 for (y = 0; y < height; ++y) { … … 3047 3209 ARGBExtractAlphaRow = IS_ALIGNED(width, 16) ? ARGBExtractAlphaRow_NEON 3048 3210 : ARGBExtractAlphaRow_Any_NEON; 3211 } 3212 #endif 3213 #if defined(HAS_ARGBEXTRACTALPHAROW_MSA) 3214 if (TestCpuFlag(kCpuHasMSA)) { 3215 ARGBExtractAlphaRow = IS_ALIGNED(width, 16) ? ARGBExtractAlphaRow_MSA 3216 : ARGBExtractAlphaRow_Any_MSA; 3049 3217 } 3050 3218 #endif … … 3158 3326 if (IS_ALIGNED(width, 16)) { 3159 3327 SplitUVRow = SplitUVRow_NEON; 3328 } 3329 } 3330 #endif 3331 #if defined(HAS_SPLITUVROW_MSA) 3332 if (TestCpuFlag(kCpuHasMSA)) { 3333 SplitUVRow = SplitUVRow_Any_MSA; 3334 if (IS_ALIGNED(width, 32)) { 3335 SplitUVRow = SplitUVRow_MSA; 3160 3336 } 3161 3337 } … … 3269 3445 } 3270 3446 #endif 3447 #if defined(HAS_SPLITUVROW_MSA) 3448 if (TestCpuFlag(kCpuHasMSA)) { 3449 SplitUVRow = SplitUVRow_Any_MSA; 3450 if (IS_ALIGNED(width, 32)) { 3451 SplitUVRow = SplitUVRow_MSA; 3452 } 3453 } 3454 #endif 3271 3455 #if defined(HAS_INTERPOLATEROW_SSSE3) 3272 3456 if (TestCpuFlag(kCpuHasSSSE3)) {
Note: See TracChangeset
for help on using the changeset viewer.