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 #ifndef MEDIA_BASE_YUV_CONVERT_H_ | 5 #ifndef MEDIA_BASE_YUV_CONVERT_H_ |
6 #define MEDIA_BASE_YUV_CONVERT_H_ | 6 #define MEDIA_BASE_YUV_CONVERT_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include <stdint.h> |
| 9 |
9 #include "media/base/media_export.h" | 10 #include "media/base/media_export.h" |
10 | 11 |
11 // Visual Studio 2010 does not support MMX intrinsics on x64. | 12 // Visual Studio 2010 does not support MMX intrinsics on x64. |
12 // Some win64 yuv_convert code paths use SSE+MMX yasm, so without rewriting | 13 // Some win64 yuv_convert code paths use SSE+MMX yasm, so without rewriting |
13 // them, we use yasm EmptyRegisterState_MMX in place of _mm_empty() or | 14 // them, we use yasm EmptyRegisterState_MMX in place of _mm_empty() or |
14 // hide the versions implemented with heavy use of MMX intrinsics. | 15 // hide the versions implemented with heavy use of MMX intrinsics. |
15 // TODO(wolenetz): Use MMX intrinsics when compiling win64 with Visual | 16 // TODO(wolenetz): Use MMX intrinsics when compiling win64 with Visual |
16 // Studio 2012? http://crbug.com/173450 | 17 // Studio 2012? http://crbug.com/173450 |
17 #if defined(ARCH_CPU_X86_FAMILY) && \ | 18 #if defined(ARCH_CPU_X86_FAMILY) && \ |
18 !(defined(ARCH_CPU_X86_64) && defined(COMPILER_MSVC)) | 19 !(defined(ARCH_CPU_X86_64) && defined(COMPILER_MSVC)) |
19 #define MEDIA_MMX_INTRINSICS_AVAILABLE | 20 #define MEDIA_MMX_INTRINSICS_AVAILABLE |
20 #endif | 21 #endif |
21 | 22 |
22 namespace media { | 23 namespace media { |
23 | 24 |
24 // Type of YUV surface. | 25 // Type of YUV surface. |
25 enum YUVType { | 26 enum YUVType { |
26 YV16 = 0, // YV16 is half width and full height chroma channels. | 27 YV16 = 0, // YV16 is half width and full height chroma channels. |
27 YV12 = 1, // YV12 is half width and half height chroma channels. | 28 YV12 = 1, // YV12 is half width and half height chroma channels. |
28 YV12J = 2, // YV12J is the same as YV12, but in JPEG color range. | 29 YV12J = 2, // YV12J is the same as YV12, but in JPEG color range. |
29 YV12HD = 3, // YV12HD is the same as YV12, but in 'HD' Rec709 color space. | 30 YV12HD = 3, // YV12HD is the same as YV12, but in 'HD' Rec709 color space. |
30 }; | 31 }; |
31 | 32 |
32 // Get the appropriate value to bitshift by for vertical indices. | 33 // Get the appropriate value to bitshift by for vertical indices. |
33 MEDIA_EXPORT int GetVerticalShift(YUVType type); | 34 MEDIA_EXPORT int GetVerticalShift(YUVType type); |
34 | 35 |
35 // Get the appropriate lookup table for a given YUV format. | 36 // Get the appropriate lookup table for a given YUV format. |
36 MEDIA_EXPORT const int16* GetLookupTable(YUVType type); | 37 MEDIA_EXPORT const int16_t* GetLookupTable(YUVType type); |
37 | 38 |
38 // Mirror means flip the image horizontally, as in looking in a mirror. | 39 // Mirror means flip the image horizontally, as in looking in a mirror. |
39 // Rotate happens after mirroring. | 40 // Rotate happens after mirroring. |
40 enum Rotate { | 41 enum Rotate { |
41 ROTATE_0, // Rotation off. | 42 ROTATE_0, // Rotation off. |
42 ROTATE_90, // Rotate clockwise. | 43 ROTATE_90, // Rotate clockwise. |
43 ROTATE_180, // Rotate upside down. | 44 ROTATE_180, // Rotate upside down. |
44 ROTATE_270, // Rotate counter clockwise. | 45 ROTATE_270, // Rotate counter clockwise. |
45 MIRROR_ROTATE_0, // Mirror horizontally. | 46 MIRROR_ROTATE_0, // Mirror horizontally. |
46 MIRROR_ROTATE_90, // Mirror then Rotate clockwise. | 47 MIRROR_ROTATE_90, // Mirror then Rotate clockwise. |
47 MIRROR_ROTATE_180, // Mirror vertically. | 48 MIRROR_ROTATE_180, // Mirror vertically. |
48 MIRROR_ROTATE_270, // Transpose. | 49 MIRROR_ROTATE_270, // Transpose. |
49 }; | 50 }; |
50 | 51 |
51 // Filter affects how scaling looks. | 52 // Filter affects how scaling looks. |
52 enum ScaleFilter { | 53 enum ScaleFilter { |
53 FILTER_NONE = 0, // No filter (point sampled). | 54 FILTER_NONE = 0, // No filter (point sampled). |
54 FILTER_BILINEAR_H = 1, // Bilinear horizontal filter. | 55 FILTER_BILINEAR_H = 1, // Bilinear horizontal filter. |
55 FILTER_BILINEAR_V = 2, // Bilinear vertical filter. | 56 FILTER_BILINEAR_V = 2, // Bilinear vertical filter. |
56 FILTER_BILINEAR = 3, // Bilinear filter. | 57 FILTER_BILINEAR = 3, // Bilinear filter. |
57 }; | 58 }; |
58 | 59 |
59 MEDIA_EXPORT void InitializeCPUSpecificYUVConversions(); | 60 MEDIA_EXPORT void InitializeCPUSpecificYUVConversions(); |
60 | 61 |
61 // Convert a frame of YUV to 32 bit ARGB. | 62 // Convert a frame of YUV to 32 bit ARGB. |
62 // Pass in YV16/YV12 depending on source format | 63 // Pass in YV16/YV12 depending on source format |
63 MEDIA_EXPORT void ConvertYUVToRGB32(const uint8* yplane, | 64 MEDIA_EXPORT void ConvertYUVToRGB32(const uint8_t* yplane, |
64 const uint8* uplane, | 65 const uint8_t* uplane, |
65 const uint8* vplane, | 66 const uint8_t* vplane, |
66 uint8* rgbframe, | 67 uint8_t* rgbframe, |
67 int width, | 68 int width, |
68 int height, | 69 int height, |
69 int ystride, | 70 int ystride, |
70 int uvstride, | 71 int uvstride, |
71 int rgbstride, | 72 int rgbstride, |
72 YUVType yuv_type); | 73 YUVType yuv_type); |
73 | 74 |
74 // Convert a frame of YUVA to 32 bit ARGB. | 75 // Convert a frame of YUVA to 32 bit ARGB. |
75 // Pass in YV12A | 76 // Pass in YV12A |
76 MEDIA_EXPORT void ConvertYUVAToARGB(const uint8* yplane, | 77 MEDIA_EXPORT void ConvertYUVAToARGB(const uint8_t* yplane, |
77 const uint8* uplane, | 78 const uint8_t* uplane, |
78 const uint8* vplane, | 79 const uint8_t* vplane, |
79 const uint8* aplane, | 80 const uint8_t* aplane, |
80 uint8* rgbframe, | 81 uint8_t* rgbframe, |
81 int width, | 82 int width, |
82 int height, | 83 int height, |
83 int ystride, | 84 int ystride, |
84 int uvstride, | 85 int uvstride, |
85 int astride, | 86 int astride, |
86 int rgbstride, | 87 int rgbstride, |
87 YUVType yuv_type); | 88 YUVType yuv_type); |
88 | 89 |
89 // Scale a frame of YUV to 32 bit ARGB. | 90 // Scale a frame of YUV to 32 bit ARGB. |
90 // Supports rotation and mirroring. | 91 // Supports rotation and mirroring. |
91 MEDIA_EXPORT void ScaleYUVToRGB32(const uint8* yplane, | 92 MEDIA_EXPORT void ScaleYUVToRGB32(const uint8_t* yplane, |
92 const uint8* uplane, | 93 const uint8_t* uplane, |
93 const uint8* vplane, | 94 const uint8_t* vplane, |
94 uint8* rgbframe, | 95 uint8_t* rgbframe, |
95 int source_width, | 96 int source_width, |
96 int source_height, | 97 int source_height, |
97 int width, | 98 int width, |
98 int height, | 99 int height, |
99 int ystride, | 100 int ystride, |
100 int uvstride, | 101 int uvstride, |
101 int rgbstride, | 102 int rgbstride, |
102 YUVType yuv_type, | 103 YUVType yuv_type, |
103 Rotate view_rotate, | 104 Rotate view_rotate, |
104 ScaleFilter filter); | 105 ScaleFilter filter); |
105 | 106 |
106 // Biliner Scale a frame of YV12 to 32 bits ARGB on a specified rectangle. | 107 // Biliner Scale a frame of YV12 to 32 bits ARGB on a specified rectangle. |
107 // |yplane|, etc and |rgbframe| should point to the top-left pixels of the | 108 // |yplane|, etc and |rgbframe| should point to the top-left pixels of the |
108 // source and destination buffers. | 109 // source and destination buffers. |
109 MEDIA_EXPORT void ScaleYUVToRGB32WithRect(const uint8* yplane, | 110 MEDIA_EXPORT void ScaleYUVToRGB32WithRect(const uint8_t* yplane, |
110 const uint8* uplane, | 111 const uint8_t* uplane, |
111 const uint8* vplane, | 112 const uint8_t* vplane, |
112 uint8* rgbframe, | 113 uint8_t* rgbframe, |
113 int source_width, | 114 int source_width, |
114 int source_height, | 115 int source_height, |
115 int dest_width, | 116 int dest_width, |
116 int dest_height, | 117 int dest_height, |
117 int dest_rect_left, | 118 int dest_rect_left, |
118 int dest_rect_top, | 119 int dest_rect_top, |
119 int dest_rect_right, | 120 int dest_rect_right, |
120 int dest_rect_bottom, | 121 int dest_rect_bottom, |
121 int ystride, | 122 int ystride, |
122 int uvstride, | 123 int uvstride, |
123 int rgbstride); | 124 int rgbstride); |
124 | 125 |
125 MEDIA_EXPORT void ConvertRGB32ToYUV(const uint8* rgbframe, | 126 MEDIA_EXPORT void ConvertRGB32ToYUV(const uint8_t* rgbframe, |
126 uint8* yplane, | 127 uint8_t* yplane, |
127 uint8* uplane, | 128 uint8_t* uplane, |
128 uint8* vplane, | 129 uint8_t* vplane, |
129 int width, | 130 int width, |
130 int height, | 131 int height, |
131 int rgbstride, | 132 int rgbstride, |
132 int ystride, | 133 int ystride, |
133 int uvstride); | 134 int uvstride); |
134 | 135 |
135 MEDIA_EXPORT void ConvertRGB24ToYUV(const uint8* rgbframe, | 136 MEDIA_EXPORT void ConvertRGB24ToYUV(const uint8_t* rgbframe, |
136 uint8* yplane, | 137 uint8_t* yplane, |
137 uint8* uplane, | 138 uint8_t* uplane, |
138 uint8* vplane, | 139 uint8_t* vplane, |
139 int width, | 140 int width, |
140 int height, | 141 int height, |
141 int rgbstride, | 142 int rgbstride, |
142 int ystride, | 143 int ystride, |
143 int uvstride); | 144 int uvstride); |
144 | 145 |
145 // Empty SIMD register state after calling optimized scaler functions. | 146 // Empty SIMD register state after calling optimized scaler functions. |
146 MEDIA_EXPORT void EmptyRegisterState(); | 147 MEDIA_EXPORT void EmptyRegisterState(); |
147 | 148 |
148 } // namespace media | 149 } // namespace media |
149 | 150 |
150 #endif // MEDIA_BASE_YUV_CONVERT_H_ | 151 #endif // MEDIA_BASE_YUV_CONVERT_H_ |
OLD | NEW |