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
3// found in the LICENSE file.
4
5#ifndef MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
6#define MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
7
8#include "base/basictypes.h"
9#include "media/base/yuv_convert.h"
10
11namespace media {
12
13// These methods are exported for testing purposes only.  Library users should
14// only call the methods listed in yuv_convert.h.
15
16MEDIA_EXPORT void ConvertYUVToRGB32_C(const uint8* yplane,
17                                      const uint8* uplane,
18                                      const uint8* vplane,
19                                      uint8* rgbframe,
20                                      int width,
21                                      int height,
22                                      int ystride,
23                                      int uvstride,
24                                      int rgbstride,
25                                      YUVType yuv_type);
26
27MEDIA_EXPORT void ConvertYUVToRGB32Row_C(const uint8* yplane,
28                                         const uint8* uplane,
29                                         const uint8* vplane,
30                                         uint8* rgbframe,
31                                         ptrdiff_t width,
32                                         const int16 convert_table[1024][4]);
33
34MEDIA_EXPORT void ConvertYUVAToARGB_C(const uint8* yplane,
35                                      const uint8* uplane,
36                                      const uint8* vplane,
37                                      const uint8* aplane,
38                                      uint8* rgbframe,
39                                      int width,
40                                      int height,
41                                      int ystride,
42                                      int uvstride,
43                                      int avstride,
44                                      int rgbstride,
45                                      YUVType yuv_type);
46
47MEDIA_EXPORT void ConvertYUVAToARGBRow_C(const uint8* yplane,
48                                         const uint8* uplane,
49                                         const uint8* vplane,
50                                         const uint8* aplane,
51                                         uint8* rgbframe,
52                                         ptrdiff_t width,
53                                         const int16 convert_table[1024][4]);
54
55MEDIA_EXPORT void ConvertYUVToRGB32_SSE(const uint8* yplane,
56                                        const uint8* uplane,
57                                        const uint8* vplane,
58                                        uint8* rgbframe,
59                                        int width,
60                                        int height,
61                                        int ystride,
62                                        int uvstride,
63                                        int rgbstride,
64                                        YUVType yuv_type);
65
66MEDIA_EXPORT void ConvertYUVAToARGB_MMX(const uint8* yplane,
67                                        const uint8* uplane,
68                                        const uint8* vplane,
69                                        const uint8* aplane,
70                                        uint8* rgbframe,
71                                        int width,
72                                        int height,
73                                        int ystride,
74                                        int uvstride,
75                                        int avstride,
76                                        int rgbstride,
77                                        YUVType yuv_type);
78
79MEDIA_EXPORT void ScaleYUVToRGB32Row_C(const uint8* y_buf,
80                                       const uint8* u_buf,
81                                       const uint8* v_buf,
82                                       uint8* rgb_buf,
83                                       ptrdiff_t width,
84                                       ptrdiff_t source_dx,
85                                       const int16 convert_table[1024][4]);
86
87MEDIA_EXPORT void LinearScaleYUVToRGB32Row_C(
88    const uint8* y_buf,
89    const uint8* u_buf,
90    const uint8* v_buf,
91    uint8* rgb_buf,
92    ptrdiff_t width,
93    ptrdiff_t source_dx,
94    const int16 convert_table[1024][4]);
95
96MEDIA_EXPORT void LinearScaleYUVToRGB32RowWithRange_C(
97    const uint8* y_buf,
98    const uint8* u_buf,
99    const uint8* v_buf,
100    uint8* rgb_buf,
101    int dest_width,
102    int source_x,
103    int source_dx,
104    const int16 convert_table[1024][4]);
105
106}  // namespace media
107
108// Assembly functions are declared without namespace.
109extern "C" {
110
111// We use ptrdiff_t instead of int for yasm routine parameters to portably
112// sign-extend int. On Win64, MSVC does not sign-extend the value in the stack
113// home of int function parameters, and yasm routines are unaware of this lack
114// of extension and fault.  ptrdiff_t is portably sign-extended and fixes this
115// issue on at least Win64.  The C-equivalent RowProc versions' prototypes
116// include the same change to ptrdiff_t to reuse the typedefs.
117
118MEDIA_EXPORT void ConvertYUVAToARGBRow_MMX(const uint8* yplane,
119                                           const uint8* uplane,
120                                           const uint8* vplane,
121                                           const uint8* aplane,
122                                           uint8* rgbframe,
123                                           ptrdiff_t width,
124                                           const int16 convert_table[1024][4]);
125
126MEDIA_EXPORT void ConvertYUVToRGB32Row_SSE(const uint8* yplane,
127                                           const uint8* uplane,
128                                           const uint8* vplane,
129                                           uint8* rgbframe,
130                                           ptrdiff_t width,
131                                           const int16 convert_table[1024][4]);
132
133MEDIA_EXPORT void ScaleYUVToRGB32Row_SSE(const uint8* y_buf,
134                                         const uint8* u_buf,
135                                         const uint8* v_buf,
136                                         uint8* rgb_buf,
137                                         ptrdiff_t width,
138                                         ptrdiff_t source_dx,
139                                         const int16 convert_table[1024][4]);
140
141MEDIA_EXPORT void ScaleYUVToRGB32Row_SSE2_X64(
142    const uint8* y_buf,
143    const uint8* u_buf,
144    const uint8* v_buf,
145    uint8* rgb_buf,
146    ptrdiff_t width,
147    ptrdiff_t source_dx,
148    const int16 convert_table[1024][4]);
149
150MEDIA_EXPORT void LinearScaleYUVToRGB32Row_SSE(
151    const uint8* y_buf,
152    const uint8* u_buf,
153    const uint8* v_buf,
154    uint8* rgb_buf,
155    ptrdiff_t width,
156    ptrdiff_t source_dx,
157    const int16 convert_table[1024][4]);
158
159MEDIA_EXPORT void LinearScaleYUVToRGB32Row_MMX_X64(
160    const uint8* y_buf,
161    const uint8* u_buf,
162    const uint8* v_buf,
163    uint8* rgb_buf,
164    ptrdiff_t width,
165    ptrdiff_t source_dx,
166    const int16 convert_table[1024][4]);
167
168}  // extern "C"
169
170#endif  // MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
171