1ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian/*
2ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
3ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *
4ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
5ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
6ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
7ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  in the file PATENTS. All contributing project authors may
8ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
9ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian */
10ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
11ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifndef INCLUDE_LIBYUV_PLANAR_FUNCTIONS_H_  // NOLINT
12ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define INCLUDE_LIBYUV_PLANAR_FUNCTIONS_H_
13ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
14ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "libyuv/basic_types.h"
15ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
16ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// TODO(fbarchard): Remove the following headers includes.
17ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "libyuv/convert.h"
18ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "libyuv/convert_argb.h"
19ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
20ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifdef __cplusplus
21ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniannamespace libyuv {
22ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianextern "C" {
23ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
24ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Copy a plane of data.
26ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
27ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid CopyPlane(const uint8* src_y, int src_stride_y,
28ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
29ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
30ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
31ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
32ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid CopyPlane_16(const uint16* src_y, int src_stride_y,
33ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                  uint16* dst_y, int dst_stride_y,
34ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                  int width, int height);
35ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
36ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Set a plane of data to a 32 bit value.
37ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
38ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid SetPlane(uint8* dst_y, int dst_stride_y,
39ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              int width, int height,
40ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              uint32 value);
41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
427bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Split interleaved UV plane into separate U and V planes.
437bc9febe8749e98a3812a0dc4380ceae75c29450JohannLIBYUV_API
447bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid SplitUVPlane(const uint8* src_uv, int src_stride_uv,
457bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  uint8* dst_u, int dst_stride_u,
467bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  uint8* dst_v, int dst_stride_v,
477bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  int width, int height);
487bc9febe8749e98a3812a0dc4380ceae75c29450Johann
497bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Merge separate U and V planes into one interleaved UV plane.
507bc9febe8749e98a3812a0dc4380ceae75c29450JohannLIBYUV_API
517bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid MergeUVPlane(const uint8* src_u, int src_stride_u,
527bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  const uint8* src_v, int src_stride_v,
537bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  uint8* dst_uv, int dst_stride_uv,
547bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  int width, int height);
557bc9febe8749e98a3812a0dc4380ceae75c29450Johann
56ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Copy I400.  Supports inverting.
57ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
58ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I400ToI400(const uint8* src_y, int src_stride_y,
59ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
60ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
61ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
62da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#define J400ToJ400 I400ToI400
63ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
64ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Copy I422 to I422.
65ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define I422ToI422 I422Copy
66ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
67ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I422Copy(const uint8* src_y, int src_stride_y,
68ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             const uint8* src_u, int src_stride_u,
69ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             const uint8* src_v, int src_stride_v,
70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_y, int dst_stride_y,
71ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_u, int dst_stride_u,
72ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_v, int dst_stride_v,
73ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int width, int height);
74ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
75ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Copy I444 to I444.
76ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define I444ToI444 I444Copy
77ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
78ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I444Copy(const uint8* src_y, int src_stride_y,
79ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             const uint8* src_u, int src_stride_u,
80ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             const uint8* src_v, int src_stride_v,
81ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_y, int dst_stride_y,
82ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_u, int dst_stride_u,
83ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_v, int dst_stride_v,
84ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int width, int height);
85ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
86ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert YUY2 to I422.
87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
88ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint YUY2ToI422(const uint8* src_yuy2, int src_stride_yuy2,
89ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
90ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_u, int dst_stride_u,
91ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_v, int dst_stride_v,
92ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
93ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
94ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert UYVY to I422.
95ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
96ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint UYVYToI422(const uint8* src_uyvy, int src_stride_uyvy,
97ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
98ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_u, int dst_stride_u,
99ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_v, int dst_stride_v,
100ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
101ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
102da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianLIBYUV_API
103da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianint YUY2ToNV12(const uint8* src_yuy2, int src_stride_yuy2,
104da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
105da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian               uint8* dst_uv, int dst_stride_uv,
106da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian               int width, int height);
107da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
108da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianLIBYUV_API
109da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianint UYVYToNV12(const uint8* src_uyvy, int src_stride_uyvy,
110da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
111da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian               uint8* dst_uv, int dst_stride_uv,
112da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian               int width, int height);
113da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
114ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert I420 to I400. (calls CopyPlane ignoring u/v).
115ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
116ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I420ToI400(const uint8* src_y, int src_stride_y,
117ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_u, int src_stride_u,
118ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_v, int src_stride_v,
119ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
120ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
121ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
122ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Alias
123da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#define J420ToJ400 I420ToI400
124ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define I420ToI420Mirror I420Mirror
125ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
126ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// I420 mirror.
127ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
128ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I420Mirror(const uint8* src_y, int src_stride_y,
129ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_u, int src_stride_u,
130ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_v, int src_stride_v,
131ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
132ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_u, int dst_stride_u,
133ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_v, int dst_stride_v,
134ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
135ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
136ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Alias
137ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define I400ToI400Mirror I400Mirror
138ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
139ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// I400 mirror.  A single plane is mirrored horizontally.
140ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Pass negative height to achieve 180 degree rotation.
141ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
142ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I400Mirror(const uint8* src_y, int src_stride_y,
143ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_y, int dst_stride_y,
144ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
145ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
146ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Alias
147ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define ARGBToARGBMirror ARGBMirror
148ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
149ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// ARGB mirror.
150ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
151ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBMirror(const uint8* src_argb, int src_stride_argb,
152ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_argb, int dst_stride_argb,
153ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
154ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
155ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert NV12 to RGB565.
156ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
157ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint NV12ToRGB565(const uint8* src_y, int src_stride_y,
158ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 const uint8* src_uv, int src_stride_uv,
159ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 uint8* dst_rgb565, int dst_stride_rgb565,
160ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 int width, int height);
161ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
162ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// I422ToARGB is in convert_argb.h
163ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert I422 to BGRA.
164ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
165ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I422ToBGRA(const uint8* src_y, int src_stride_y,
166ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_u, int src_stride_u,
167ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_v, int src_stride_v,
168ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_bgra, int dst_stride_bgra,
169ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
170ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
171ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert I422 to ABGR.
172ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
173ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I422ToABGR(const uint8* src_y, int src_stride_y,
174ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_u, int src_stride_u,
175ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_v, int src_stride_v,
176ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_abgr, int dst_stride_abgr,
177ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
178ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
179ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert I422 to RGBA.
180ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
181ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I422ToRGBA(const uint8* src_y, int src_stride_y,
182ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_u, int src_stride_u,
183ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_v, int src_stride_v,
184ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_rgba, int dst_stride_rgba,
185ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
186ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Alias
1887bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define RGB24ToRAW RAWToRGB24
1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann
1907bc9febe8749e98a3812a0dc4380ceae75c29450JohannLIBYUV_API
1917bc9febe8749e98a3812a0dc4380ceae75c29450Johannint RAWToRGB24(const uint8* src_raw, int src_stride_raw,
1927bc9febe8749e98a3812a0dc4380ceae75c29450Johann               uint8* dst_rgb24, int dst_stride_rgb24,
1937bc9febe8749e98a3812a0dc4380ceae75c29450Johann               int width, int height);
1947bc9febe8749e98a3812a0dc4380ceae75c29450Johann
195ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Draw a rectangle into I420.
196ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
197ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I420Rect(uint8* dst_y, int dst_stride_y,
198ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_u, int dst_stride_u,
199ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_v, int dst_stride_v,
200ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int x, int y, int width, int height,
201ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int value_y, int value_u, int value_v);
202ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
203ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Draw a rectangle into ARGB.
204ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
205ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBRect(uint8* dst_argb, int dst_stride_argb,
206ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int x, int y, int width, int height, uint32 value);
207ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
208ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert ARGB to gray scale ARGB.
209ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
210ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBGrayTo(const uint8* src_argb, int src_stride_argb,
211ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_argb, int dst_stride_argb,
212ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
213ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
214ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Make a rectangle of ARGB gray scale.
215ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
216ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBGray(uint8* dst_argb, int dst_stride_argb,
217ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int x, int y, int width, int height);
218ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
219ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Make a rectangle of ARGB Sepia tone.
220ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
221ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBSepia(uint8* dst_argb, int dst_stride_argb,
222ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              int x, int y, int width, int height);
223ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
224ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Apply a matrix rotation to each ARGB pixel.
225ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// matrix_argb is 4 signed ARGB values. -128 to 127 representing -2 to 2.
226ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// The first 4 coefficients apply to B, G, R, A and produce B of the output.
227ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// The next 4 coefficients apply to B, G, R, A and produce G of the output.
228ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// The next 4 coefficients apply to B, G, R, A and produce R of the output.
229ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// The last 4 coefficients apply to B, G, R, A and produce A of the output.
230ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
231ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBColorMatrix(const uint8* src_argb, int src_stride_argb,
232ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                    uint8* dst_argb, int dst_stride_argb,
233ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                    const int8* matrix_argb,
234ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                    int width, int height);
235ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
236ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Deprecated. Use ARGBColorMatrix instead.
237ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Apply a matrix rotation to each ARGB pixel.
238ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// matrix_argb is 3 signed ARGB values. -128 to 127 representing -1 to 1.
239ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// The first 4 coefficients apply to B, G, R, A and produce B of the output.
240ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// The next 4 coefficients apply to B, G, R, A and produce G of the output.
241ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// The last 4 coefficients apply to B, G, R, A and produce R of the output.
242ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
243ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint RGBColorMatrix(uint8* dst_argb, int dst_stride_argb,
244ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                   const int8* matrix_rgb,
245ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                   int x, int y, int width, int height);
246ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
247ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Apply a color table each ARGB pixel.
248ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Table contains 256 ARGB values.
249ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
250ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBColorTable(uint8* dst_argb, int dst_stride_argb,
251ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                   const uint8* table_argb,
252ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                   int x, int y, int width, int height);
253ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
254ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Apply a color table each ARGB pixel but preserve destination alpha.
255ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Table contains 256 ARGB values.
256ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
257ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint RGBColorTable(uint8* dst_argb, int dst_stride_argb,
258ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                  const uint8* table_argb,
259ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                  int x, int y, int width, int height);
260ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
261ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Apply a luma/color table each ARGB pixel but preserve destination alpha.
262ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Table contains 32768 values indexed by [Y][C] where 7 it 7 bit luma from
263ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// RGB (YJ style) and C is an 8 bit color component (R, G or B).
264ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
265ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBLumaColorTable(const uint8* src_argb, int src_stride_argb,
266ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                       uint8* dst_argb, int dst_stride_argb,
267ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                       const uint8* luma_rgb_table,
268ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                       int width, int height);
269ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
270ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Apply a 3 term polynomial to ARGB values.
271ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// poly points to a 4x4 matrix.  The first row is constants.  The 2nd row is
272ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// coefficients for b, g, r and a.  The 3rd row is coefficients for b squared,
273ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// g squared, r squared and a squared.  The 4rd row is coefficients for b to
274ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// the 3, g to the 3, r to the 3 and a to the 3.  The values are summed and
275ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// result clamped to 0 to 255.
276ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// A polynomial approximation can be dirived using software such as 'R'.
277ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
278ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
279ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBPolynomial(const uint8* src_argb, int src_stride_argb,
280ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                   uint8* dst_argb, int dst_stride_argb,
281ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                   const float* poly,
282ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                   int width, int height);
283ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
284ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Quantize a rectangle of ARGB. Alpha unaffected.
285ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// scale is a 16 bit fractional fixed point scaler between 0 and 65535.
286ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// interval_size should be a value between 1 and 255.
287ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// interval_offset should be a value between 0 and 255.
288ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
289ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBQuantize(uint8* dst_argb, int dst_stride_argb,
290ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 int scale, int interval_size, int interval_offset,
291ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 int x, int y, int width, int height);
292ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
293ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Copy ARGB to ARGB.
294ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
295ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBCopy(const uint8* src_argb, int src_stride_argb,
296ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_argb, int dst_stride_argb,
297ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int width, int height);
298ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
2997bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Copy Alpha channel of ARGB to alpha of ARGB.
300ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
301ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBCopyAlpha(const uint8* src_argb, int src_stride_argb,
302ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                  uint8* dst_argb, int dst_stride_argb,
303ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                  int width, int height);
304ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
3057bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Extract the alpha channel from ARGB.
3067bc9febe8749e98a3812a0dc4380ceae75c29450JohannLIBYUV_API
3077bc9febe8749e98a3812a0dc4380ceae75c29450Johannint ARGBExtractAlpha(const uint8* src_argb, int src_stride_argb,
3087bc9febe8749e98a3812a0dc4380ceae75c29450Johann                     uint8* dst_a, int dst_stride_a,
3097bc9febe8749e98a3812a0dc4380ceae75c29450Johann                     int width, int height);
3107bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3117bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Copy Y channel to Alpha of ARGB.
312ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
313ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBCopyYToAlpha(const uint8* src_y, int src_stride_y,
314ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                     uint8* dst_argb, int dst_stride_argb,
315ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                     int width, int height);
316ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
317ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef void (*ARGBBlendRow)(const uint8* src_argb0, const uint8* src_argb1,
318ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                             uint8* dst_argb, int width);
319ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
320ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Get function to Alpha Blend ARGB pixels and store to destination.
321ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
322ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianARGBBlendRow GetARGBBlend();
323ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
324ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Alpha Blend ARGB images and store to destination.
3257bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Source is pre-multiplied by alpha using ARGBAttenuate.
326ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Alpha of destination is set to 255.
327ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
328ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBBlend(const uint8* src_argb0, int src_stride_argb0,
329ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              const uint8* src_argb1, int src_stride_argb1,
330ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              uint8* dst_argb, int dst_stride_argb,
331ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              int width, int height);
332ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
3337bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Alpha Blend plane and store to destination.
3347bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Source is not pre-multiplied by alpha.
3357bc9febe8749e98a3812a0dc4380ceae75c29450JohannLIBYUV_API
3367bc9febe8749e98a3812a0dc4380ceae75c29450Johannint BlendPlane(const uint8* src_y0, int src_stride_y0,
3377bc9febe8749e98a3812a0dc4380ceae75c29450Johann               const uint8* src_y1, int src_stride_y1,
3387bc9febe8749e98a3812a0dc4380ceae75c29450Johann               const uint8* alpha, int alpha_stride,
3397bc9febe8749e98a3812a0dc4380ceae75c29450Johann               uint8* dst_y, int dst_stride_y,
3407bc9febe8749e98a3812a0dc4380ceae75c29450Johann               int width, int height);
3417bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3427bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Alpha Blend YUV images and store to destination.
3437bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Source is not pre-multiplied by alpha.
3447bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Alpha is full width x height and subsampled to half size to apply to UV.
3457bc9febe8749e98a3812a0dc4380ceae75c29450JohannLIBYUV_API
3467bc9febe8749e98a3812a0dc4380ceae75c29450Johannint I420Blend(const uint8* src_y0, int src_stride_y0,
3477bc9febe8749e98a3812a0dc4380ceae75c29450Johann              const uint8* src_u0, int src_stride_u0,
3487bc9febe8749e98a3812a0dc4380ceae75c29450Johann              const uint8* src_v0, int src_stride_v0,
3497bc9febe8749e98a3812a0dc4380ceae75c29450Johann              const uint8* src_y1, int src_stride_y1,
3507bc9febe8749e98a3812a0dc4380ceae75c29450Johann              const uint8* src_u1, int src_stride_u1,
3517bc9febe8749e98a3812a0dc4380ceae75c29450Johann              const uint8* src_v1, int src_stride_v1,
3527bc9febe8749e98a3812a0dc4380ceae75c29450Johann              const uint8* alpha, int alpha_stride,
3537bc9febe8749e98a3812a0dc4380ceae75c29450Johann              uint8* dst_y, int dst_stride_y,
3547bc9febe8749e98a3812a0dc4380ceae75c29450Johann              uint8* dst_u, int dst_stride_u,
3557bc9febe8749e98a3812a0dc4380ceae75c29450Johann              uint8* dst_v, int dst_stride_v,
3567bc9febe8749e98a3812a0dc4380ceae75c29450Johann              int width, int height);
3577bc9febe8749e98a3812a0dc4380ceae75c29450Johann
358ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Multiply ARGB image by ARGB image. Shifted down by 8. Saturates to 255.
359ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
360ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBMultiply(const uint8* src_argb0, int src_stride_argb0,
361ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 const uint8* src_argb1, int src_stride_argb1,
362ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 uint8* dst_argb, int dst_stride_argb,
363ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 int width, int height);
364ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
365ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Add ARGB image with ARGB image. Saturates to 255.
366ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
367ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBAdd(const uint8* src_argb0, int src_stride_argb0,
368ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            const uint8* src_argb1, int src_stride_argb1,
369ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            uint8* dst_argb, int dst_stride_argb,
370ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            int width, int height);
371ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
372ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Subtract ARGB image (argb1) from ARGB image (argb0). Saturates to 0.
373ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
374ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBSubtract(const uint8* src_argb0, int src_stride_argb0,
375ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 const uint8* src_argb1, int src_stride_argb1,
376ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 uint8* dst_argb, int dst_stride_argb,
377ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 int width, int height);
378ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
379ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert I422 to YUY2.
380ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
381ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I422ToYUY2(const uint8* src_y, int src_stride_y,
382ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_u, int src_stride_u,
383ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_v, int src_stride_v,
384ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_frame, int dst_stride_frame,
385ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
386ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
387ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert I422 to UYVY.
388ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
389ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint I422ToUYVY(const uint8* src_y, int src_stride_y,
390ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_u, int src_stride_u,
391ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               const uint8* src_v, int src_stride_v,
392ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               uint8* dst_frame, int dst_stride_frame,
393ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               int width, int height);
394ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
395ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert unattentuated ARGB to preattenuated ARGB.
396ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
397ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBAttenuate(const uint8* src_argb, int src_stride_argb,
398ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                  uint8* dst_argb, int dst_stride_argb,
399ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                  int width, int height);
400ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
401ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Convert preattentuated ARGB to unattenuated ARGB.
402ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
403ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBUnattenuate(const uint8* src_argb, int src_stride_argb,
404ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                    uint8* dst_argb, int dst_stride_argb,
405ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                    int width, int height);
406ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
407ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Internal function - do not call directly.
408ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Computes table of cumulative sum for image where the value is the sum
409ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// of all values above and to the left of the entry. Used by ARGBBlur.
410ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
411ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBComputeCumulativeSum(const uint8* src_argb, int src_stride_argb,
412ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                             int32* dst_cumsum, int dst_stride32_cumsum,
413ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                             int width, int height);
414ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
415ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Blur ARGB image.
416ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// dst_cumsum table of width * (height + 1) * 16 bytes aligned to
417ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian//   16 byte boundary.
418ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// dst_stride32_cumsum is number of ints in a row (width * 4).
419ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// radius is number of pixels around the center.  e.g. 1 = 3x3. 2=5x5.
420ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Blur is optimized for radius of 5 (11x11) or less.
421ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
422ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBBlur(const uint8* src_argb, int src_stride_argb,
423ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             uint8* dst_argb, int dst_stride_argb,
424ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int32* dst_cumsum, int dst_stride32_cumsum,
425ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian             int width, int height, int radius);
426ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
427ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Multiply ARGB image by ARGB value.
428ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
429ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBShade(const uint8* src_argb, int src_stride_argb,
430ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              uint8* dst_argb, int dst_stride_argb,
431ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              int width, int height, uint32 value);
432ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
4337bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Interpolate between two images using specified amount of interpolation
434ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// (0 to 255) and store to destination.
4357bc9febe8749e98a3812a0dc4380ceae75c29450Johann// 'interpolation' is specified as 8 bit fraction where 0 means 100% src0
4367bc9febe8749e98a3812a0dc4380ceae75c29450Johann// and 255 means 1% src0 and 99% src1.
4377bc9febe8749e98a3812a0dc4380ceae75c29450JohannLIBYUV_API
4387bc9febe8749e98a3812a0dc4380ceae75c29450Johannint InterpolatePlane(const uint8* src0, int src_stride0,
4397bc9febe8749e98a3812a0dc4380ceae75c29450Johann                     const uint8* src1, int src_stride1,
4407bc9febe8749e98a3812a0dc4380ceae75c29450Johann                     uint8* dst, int dst_stride,
4417bc9febe8749e98a3812a0dc4380ceae75c29450Johann                     int width, int height, int interpolation);
4427bc9febe8749e98a3812a0dc4380ceae75c29450Johann
4437bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Interpolate between two ARGB images using specified amount of interpolation
4447bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Internally calls InterpolatePlane with width * 4 (bpp).
445ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
446ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBInterpolate(const uint8* src_argb0, int src_stride_argb0,
447ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                    const uint8* src_argb1, int src_stride_argb1,
448ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                    uint8* dst_argb, int dst_stride_argb,
449ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                    int width, int height, int interpolation);
450ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
4517bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Interpolate between two YUV images using specified amount of interpolation
4527bc9febe8749e98a3812a0dc4380ceae75c29450Johann// Internally calls InterpolatePlane on each plane where the U and V planes
4537bc9febe8749e98a3812a0dc4380ceae75c29450Johann// are half width and half height.
4547bc9febe8749e98a3812a0dc4380ceae75c29450JohannLIBYUV_API
4557bc9febe8749e98a3812a0dc4380ceae75c29450Johannint I420Interpolate(const uint8* src0_y, int src0_stride_y,
4567bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    const uint8* src0_u, int src0_stride_u,
4577bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    const uint8* src0_v, int src0_stride_v,
4587bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    const uint8* src1_y, int src1_stride_y,
4597bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    const uint8* src1_u, int src1_stride_u,
4607bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    const uint8* src1_v, int src1_stride_v,
4617bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    uint8* dst_y, int dst_stride_y,
4627bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    uint8* dst_u, int dst_stride_u,
4637bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    uint8* dst_v, int dst_stride_v,
4647bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    int width, int height, int interpolation);
4657bc9febe8749e98a3812a0dc4380ceae75c29450Johann
466da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if defined(__pnacl__) || defined(__CLR_VER) || \
467da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    (defined(__i386__) && !defined(__SSE2__))
468ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define LIBYUV_DISABLE_X86
469ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
4707bc9febe8749e98a3812a0dc4380ceae75c29450Johann// MemorySanitizer does not support assembly code yet. http://crbug.com/344505
4717bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if defined(__has_feature)
4727bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if __has_feature(memory_sanitizer)
4737bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define LIBYUV_DISABLE_X86
4747bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif
4757bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif
476da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// The following are available on all x86 platforms:
477da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if !defined(LIBYUV_DISABLE_X86) && \
478da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
479da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#define HAS_ARGBAFFINEROW_SSE2
480da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
481ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
482da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// Row function for copying pixels from a source with a slope to a row
483ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// of destination. Useful for scaling, rotation, mirror, texture mapping.
484ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
485ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ARGBAffineRow_C(const uint8* src_argb, int src_argb_stride,
486ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                     uint8* dst_argb, const float* uv_dudv, int width);
487ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
488ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride,
489ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                        uint8* dst_argb, const float* uv_dudv, int width);
490ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
491ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Shuffle ARGB channel order.  e.g. BGRA to ARGB.
492ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// shuffler is 16 bytes and must be aligned.
493ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
494ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBShuffle(const uint8* src_bgra, int src_stride_bgra,
495ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                uint8* dst_argb, int dst_stride_argb,
496ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                const uint8* shuffler, int width, int height);
497ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
498ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Sobel ARGB effect with planar output.
499ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
500ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBSobelToPlane(const uint8* src_argb, int src_stride_argb,
501ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                     uint8* dst_y, int dst_stride_y,
502ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                     int width, int height);
503ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
504ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Sobel ARGB effect.
505ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
506ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBSobel(const uint8* src_argb, int src_stride_argb,
507ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              uint8* dst_argb, int dst_stride_argb,
508ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian              int width, int height);
509ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
510ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Sobel ARGB effect w/ Sobel X, Sobel, Sobel Y in ARGB.
511ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIBYUV_API
512ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint ARGBSobelXY(const uint8* src_argb, int src_stride_argb,
513ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                uint8* dst_argb, int dst_stride_argb,
514ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                int width, int height);
515ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
516ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifdef __cplusplus
517ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}  // extern "C"
518ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}  // namespace libyuv
519ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
520ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
521ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif  // INCLUDE_LIBYUV_PLANAR_FUNCTIONS_H_  NOLINT
522