• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
3  *
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
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS. All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef INCLUDE_LIBYUV_SCALE_H_
12 #define INCLUDE_LIBYUV_SCALE_H_
13 
14 #include "libyuv/basic_types.h"
15 
16 #ifdef __cplusplus
17 namespace libyuv {
18 extern "C" {
19 #endif
20 
21 // Supported filtering.
22 typedef enum FilterMode {
23   kFilterNone = 0,      // Point sample; Fastest.
24   kFilterLinear = 1,    // Filter horizontally only.
25   kFilterBilinear = 2,  // Faster than box, but lower quality scaling down.
26   kFilterBox = 3        // Highest quality.
27 } FilterModeEnum;
28 
29 // Scale a YUV plane.
30 // Returns 0 if successful.
31 LIBYUV_API
32 int ScalePlane(const uint8_t* src,
33                int src_stride,
34                int src_width,
35                int src_height,
36                uint8_t* dst,
37                int dst_stride,
38                int dst_width,
39                int dst_height,
40                enum FilterMode filtering);
41 
42 LIBYUV_API
43 int ScalePlane_16(const uint16_t* src,
44                   int src_stride,
45                   int src_width,
46                   int src_height,
47                   uint16_t* dst,
48                   int dst_stride,
49                   int dst_width,
50                   int dst_height,
51                   enum FilterMode filtering);
52 
53 // Sample is expected to be in the low 12 bits.
54 LIBYUV_API
55 int ScalePlane_12(const uint16_t* src,
56                   int src_stride,
57                   int src_width,
58                   int src_height,
59                   uint16_t* dst,
60                   int dst_stride,
61                   int dst_width,
62                   int dst_height,
63                   enum FilterMode filtering);
64 
65 // Scales a YUV 4:2:0 image from the src width and height to the
66 // dst width and height.
67 // If filtering is kFilterNone, a simple nearest-neighbor algorithm is
68 // used. This produces basic (blocky) quality at the fastest speed.
69 // If filtering is kFilterBilinear, interpolation is used to produce a better
70 // quality image, at the expense of speed.
71 // If filtering is kFilterBox, averaging is used to produce ever better
72 // quality image, at further expense of speed.
73 // Returns 0 if successful.
74 
75 LIBYUV_API
76 int I420Scale(const uint8_t* src_y,
77               int src_stride_y,
78               const uint8_t* src_u,
79               int src_stride_u,
80               const uint8_t* src_v,
81               int src_stride_v,
82               int src_width,
83               int src_height,
84               uint8_t* dst_y,
85               int dst_stride_y,
86               uint8_t* dst_u,
87               int dst_stride_u,
88               uint8_t* dst_v,
89               int dst_stride_v,
90               int dst_width,
91               int dst_height,
92               enum FilterMode filtering);
93 
94 LIBYUV_API
95 int I420Scale_16(const uint16_t* src_y,
96                  int src_stride_y,
97                  const uint16_t* src_u,
98                  int src_stride_u,
99                  const uint16_t* src_v,
100                  int src_stride_v,
101                  int src_width,
102                  int src_height,
103                  uint16_t* dst_y,
104                  int dst_stride_y,
105                  uint16_t* dst_u,
106                  int dst_stride_u,
107                  uint16_t* dst_v,
108                  int dst_stride_v,
109                  int dst_width,
110                  int dst_height,
111                  enum FilterMode filtering);
112 
113 LIBYUV_API
114 int I420Scale_12(const uint16_t* src_y,
115                  int src_stride_y,
116                  const uint16_t* src_u,
117                  int src_stride_u,
118                  const uint16_t* src_v,
119                  int src_stride_v,
120                  int src_width,
121                  int src_height,
122                  uint16_t* dst_y,
123                  int dst_stride_y,
124                  uint16_t* dst_u,
125                  int dst_stride_u,
126                  uint16_t* dst_v,
127                  int dst_stride_v,
128                  int dst_width,
129                  int dst_height,
130                  enum FilterMode filtering);
131 
132 // Scales a YUV 4:4:4 image from the src width and height to the
133 // dst width and height.
134 // If filtering is kFilterNone, a simple nearest-neighbor algorithm is
135 // used. This produces basic (blocky) quality at the fastest speed.
136 // If filtering is kFilterBilinear, interpolation is used to produce a better
137 // quality image, at the expense of speed.
138 // If filtering is kFilterBox, averaging is used to produce ever better
139 // quality image, at further expense of speed.
140 // Returns 0 if successful.
141 
142 LIBYUV_API
143 int I444Scale(const uint8_t* src_y,
144               int src_stride_y,
145               const uint8_t* src_u,
146               int src_stride_u,
147               const uint8_t* src_v,
148               int src_stride_v,
149               int src_width,
150               int src_height,
151               uint8_t* dst_y,
152               int dst_stride_y,
153               uint8_t* dst_u,
154               int dst_stride_u,
155               uint8_t* dst_v,
156               int dst_stride_v,
157               int dst_width,
158               int dst_height,
159               enum FilterMode filtering);
160 
161 LIBYUV_API
162 int I444Scale_16(const uint16_t* src_y,
163                  int src_stride_y,
164                  const uint16_t* src_u,
165                  int src_stride_u,
166                  const uint16_t* src_v,
167                  int src_stride_v,
168                  int src_width,
169                  int src_height,
170                  uint16_t* dst_y,
171                  int dst_stride_y,
172                  uint16_t* dst_u,
173                  int dst_stride_u,
174                  uint16_t* dst_v,
175                  int dst_stride_v,
176                  int dst_width,
177                  int dst_height,
178                  enum FilterMode filtering);
179 
180 LIBYUV_API
181 int I444Scale_12(const uint16_t* src_y,
182                  int src_stride_y,
183                  const uint16_t* src_u,
184                  int src_stride_u,
185                  const uint16_t* src_v,
186                  int src_stride_v,
187                  int src_width,
188                  int src_height,
189                  uint16_t* dst_y,
190                  int dst_stride_y,
191                  uint16_t* dst_u,
192                  int dst_stride_u,
193                  uint16_t* dst_v,
194                  int dst_stride_v,
195                  int dst_width,
196                  int dst_height,
197                  enum FilterMode filtering);
198 
199 // Scales a YUV 4:2:2 image from the src width and height to the
200 // dst width and height.
201 // If filtering is kFilterNone, a simple nearest-neighbor algorithm is
202 // used. This produces basic (blocky) quality at the fastest speed.
203 // If filtering is kFilterBilinear, interpolation is used to produce a better
204 // quality image, at the expense of speed.
205 // If filtering is kFilterBox, averaging is used to produce ever better
206 // quality image, at further expense of speed.
207 // Returns 0 if successful.
208 LIBYUV_API
209 int I422Scale(const uint8_t* src_y,
210               int src_stride_y,
211               const uint8_t* src_u,
212               int src_stride_u,
213               const uint8_t* src_v,
214               int src_stride_v,
215               int src_width,
216               int src_height,
217               uint8_t* dst_y,
218               int dst_stride_y,
219               uint8_t* dst_u,
220               int dst_stride_u,
221               uint8_t* dst_v,
222               int dst_stride_v,
223               int dst_width,
224               int dst_height,
225               enum FilterMode filtering);
226 
227 LIBYUV_API
228 int I422Scale_16(const uint16_t* src_y,
229                  int src_stride_y,
230                  const uint16_t* src_u,
231                  int src_stride_u,
232                  const uint16_t* src_v,
233                  int src_stride_v,
234                  int src_width,
235                  int src_height,
236                  uint16_t* dst_y,
237                  int dst_stride_y,
238                  uint16_t* dst_u,
239                  int dst_stride_u,
240                  uint16_t* dst_v,
241                  int dst_stride_v,
242                  int dst_width,
243                  int dst_height,
244                  enum FilterMode filtering);
245 
246 LIBYUV_API
247 int I422Scale_12(const uint16_t* src_y,
248                  int src_stride_y,
249                  const uint16_t* src_u,
250                  int src_stride_u,
251                  const uint16_t* src_v,
252                  int src_stride_v,
253                  int src_width,
254                  int src_height,
255                  uint16_t* dst_y,
256                  int dst_stride_y,
257                  uint16_t* dst_u,
258                  int dst_stride_u,
259                  uint16_t* dst_v,
260                  int dst_stride_v,
261                  int dst_width,
262                  int dst_height,
263                  enum FilterMode filtering);
264 
265 // Scales an NV12 image from the src width and height to the
266 // dst width and height.
267 // If filtering is kFilterNone, a simple nearest-neighbor algorithm is
268 // used. This produces basic (blocky) quality at the fastest speed.
269 // If filtering is kFilterBilinear, interpolation is used to produce a better
270 // quality image, at the expense of speed.
271 // kFilterBox is not supported for the UV channel and will be treated as
272 // bilinear.
273 // Returns 0 if successful.
274 
275 LIBYUV_API
276 int NV12Scale(const uint8_t* src_y,
277               int src_stride_y,
278               const uint8_t* src_uv,
279               int src_stride_uv,
280               int src_width,
281               int src_height,
282               uint8_t* dst_y,
283               int dst_stride_y,
284               uint8_t* dst_uv,
285               int dst_stride_uv,
286               int dst_width,
287               int dst_height,
288               enum FilterMode filtering);
289 
290 #ifdef __cplusplus
291 // Legacy API.  Deprecated.
292 LIBYUV_API
293 int Scale(const uint8_t* src_y,
294           const uint8_t* src_u,
295           const uint8_t* src_v,
296           int src_stride_y,
297           int src_stride_u,
298           int src_stride_v,
299           int src_width,
300           int src_height,
301           uint8_t* dst_y,
302           uint8_t* dst_u,
303           uint8_t* dst_v,
304           int dst_stride_y,
305           int dst_stride_u,
306           int dst_stride_v,
307           int dst_width,
308           int dst_height,
309           LIBYUV_BOOL interpolate);
310 
311 // For testing, allow disabling of specialized scalers.
312 LIBYUV_API
313 void SetUseReferenceImpl(LIBYUV_BOOL use);
314 #endif  // __cplusplus
315 
316 #ifdef __cplusplus
317 }  // extern "C"
318 }  // namespace libyuv
319 #endif
320 
321 #endif  // INCLUDE_LIBYUV_SCALE_H_
322