blob: a81e4f0a52925a75c774ddbdf9187f19e8f00882
1 | /* |
2 | * Copyright (c) 2016 Ronald S. Bultje <rsbultje@gmail.com> |
3 | * |
4 | * This file is part of FFmpeg. |
5 | * |
6 | * FFmpeg is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with FFmpeg; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | #ifndef AVFILTER_COLORSPACEDSP_H |
22 | #define AVFILTER_COLORSPACEDSP_H |
23 | |
24 | #include <stddef.h> |
25 | #include <stdint.h> |
26 | |
27 | typedef void (*yuv2rgb_fn)(int16_t *rgb[3], ptrdiff_t rgb_stride, |
28 | uint8_t *yuv[3], const ptrdiff_t yuv_stride[3], |
29 | int w, int h, const int16_t yuv2rgb_coeffs[3][3][8], |
30 | const int16_t yuv_offset[8]); |
31 | typedef void (*rgb2yuv_fn)(uint8_t *yuv[3], const ptrdiff_t yuv_stride[3], |
32 | int16_t *rgb[3], ptrdiff_t rgb_stride, |
33 | int w, int h, const int16_t rgb2yuv_coeffs[3][3][8], |
34 | const int16_t yuv_offset[8]); |
35 | typedef void (*rgb2yuv_fsb_fn)(uint8_t *yuv[3], const ptrdiff_t yuv_stride[3], |
36 | int16_t *rgb[3], ptrdiff_t rgb_stride, |
37 | int w, int h, const int16_t rgb2yuv_coeffs[3][3][8], |
38 | const int16_t yuv_offset[8], |
39 | int *rnd[3][2]); |
40 | typedef void (*yuv2yuv_fn)(uint8_t *yuv_out[3], const ptrdiff_t yuv_out_stride[3], |
41 | uint8_t *yuv_in[3], const ptrdiff_t yuv_in_stride[3], |
42 | int w, int h, const int16_t yuv2yuv_coeffs[3][3][8], |
43 | const int16_t yuv_offset[2][8]); |
44 | |
45 | enum BitDepthIndex { |
46 | BPP_8, |
47 | BPP_10, |
48 | BPP_12, |
49 | NB_BPP, |
50 | }; |
51 | |
52 | enum ChromaSubsamplingIndex { |
53 | SS_444, |
54 | SS_422, |
55 | SS_420, |
56 | NB_SS, |
57 | }; |
58 | |
59 | typedef struct ColorSpaceDSPContext { |
60 | /* Convert input YUV pixel buffer from a user into an internal, 15bpp array |
61 | * of intermediate RGB data. */ |
62 | yuv2rgb_fn yuv2rgb[NB_BPP][NB_SS]; |
63 | /* Convert intermediate RGB data (15bpp, internal format) into YUV data and |
64 | * store into user-provided output buffer */ |
65 | rgb2yuv_fn rgb2yuv[NB_BPP][NB_SS]; |
66 | /* Same as rgb2yuv(), but use floyd-steinberg dithering */ |
67 | rgb2yuv_fsb_fn rgb2yuv_fsb[NB_BPP][NB_SS]; |
68 | /* Direct yuv-to-yuv conversion (input and output are both user-provided |
69 | * buffers) */ |
70 | yuv2yuv_fn yuv2yuv[NB_BPP /* in */][NB_BPP /* out */][NB_SS]; |
71 | |
72 | /* In-place 3x3 matrix multiplication. Input and output are both 15bpp |
73 | * (our internal data format) */ |
74 | void (*multiply3x3)(int16_t *data[3], ptrdiff_t stride, |
75 | int w, int h, const int16_t m[3][3][8]); |
76 | } ColorSpaceDSPContext; |
77 | |
78 | void ff_colorspacedsp_init(ColorSpaceDSPContext *dsp); |
79 | |
80 | /* internal */ |
81 | void ff_colorspacedsp_x86_init(ColorSpaceDSPContext *dsp); |
82 | |
83 | #endif /* AVFILTER_COLORSPACEDSP_H */ |
84 |