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