OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. | 2 * Copyright 2011 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0; | 78 src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0; |
79 } | 79 } |
80 #if defined(HAS_I444TOARGBROW_SSSE3) | 80 #if defined(HAS_I444TOARGBROW_SSSE3) |
81 if (TestCpuFlag(kCpuHasSSSE3)) { | 81 if (TestCpuFlag(kCpuHasSSSE3)) { |
82 I444ToARGBRow = I444ToARGBRow_Any_SSSE3; | 82 I444ToARGBRow = I444ToARGBRow_Any_SSSE3; |
83 if (IS_ALIGNED(width, 8)) { | 83 if (IS_ALIGNED(width, 8)) { |
84 I444ToARGBRow = I444ToARGBRow_SSSE3; | 84 I444ToARGBRow = I444ToARGBRow_SSSE3; |
85 } | 85 } |
86 } | 86 } |
87 #endif | 87 #endif |
| 88 #if defined(HAS_I444TOARGBROW_AVX2) |
| 89 if (TestCpuFlag(kCpuHasAVX2)) { |
| 90 I444ToARGBRow = I444ToARGBRow_Any_AVX2; |
| 91 if (IS_ALIGNED(width, 16)) { |
| 92 I444ToARGBRow = I444ToARGBRow_AVX2; |
| 93 } |
| 94 } |
| 95 #endif |
88 #if defined(HAS_I444TOARGBROW_NEON) | 96 #if defined(HAS_I444TOARGBROW_NEON) |
89 if (TestCpuFlag(kCpuHasNEON)) { | 97 if (TestCpuFlag(kCpuHasNEON)) { |
90 I444ToARGBRow = I444ToARGBRow_Any_NEON; | 98 I444ToARGBRow = I444ToARGBRow_Any_NEON; |
91 if (IS_ALIGNED(width, 8)) { | 99 if (IS_ALIGNED(width, 8)) { |
92 I444ToARGBRow = I444ToARGBRow_NEON; | 100 I444ToARGBRow = I444ToARGBRow_NEON; |
93 } | 101 } |
94 } | 102 } |
95 #endif | 103 #endif |
96 | 104 |
97 for (y = 0; y < height; ++y) { | 105 for (y = 0; y < height; ++y) { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0; | 223 src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0; |
216 } | 224 } |
217 #if defined(HAS_I411TOARGBROW_SSSE3) | 225 #if defined(HAS_I411TOARGBROW_SSSE3) |
218 if (TestCpuFlag(kCpuHasSSSE3)) { | 226 if (TestCpuFlag(kCpuHasSSSE3)) { |
219 I411ToARGBRow = I411ToARGBRow_Any_SSSE3; | 227 I411ToARGBRow = I411ToARGBRow_Any_SSSE3; |
220 if (IS_ALIGNED(width, 8)) { | 228 if (IS_ALIGNED(width, 8)) { |
221 I411ToARGBRow = I411ToARGBRow_SSSE3; | 229 I411ToARGBRow = I411ToARGBRow_SSSE3; |
222 } | 230 } |
223 } | 231 } |
224 #endif | 232 #endif |
| 233 #if defined(HAS_I411TOARGBROW_AVX2) |
| 234 if (TestCpuFlag(kCpuHasAVX2)) { |
| 235 I411ToARGBRow = I411ToARGBRow_Any_AVX2; |
| 236 if (IS_ALIGNED(width, 16)) { |
| 237 I411ToARGBRow = I411ToARGBRow_AVX2; |
| 238 } |
| 239 } |
| 240 #endif |
225 #if defined(HAS_I411TOARGBROW_NEON) | 241 #if defined(HAS_I411TOARGBROW_NEON) |
226 if (TestCpuFlag(kCpuHasNEON)) { | 242 if (TestCpuFlag(kCpuHasNEON)) { |
227 I411ToARGBRow = I411ToARGBRow_Any_NEON; | 243 I411ToARGBRow = I411ToARGBRow_Any_NEON; |
228 if (IS_ALIGNED(width, 8)) { | 244 if (IS_ALIGNED(width, 8)) { |
229 I411ToARGBRow = I411ToARGBRow_NEON; | 245 I411ToARGBRow = I411ToARGBRow_NEON; |
230 } | 246 } |
231 } | 247 } |
232 #endif | 248 #endif |
233 | 249 |
234 for (y = 0; y < height; ++y) { | 250 for (y = 0; y < height; ++y) { |
235 I411ToARGBRow(src_y, src_u, src_v, dst_argb, width); | 251 I411ToARGBRow(src_y, src_u, src_v, dst_argb, width); |
236 dst_argb += dst_stride_argb; | 252 dst_argb += dst_stride_argb; |
237 src_y += src_stride_y; | 253 src_y += src_stride_y; |
238 src_u += src_stride_u; | 254 src_u += src_stride_u; |
239 src_v += src_stride_v; | 255 src_v += src_stride_v; |
240 } | 256 } |
241 return 0; | 257 return 0; |
242 } | 258 } |
243 | 259 |
244 // Convert I400 to ARGB. | 260 // Convert I400 to ARGB. |
245 LIBYUV_API | 261 LIBYUV_API |
246 int I400ToARGB_Reference(const uint8* src_y, int src_stride_y, | 262 int I400ToARGB(const uint8* src_y, int src_stride_y, |
247 uint8* dst_argb, int dst_stride_argb, | 263 uint8* dst_argb, int dst_stride_argb, |
248 int width, int height) { | 264 int width, int height) { |
249 int y; | 265 int y; |
250 void (*YToARGBRow)(const uint8* y_buf, | 266 void (*I400ToARGBRow)(const uint8* y_buf, |
251 uint8* rgb_buf, | 267 uint8* rgb_buf, |
252 int width) = YToARGBRow_C; | 268 int width) = I400ToARGBRow_C; |
253 if (!src_y || !dst_argb || | 269 if (!src_y || !dst_argb || |
254 width <= 0 || height == 0) { | 270 width <= 0 || height == 0) { |
255 return -1; | 271 return -1; |
256 } | 272 } |
257 // Negative height means invert the image. | 273 // Negative height means invert the image. |
258 if (height < 0) { | 274 if (height < 0) { |
259 height = -height; | 275 height = -height; |
260 dst_argb = dst_argb + (height - 1) * dst_stride_argb; | 276 dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
261 dst_stride_argb = -dst_stride_argb; | 277 dst_stride_argb = -dst_stride_argb; |
262 } | 278 } |
263 // Coalesce rows. | 279 // Coalesce rows. |
264 if (src_stride_y == width && | 280 if (src_stride_y == width && |
265 dst_stride_argb == width * 4) { | 281 dst_stride_argb == width * 4) { |
266 width *= height; | 282 width *= height; |
267 height = 1; | 283 height = 1; |
268 src_stride_y = dst_stride_argb = 0; | 284 src_stride_y = dst_stride_argb = 0; |
269 } | 285 } |
270 #if defined(HAS_YTOARGBROW_SSE2) | 286 #if defined(HAS_I400TOARGBROW_SSE2) |
271 if (TestCpuFlag(kCpuHasSSE2)) { | 287 if (TestCpuFlag(kCpuHasSSE2)) { |
272 YToARGBRow = YToARGBRow_Any_SSE2; | 288 I400ToARGBRow = I400ToARGBRow_Any_SSE2; |
273 if (IS_ALIGNED(width, 8)) { | 289 if (IS_ALIGNED(width, 8)) { |
274 YToARGBRow = YToARGBRow_SSE2; | 290 I400ToARGBRow = I400ToARGBRow_SSE2; |
275 } | 291 } |
276 } | 292 } |
277 #endif | 293 #endif |
278 #if defined(HAS_YTOARGBROW_AVX2) | 294 #if defined(HAS_I400TOARGBROW_AVX2) |
279 if (TestCpuFlag(kCpuHasAVX2)) { | 295 if (TestCpuFlag(kCpuHasAVX2)) { |
280 YToARGBRow = YToARGBRow_Any_AVX2; | 296 I400ToARGBRow = I400ToARGBRow_Any_AVX2; |
281 if (IS_ALIGNED(width, 16)) { | 297 if (IS_ALIGNED(width, 16)) { |
282 YToARGBRow = YToARGBRow_AVX2; | 298 I400ToARGBRow = I400ToARGBRow_AVX2; |
283 } | 299 } |
284 } | 300 } |
285 #endif | 301 #endif |
286 #if defined(HAS_YTOARGBROW_NEON) | 302 #if defined(HAS_I400TOARGBROW_NEON) |
287 if (TestCpuFlag(kCpuHasNEON)) { | 303 if (TestCpuFlag(kCpuHasNEON)) { |
288 YToARGBRow = YToARGBRow_Any_NEON; | 304 I400ToARGBRow = I400ToARGBRow_Any_NEON; |
289 if (IS_ALIGNED(width, 8)) { | 305 if (IS_ALIGNED(width, 8)) { |
290 YToARGBRow = YToARGBRow_NEON; | 306 I400ToARGBRow = I400ToARGBRow_NEON; |
291 } | 307 } |
292 } | 308 } |
293 #endif | 309 #endif |
294 | 310 |
295 for (y = 0; y < height; ++y) { | 311 for (y = 0; y < height; ++y) { |
296 YToARGBRow(src_y, dst_argb, width); | 312 I400ToARGBRow(src_y, dst_argb, width); |
297 dst_argb += dst_stride_argb; | 313 dst_argb += dst_stride_argb; |
298 src_y += src_stride_y; | 314 src_y += src_stride_y; |
299 } | 315 } |
300 return 0; | 316 return 0; |
301 } | 317 } |
302 | 318 |
303 // Convert I400 to ARGB. | 319 // Convert J400 to ARGB. |
304 LIBYUV_API | 320 LIBYUV_API |
305 int I400ToARGB(const uint8* src_y, int src_stride_y, | 321 int J400ToARGB(const uint8* src_y, int src_stride_y, |
306 uint8* dst_argb, int dst_stride_argb, | 322 uint8* dst_argb, int dst_stride_argb, |
307 int width, int height) { | 323 int width, int height) { |
308 int y; | 324 int y; |
309 void (*I400ToARGBRow)(const uint8* src_y, uint8* dst_argb, int pix) = | 325 void (*J400ToARGBRow)(const uint8* src_y, uint8* dst_argb, int pix) = |
310 I400ToARGBRow_C; | 326 J400ToARGBRow_C; |
311 if (!src_y || !dst_argb || | 327 if (!src_y || !dst_argb || |
312 width <= 0 || height == 0) { | 328 width <= 0 || height == 0) { |
313 return -1; | 329 return -1; |
314 } | 330 } |
315 // Negative height means invert the image. | 331 // Negative height means invert the image. |
316 if (height < 0) { | 332 if (height < 0) { |
317 height = -height; | 333 height = -height; |
318 src_y = src_y + (height - 1) * src_stride_y; | 334 src_y = src_y + (height - 1) * src_stride_y; |
319 src_stride_y = -src_stride_y; | 335 src_stride_y = -src_stride_y; |
320 } | 336 } |
321 // Coalesce rows. | 337 // Coalesce rows. |
322 if (src_stride_y == width && | 338 if (src_stride_y == width && |
323 dst_stride_argb == width * 4) { | 339 dst_stride_argb == width * 4) { |
324 width *= height; | 340 width *= height; |
325 height = 1; | 341 height = 1; |
326 src_stride_y = dst_stride_argb = 0; | 342 src_stride_y = dst_stride_argb = 0; |
327 } | 343 } |
328 #if defined(HAS_I400TOARGBROW_SSE2) | 344 #if defined(HAS_J400TOARGBROW_SSE2) |
329 if (TestCpuFlag(kCpuHasSSE2)) { | 345 if (TestCpuFlag(kCpuHasSSE2)) { |
330 I400ToARGBRow = I400ToARGBRow_Any_SSE2; | 346 J400ToARGBRow = J400ToARGBRow_Any_SSE2; |
331 if (IS_ALIGNED(width, 8)) { | 347 if (IS_ALIGNED(width, 8)) { |
332 I400ToARGBRow = I400ToARGBRow_SSE2; | 348 J400ToARGBRow = J400ToARGBRow_SSE2; |
333 } | 349 } |
334 } | 350 } |
335 #endif | 351 #endif |
336 #if defined(HAS_I400TOARGBROW_NEON) | 352 #if defined(HAS_J400TOARGBROW_AVX2) |
| 353 if (TestCpuFlag(kCpuHasAVX2)) { |
| 354 J400ToARGBRow = J400ToARGBRow_Any_AVX2; |
| 355 if (IS_ALIGNED(width, 16)) { |
| 356 J400ToARGBRow = J400ToARGBRow_AVX2; |
| 357 } |
| 358 } |
| 359 #endif |
| 360 #if defined(HAS_J400TOARGBROW_NEON) |
337 if (TestCpuFlag(kCpuHasNEON)) { | 361 if (TestCpuFlag(kCpuHasNEON)) { |
338 I400ToARGBRow = I400ToARGBRow_Any_NEON; | 362 J400ToARGBRow = J400ToARGBRow_Any_NEON; |
339 if (IS_ALIGNED(width, 8)) { | 363 if (IS_ALIGNED(width, 8)) { |
340 I400ToARGBRow = I400ToARGBRow_NEON; | 364 J400ToARGBRow = J400ToARGBRow_NEON; |
341 } | 365 } |
342 } | 366 } |
343 #endif | 367 #endif |
344 for (y = 0; y < height; ++y) { | 368 for (y = 0; y < height; ++y) { |
345 I400ToARGBRow(src_y, dst_argb, width); | 369 J400ToARGBRow(src_y, dst_argb, width); |
346 src_y += src_stride_y; | 370 src_y += src_stride_y; |
347 dst_argb += dst_stride_argb; | 371 dst_argb += dst_stride_argb; |
348 } | 372 } |
349 return 0; | 373 return 0; |
350 } | 374 } |
351 | 375 |
352 // Shuffle table for converting BGRA to ARGB. | 376 // Shuffle table for converting BGRA to ARGB. |
353 static uvec8 kShuffleMaskBGRAToARGB = { | 377 static uvec8 kShuffleMaskBGRAToARGB = { |
354 3u, 2u, 1u, 0u, 7u, 6u, 5u, 4u, 11u, 10u, 9u, 8u, 15u, 14u, 13u, 12u | 378 3u, 2u, 1u, 0u, 7u, 6u, 5u, 4u, 11u, 10u, 9u, 8u, 15u, 14u, 13u, 12u |
355 }; | 379 }; |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 src_stride_rgb565 = dst_stride_argb = 0; | 569 src_stride_rgb565 = dst_stride_argb = 0; |
546 } | 570 } |
547 #if defined(HAS_RGB565TOARGBROW_SSE2) | 571 #if defined(HAS_RGB565TOARGBROW_SSE2) |
548 if (TestCpuFlag(kCpuHasSSE2)) { | 572 if (TestCpuFlag(kCpuHasSSE2)) { |
549 RGB565ToARGBRow = RGB565ToARGBRow_Any_SSE2; | 573 RGB565ToARGBRow = RGB565ToARGBRow_Any_SSE2; |
550 if (IS_ALIGNED(width, 8)) { | 574 if (IS_ALIGNED(width, 8)) { |
551 RGB565ToARGBRow = RGB565ToARGBRow_SSE2; | 575 RGB565ToARGBRow = RGB565ToARGBRow_SSE2; |
552 } | 576 } |
553 } | 577 } |
554 #endif | 578 #endif |
| 579 #if defined(HAS_RGB565TOARGBROW_AVX2) |
| 580 if (TestCpuFlag(kCpuHasAVX2)) { |
| 581 RGB565ToARGBRow = RGB565ToARGBRow_Any_AVX2; |
| 582 if (IS_ALIGNED(width, 16)) { |
| 583 RGB565ToARGBRow = RGB565ToARGBRow_AVX2; |
| 584 } |
| 585 } |
| 586 #endif |
555 #if defined(HAS_RGB565TOARGBROW_NEON) | 587 #if defined(HAS_RGB565TOARGBROW_NEON) |
556 if (TestCpuFlag(kCpuHasNEON)) { | 588 if (TestCpuFlag(kCpuHasNEON)) { |
557 RGB565ToARGBRow = RGB565ToARGBRow_Any_NEON; | 589 RGB565ToARGBRow = RGB565ToARGBRow_Any_NEON; |
558 if (IS_ALIGNED(width, 8)) { | 590 if (IS_ALIGNED(width, 8)) { |
559 RGB565ToARGBRow = RGB565ToARGBRow_NEON; | 591 RGB565ToARGBRow = RGB565ToARGBRow_NEON; |
560 } | 592 } |
561 } | 593 } |
562 #endif | 594 #endif |
563 | 595 |
564 for (y = 0; y < height; ++y) { | 596 for (y = 0; y < height; ++y) { |
(...skipping 30 matching lines...) Expand all Loading... |
595 src_stride_argb1555 = dst_stride_argb = 0; | 627 src_stride_argb1555 = dst_stride_argb = 0; |
596 } | 628 } |
597 #if defined(HAS_ARGB1555TOARGBROW_SSE2) | 629 #if defined(HAS_ARGB1555TOARGBROW_SSE2) |
598 if (TestCpuFlag(kCpuHasSSE2)) { | 630 if (TestCpuFlag(kCpuHasSSE2)) { |
599 ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_SSE2; | 631 ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_SSE2; |
600 if (IS_ALIGNED(width, 8)) { | 632 if (IS_ALIGNED(width, 8)) { |
601 ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2; | 633 ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2; |
602 } | 634 } |
603 } | 635 } |
604 #endif | 636 #endif |
| 637 #if defined(HAS_ARGB1555TOARGBROW_AVX2) |
| 638 if (TestCpuFlag(kCpuHasAVX2)) { |
| 639 ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_AVX2; |
| 640 if (IS_ALIGNED(width, 16)) { |
| 641 ARGB1555ToARGBRow = ARGB1555ToARGBRow_AVX2; |
| 642 } |
| 643 } |
| 644 #endif |
605 #if defined(HAS_ARGB1555TOARGBROW_NEON) | 645 #if defined(HAS_ARGB1555TOARGBROW_NEON) |
606 if (TestCpuFlag(kCpuHasNEON)) { | 646 if (TestCpuFlag(kCpuHasNEON)) { |
607 ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_NEON; | 647 ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_NEON; |
608 if (IS_ALIGNED(width, 8)) { | 648 if (IS_ALIGNED(width, 8)) { |
609 ARGB1555ToARGBRow = ARGB1555ToARGBRow_NEON; | 649 ARGB1555ToARGBRow = ARGB1555ToARGBRow_NEON; |
610 } | 650 } |
611 } | 651 } |
612 #endif | 652 #endif |
613 | 653 |
614 for (y = 0; y < height; ++y) { | 654 for (y = 0; y < height; ++y) { |
(...skipping 30 matching lines...) Expand all Loading... |
645 src_stride_argb4444 = dst_stride_argb = 0; | 685 src_stride_argb4444 = dst_stride_argb = 0; |
646 } | 686 } |
647 #if defined(HAS_ARGB4444TOARGBROW_SSE2) | 687 #if defined(HAS_ARGB4444TOARGBROW_SSE2) |
648 if (TestCpuFlag(kCpuHasSSE2)) { | 688 if (TestCpuFlag(kCpuHasSSE2)) { |
649 ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_SSE2; | 689 ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_SSE2; |
650 if (IS_ALIGNED(width, 8)) { | 690 if (IS_ALIGNED(width, 8)) { |
651 ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2; | 691 ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2; |
652 } | 692 } |
653 } | 693 } |
654 #endif | 694 #endif |
| 695 #if defined(HAS_ARGB4444TOARGBROW_AVX2) |
| 696 if (TestCpuFlag(kCpuHasAVX2)) { |
| 697 ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_AVX2; |
| 698 if (IS_ALIGNED(width, 16)) { |
| 699 ARGB4444ToARGBRow = ARGB4444ToARGBRow_AVX2; |
| 700 } |
| 701 } |
| 702 #endif |
655 #if defined(HAS_ARGB4444TOARGBROW_NEON) | 703 #if defined(HAS_ARGB4444TOARGBROW_NEON) |
656 if (TestCpuFlag(kCpuHasNEON)) { | 704 if (TestCpuFlag(kCpuHasNEON)) { |
657 ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_NEON; | 705 ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_NEON; |
658 if (IS_ALIGNED(width, 8)) { | 706 if (IS_ALIGNED(width, 8)) { |
659 ARGB4444ToARGBRow = ARGB4444ToARGBRow_NEON; | 707 ARGB4444ToARGBRow = ARGB4444ToARGBRow_NEON; |
660 } | 708 } |
661 } | 709 } |
662 #endif | 710 #endif |
663 | 711 |
664 for (y = 0; y < height; ++y) { | 712 for (y = 0; y < height; ++y) { |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1098 src_u += src_stride_u; | 1146 src_u += src_stride_u; |
1099 src_v += src_stride_v; | 1147 src_v += src_stride_v; |
1100 } | 1148 } |
1101 return 0; | 1149 return 0; |
1102 } | 1150 } |
1103 | 1151 |
1104 #ifdef __cplusplus | 1152 #ifdef __cplusplus |
1105 } // extern "C" | 1153 } // extern "C" |
1106 } // namespace libyuv | 1154 } // namespace libyuv |
1107 #endif | 1155 #endif |
OLD | NEW |