| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This webpage shows layout of YV12 and other YUV formats | 5 // This webpage shows layout of YV12 and other YUV formats |
| 6 // http://www.fourcc.org/yuv.php | 6 // http://www.fourcc.org/yuv.php |
| 7 // The actual conversion is best described here | 7 // The actual conversion is best described here |
| 8 // http://en.wikipedia.org/wiki/YUV | 8 // http://en.wikipedia.org/wiki/YUV |
| 9 // An article on optimizing YUV conversion using tables instead of multiplies | 9 // An article on optimizing YUV conversion using tables instead of multiplies |
| 10 // http://lestourtereaux.free.fr/papers/data/yuvrgb.pdf | 10 // http://lestourtereaux.free.fr/papers/data/yuvrgb.pdf |
| (...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 uint8* uplane, | 436 uint8* uplane, |
| 437 uint8* vplane, | 437 uint8* vplane, |
| 438 int width, | 438 int width, |
| 439 int height, | 439 int height, |
| 440 int rgbstride, | 440 int rgbstride, |
| 441 int ystride, | 441 int ystride, |
| 442 int uvstride) { | 442 int uvstride) { |
| 443 static void (*convert_proc)(const uint8*, uint8*, uint8*, uint8*, | 443 static void (*convert_proc)(const uint8*, uint8*, uint8*, uint8*, |
| 444 int, int, int, int, int) = NULL; | 444 int, int, int, int, int) = NULL; |
| 445 if (!convert_proc) { | 445 if (!convert_proc) { |
| 446 #if defined(ARCH_CPU_ARM_FAMILY) | 446 #if defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY) |
| 447 // For ARM processors, always use C version. | 447 // For ARM and MIPS processors, always use C version. |
| 448 // TODO(hclam): Implement a NEON version. | 448 // TODO(hclam): Implement a NEON version. |
| 449 convert_proc = &ConvertRGB32ToYUV_C; | 449 convert_proc = &ConvertRGB32ToYUV_C; |
| 450 #else | 450 #else |
| 451 // TODO(hclam): Switch to SSSE3 version when the cyan problem is solved. | 451 // TODO(hclam): Switch to SSSE3 version when the cyan problem is solved. |
| 452 // See: crbug.com/100462 | 452 // See: crbug.com/100462 |
| 453 base::CPU cpu; | 453 base::CPU cpu; |
| 454 if (cpu.has_sse2()) | 454 if (cpu.has_sse2()) |
| 455 convert_proc = &ConvertRGB32ToYUV_SSE2; | 455 convert_proc = &ConvertRGB32ToYUV_SSE2; |
| 456 else | 456 else |
| 457 convert_proc = &ConvertRGB32ToYUV_C; | 457 convert_proc = &ConvertRGB32ToYUV_C; |
| 458 #endif | 458 #endif |
| 459 } | 459 } |
| 460 | 460 |
| 461 convert_proc(rgbframe, yplane, uplane, vplane, width, height, | 461 convert_proc(rgbframe, yplane, uplane, vplane, width, height, |
| 462 rgbstride, ystride, uvstride); | 462 rgbstride, ystride, uvstride); |
| 463 } | 463 } |
| 464 | 464 |
| 465 void ConvertRGB24ToYUV(const uint8* rgbframe, | 465 void ConvertRGB24ToYUV(const uint8* rgbframe, |
| 466 uint8* yplane, | 466 uint8* yplane, |
| 467 uint8* uplane, | 467 uint8* uplane, |
| 468 uint8* vplane, | 468 uint8* vplane, |
| 469 int width, | 469 int width, |
| 470 int height, | 470 int height, |
| 471 int rgbstride, | 471 int rgbstride, |
| 472 int ystride, | 472 int ystride, |
| 473 int uvstride) { | 473 int uvstride) { |
| 474 #if defined(ARCH_CPU_ARM_FAMILY) | 474 #if defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY) |
| 475 ConvertRGB24ToYUV_C(rgbframe, yplane, uplane, vplane, width, height, | 475 ConvertRGB24ToYUV_C(rgbframe, yplane, uplane, vplane, width, height, |
| 476 rgbstride, ystride, uvstride); | 476 rgbstride, ystride, uvstride); |
| 477 #else | 477 #else |
| 478 static void (*convert_proc)(const uint8*, uint8*, uint8*, uint8*, | 478 static void (*convert_proc)(const uint8*, uint8*, uint8*, uint8*, |
| 479 int, int, int, int, int) = NULL; | 479 int, int, int, int, int) = NULL; |
| 480 if (!convert_proc) { | 480 if (!convert_proc) { |
| 481 base::CPU cpu; | 481 base::CPU cpu; |
| 482 if (cpu.has_ssse3()) | 482 if (cpu.has_ssse3()) |
| 483 convert_proc = &ConvertRGB24ToYUV_SSSE3; | 483 convert_proc = &ConvertRGB24ToYUV_SSSE3; |
| 484 else | 484 else |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 void ConvertYUVToRGB32(const uint8* yplane, | 535 void ConvertYUVToRGB32(const uint8* yplane, |
| 536 const uint8* uplane, | 536 const uint8* uplane, |
| 537 const uint8* vplane, | 537 const uint8* vplane, |
| 538 uint8* rgbframe, | 538 uint8* rgbframe, |
| 539 int width, | 539 int width, |
| 540 int height, | 540 int height, |
| 541 int ystride, | 541 int ystride, |
| 542 int uvstride, | 542 int uvstride, |
| 543 int rgbstride, | 543 int rgbstride, |
| 544 YUVType yuv_type) { | 544 YUVType yuv_type) { |
| 545 #if defined(ARCH_CPU_ARM_FAMILY) | 545 #if defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY) |
| 546 ConvertYUVToRGB32_C(yplane, uplane, vplane, rgbframe, | 546 ConvertYUVToRGB32_C(yplane, uplane, vplane, rgbframe, |
| 547 width, height, ystride, uvstride, rgbstride, yuv_type); | 547 width, height, ystride, uvstride, rgbstride, yuv_type); |
| 548 #else | 548 #else |
| 549 static ConvertYUVToRGB32Proc convert_proc = NULL; | 549 static ConvertYUVToRGB32Proc convert_proc = NULL; |
| 550 if (!convert_proc) { | 550 if (!convert_proc) { |
| 551 base::CPU cpu; | 551 base::CPU cpu; |
| 552 if (cpu.has_sse()) | 552 if (cpu.has_sse()) |
| 553 convert_proc = &ConvertYUVToRGB32_SSE; | 553 convert_proc = &ConvertYUVToRGB32_SSE; |
| 554 else if (cpu.has_mmx()) | 554 else if (cpu.has_mmx()) |
| 555 convert_proc = &ConvertYUVToRGB32_MMX; | 555 convert_proc = &ConvertYUVToRGB32_MMX; |
| 556 else | 556 else |
| 557 convert_proc = &ConvertYUVToRGB32_C; | 557 convert_proc = &ConvertYUVToRGB32_C; |
| 558 } | 558 } |
| 559 | 559 |
| 560 convert_proc(yplane, uplane, vplane, rgbframe, | 560 convert_proc(yplane, uplane, vplane, rgbframe, |
| 561 width, height, ystride, uvstride, rgbstride, yuv_type); | 561 width, height, ystride, uvstride, rgbstride, yuv_type); |
| 562 #endif | 562 #endif |
| 563 } | 563 } |
| 564 | 564 |
| 565 } // namespace media | 565 } // namespace media |
| OLD | NEW |