| 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 15 matching lines...) Expand all Loading... |
| 26 #include "media/base/simd/filter_yuv.h" | 26 #include "media/base/simd/filter_yuv.h" |
| 27 | 27 |
| 28 #if defined(ARCH_CPU_X86_FAMILY) | 28 #if defined(ARCH_CPU_X86_FAMILY) |
| 29 #if defined(COMPILER_MSVC) | 29 #if defined(COMPILER_MSVC) |
| 30 #include <intrin.h> | 30 #include <intrin.h> |
| 31 #else | 31 #else |
| 32 #include <mmintrin.h> | 32 #include <mmintrin.h> |
| 33 #endif | 33 #endif |
| 34 #endif | 34 #endif |
| 35 | 35 |
| 36 // Visual Studio 2010 does not support MMX intrinsics on x64. |
| 37 // Some win64 yuv_convert code paths use SSE+MMX yasm, so without rewriting |
| 38 // them, we use yasm EmptyRegisterState_MMX in place of _mm_empty() or |
| 39 // hide the versions implemented with heavy use of MMX intrinsics. |
| 40 // TODO(wolenetz): Use MMX intrinsics when compiling win64 with Visual |
| 41 // Studio 2012? http://crbug.com/173450 |
| 42 #if !(defined(ARCH_CPU_X86_64) && defined(COMPILER_MSVC)) |
| 43 #define MEDIA_MMX_INTRINSICS_AVAILABLE |
| 44 #endif |
| 45 |
| 46 // Assembly functions are declared without namespace. |
| 47 extern "C" { |
| 48 void EmptyRegisterState_MMX(); |
| 49 } // extern "C" |
| 50 |
| 36 namespace media { | 51 namespace media { |
| 37 | 52 |
| 38 static FilterYUVRowsProc ChooseFilterYUVRowsProc() { | 53 static FilterYUVRowsProc ChooseFilterYUVRowsProc() { |
| 39 #if defined(ARCH_CPU_X86_FAMILY) | 54 #if defined(ARCH_CPU_X86_FAMILY) |
| 40 base::CPU cpu; | 55 base::CPU cpu; |
| 41 if (cpu.has_sse2()) | 56 if (cpu.has_sse2()) |
| 42 return &FilterYUVRows_SSE2; | 57 return &FilterYUVRows_SSE2; |
| 58 |
| 59 #if defined(MEDIA_MMX_INTRINSICS_AVAILABLE) |
| 43 if (cpu.has_mmx()) | 60 if (cpu.has_mmx()) |
| 44 return &FilterYUVRows_MMX; | 61 return &FilterYUVRows_MMX; |
| 45 #endif | 62 #endif // defined(MEDIA_MMX_INTRINSICS_AVAILABLE) |
| 63 #endif // defined(ARCH_CPU_X86_FAMILY) |
| 46 return &FilterYUVRows_C; | 64 return &FilterYUVRows_C; |
| 47 } | 65 } |
| 48 | 66 |
| 49 static ConvertYUVToRGB32RowProc ChooseConvertYUVToRGB32RowProc() { | 67 static ConvertYUVToRGB32RowProc ChooseConvertYUVToRGB32RowProc() { |
| 50 #if defined(ARCH_CPU_X86_FAMILY) | 68 #if defined(ARCH_CPU_X86_FAMILY) |
| 51 base::CPU cpu; | 69 base::CPU cpu; |
| 52 if (cpu.has_sse()) | 70 if (cpu.has_sse()) |
| 53 return &ConvertYUVToRGB32Row_SSE; | 71 return &ConvertYUVToRGB32Row_SSE; |
| 54 if (cpu.has_mmx()) | 72 if (cpu.has_mmx()) |
| 55 return &ConvertYUVToRGB32Row_MMX; | 73 return &ConvertYUVToRGB32Row_MMX; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 // Empty SIMD registers state after using them. | 108 // Empty SIMD registers state after using them. |
| 91 void EmptyRegisterState() { | 109 void EmptyRegisterState() { |
| 92 #if defined(ARCH_CPU_X86_FAMILY) | 110 #if defined(ARCH_CPU_X86_FAMILY) |
| 93 static bool checked = false; | 111 static bool checked = false; |
| 94 static bool has_mmx = false; | 112 static bool has_mmx = false; |
| 95 if (!checked) { | 113 if (!checked) { |
| 96 base::CPU cpu; | 114 base::CPU cpu; |
| 97 has_mmx = cpu.has_mmx(); | 115 has_mmx = cpu.has_mmx(); |
| 98 checked = true; | 116 checked = true; |
| 99 } | 117 } |
| 100 if (has_mmx) | 118 |
| 119 if (has_mmx) { |
| 120 #if defined(MEDIA_MMX_INTRINSICS_AVAILABLE) |
| 101 _mm_empty(); | 121 _mm_empty(); |
| 102 #endif | 122 #else |
| 123 EmptyRegisterState_MMX(); |
| 124 #endif // defined(MEDIA_MMX_INTRINSICS_AVAILABLE) |
| 125 } |
| 126 |
| 127 #endif // defined(ARCH_CPU_X86_FAMILY) |
| 103 } | 128 } |
| 104 | 129 |
| 105 // 16.16 fixed point arithmetic | 130 // 16.16 fixed point arithmetic |
| 106 const int kFractionBits = 16; | 131 const int kFractionBits = 16; |
| 107 const int kFractionMax = 1 << kFractionBits; | 132 const int kFractionMax = 1 << kFractionBits; |
| 108 const int kFractionMask = ((1 << kFractionBits) - 1); | 133 const int kFractionMask = ((1 << kFractionBits) - 1); |
| 109 | 134 |
| 110 // Scale a frame of YUV to 32 bit ARGB. | 135 // Scale a frame of YUV to 32 bit ARGB. |
| 111 void ScaleYUVToRGB32(const uint8* y_buf, | 136 void ScaleYUVToRGB32(const uint8* y_buf, |
| 112 const uint8* u_buf, | 137 const uint8* u_buf, |
| (...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 else | 607 else |
| 583 convert_proc = &ConvertYUVToRGB32_C; | 608 convert_proc = &ConvertYUVToRGB32_C; |
| 584 } | 609 } |
| 585 | 610 |
| 586 convert_proc(yplane, uplane, vplane, rgbframe, | 611 convert_proc(yplane, uplane, vplane, rgbframe, |
| 587 width, height, ystride, uvstride, rgbstride, yuv_type); | 612 width, height, ystride, uvstride, rgbstride, yuv_type); |
| 588 #endif | 613 #endif |
| 589 } | 614 } |
| 590 | 615 |
| 591 } // namespace media | 616 } // namespace media |
| OLD | NEW |