17cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde/*
233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
37cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *
47cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  Use of this source code is governed by a BSD-style license
57cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  that can be found in the LICENSE file in the root of the source
67cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  tree. An additional intellectual property rights grant can be found
77cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  in the file PATENTS.  All contributing project authors may
87cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde *  be found in the AUTHORS file in the root of the source tree.
97cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde */
107cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
1133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#ifndef INCLUDE_LIBYUV_SCALE_H_  // NOLINT
127cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde#define INCLUDE_LIBYUV_SCALE_H_
137cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
147cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde#include "libyuv/basic_types.h"
157cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
1633cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#ifdef __cplusplus
177cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordenamespace libyuv {
1833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampextern "C" {
1933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
207cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
217cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// Supported filtering
227cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordeenum FilterMode {
2333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  kFilterNone = 0,  // Point sample; Fastest.
247cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde  kFilterBilinear = 1,  // Faster than box, but lower quality scaling down.
2533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp  kFilterBox = 2  // Highest quality.
267cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde};
277cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
2833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Scale a YUV plane.
2933cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
3033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampvoid ScalePlane(const uint8* src, int src_stride,
3133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                int src_width, int src_height,
3233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                uint8* dst, int dst_stride,
3333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                int dst_width, int dst_height,
3433cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                FilterMode filtering);
3533cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
367cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// Scales a YUV 4:2:0 image from the src width and height to the
377cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// dst width and height.
387cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// If filtering is kFilterNone, a simple nearest-neighbor algorithm is
397cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// used. This produces basic (blocky) quality at the fastest speed.
407cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// If filtering is kFilterBilinear, interpolation is used to produce a better
417cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// quality image, at the expense of speed.
427cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// If filtering is kFilterBox, averaging is used to produce ever better
437cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// quality image, at further expense of speed.
447cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde// Returns 0 if successful.
457cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
4633cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
477cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordeint I420Scale(const uint8* src_y, int src_stride_y,
487cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde              const uint8* src_u, int src_stride_u,
497cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde              const uint8* src_v, int src_stride_v,
507cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde              int src_width, int src_height,
517cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde              uint8* dst_y, int dst_stride_y,
527cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde              uint8* dst_u, int dst_stride_u,
537cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde              uint8* dst_v, int dst_stride_v,
547cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde              int dst_width, int dst_height,
557cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde              FilterMode filtering);
567cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
5733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Legacy API.  Deprecated.
5833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
597cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordeint Scale(const uint8* src_y, const uint8* src_u, const uint8* src_v,
607cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde          int src_stride_y, int src_stride_u, int src_stride_v,
617cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde          int src_width, int src_height,
627cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde          uint8* dst_y, uint8* dst_u, uint8* dst_v,
637cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde          int dst_stride_y, int dst_stride_u, int dst_stride_v,
647cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde          int dst_width, int dst_height,
657cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde          bool interpolate);
667cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
6733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// Legacy API.  Deprecated.
6833cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
6933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkampint ScaleOffset(const uint8* src, int src_width, int src_height,
7033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                uint8* dst, int dst_width, int dst_height, int dst_yoffset,
7133cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp                bool interpolate);
7233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp
7333cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp// For testing, allow disabling of specialized scalers.
7433cfdeb7b267ab635413797fffb046b73272f7ecHendrik DahlkampLIBYUV_API
757cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Bordevoid SetUseReferenceImpl(bool use);
767cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
7733cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#ifdef __cplusplus
7833cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}  // extern "C"
7933cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp}  // namespace libyuv
8033cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif
817cd8149e2cbad8b1ff6d481c37a4775d3c8cf2faShri Borde
8233cfdeb7b267ab635413797fffb046b73272f7ecHendrik Dahlkamp#endif  // INCLUDE_LIBYUV_SCALE_H_  NOLINT
83