/src/vlc/modules/codec/avcodec/chroma.c
Line | Count | Source |
1 | | /***************************************************************************** |
2 | | * chroma.c: libavutil <-> libvlc conversion routines |
3 | | ***************************************************************************** |
4 | | * Copyright (C) 1999-2008 VLC authors and VideoLAN |
5 | | * |
6 | | * Authors: Laurent Aimar <fenrir@via.ecp.fr> |
7 | | * Gildas Bazin <gbazin@videolan.org> |
8 | | * |
9 | | * This program is free software; you can redistribute it and/or modify it |
10 | | * under the terms of the GNU Lesser General Public License as published by |
11 | | * the Free Software Foundation; either version 2.1 of the License, or |
12 | | * (at your option) any later version. |
13 | | * |
14 | | * This program is distributed in the hope that it will be useful, |
15 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | | * GNU Lesser General Public License for more details. |
18 | | * |
19 | | * You should have received a copy of the GNU Lesser General Public License |
20 | | * along with this program; if not, write to the Free Software Foundation, |
21 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 021100301, USA. |
22 | | *****************************************************************************/ |
23 | | |
24 | | #ifdef HAVE_CONFIG_H |
25 | | # include <config.h> |
26 | | #endif |
27 | | |
28 | | #include <vlc_common.h> |
29 | | #include <vlc_es.h> |
30 | | |
31 | | /* |
32 | | * Common header for swscale, avcodec (and avformat). |
33 | | * Only libavutil can be depended on here. |
34 | | */ |
35 | | #include "chroma.h" |
36 | | #include "avcommon_compat.h" |
37 | | |
38 | | /***************************************************************************** |
39 | | * Chroma fourcc -> libavutil pixfmt mapping |
40 | | *****************************************************************************/ |
41 | | static const struct vlc_chroma_ffmpeg chroma_table[] = |
42 | | { |
43 | | /* Planar YUV formats */ |
44 | | {VLC_CODEC_I444, AV_PIX_FMT_YUV444P, COLOR_RANGE_UNDEF }, |
45 | | {VLC_CODEC_I444, AV_PIX_FMT_YUVJ444P, COLOR_RANGE_FULL }, |
46 | | |
47 | | {VLC_CODEC_I440, AV_PIX_FMT_YUV440P, COLOR_RANGE_UNDEF }, |
48 | | {VLC_CODEC_I440, AV_PIX_FMT_YUVJ440P, COLOR_RANGE_FULL }, |
49 | | |
50 | | {VLC_CODEC_I422, AV_PIX_FMT_YUV422P, COLOR_RANGE_UNDEF }, |
51 | | {VLC_CODEC_I422, AV_PIX_FMT_YUVJ422P, COLOR_RANGE_FULL }, |
52 | | |
53 | | {VLC_CODEC_I420, AV_PIX_FMT_YUV420P, COLOR_RANGE_UNDEF }, |
54 | | {VLC_CODEC_YV12, AV_PIX_FMT_YUV420P, COLOR_RANGE_UNDEF }, |
55 | | {VLC_CODEC_I420, AV_PIX_FMT_YUVJ420P, COLOR_RANGE_FULL }, |
56 | | {VLC_CODEC_I411, AV_PIX_FMT_YUV411P, COLOR_RANGE_UNDEF }, |
57 | | {VLC_CODEC_I411, AV_PIX_FMT_YUVJ411P, COLOR_RANGE_FULL }, |
58 | | {VLC_CODEC_I410, AV_PIX_FMT_YUV410P, COLOR_RANGE_UNDEF }, |
59 | | |
60 | | {VLC_CODEC_NV12, AV_PIX_FMT_NV12, COLOR_RANGE_UNDEF }, |
61 | | {VLC_CODEC_NV21, AV_PIX_FMT_NV21, COLOR_RANGE_UNDEF }, |
62 | | {VLC_CODEC_NV16, AV_PIX_FMT_NV16, COLOR_RANGE_UNDEF }, |
63 | | {VLC_CODEC_NV24, AV_PIX_FMT_NV24, COLOR_RANGE_UNDEF }, |
64 | | {VLC_CODEC_NV42, AV_PIX_FMT_NV42, COLOR_RANGE_UNDEF }, |
65 | | |
66 | | {VLC_CODEC_I420_9L, AV_PIX_FMT_YUV420P9LE, COLOR_RANGE_UNDEF }, |
67 | | {VLC_CODEC_I420_9B, AV_PIX_FMT_YUV420P9BE, COLOR_RANGE_UNDEF }, |
68 | | {VLC_CODEC_I420_10L, AV_PIX_FMT_YUV420P10LE, COLOR_RANGE_UNDEF }, |
69 | | {VLC_CODEC_I420_10B, AV_PIX_FMT_YUV420P10BE, COLOR_RANGE_UNDEF }, |
70 | | #ifdef AV_PIX_FMT_YUV420P12 /* 54, 17, 100 */ |
71 | | {VLC_CODEC_I420_12L, AV_PIX_FMT_YUV420P12LE, COLOR_RANGE_UNDEF }, |
72 | | {VLC_CODEC_I420_12B, AV_PIX_FMT_YUV420P12BE, COLOR_RANGE_UNDEF }, |
73 | | #endif |
74 | | {VLC_CODEC_I420_16L, AV_PIX_FMT_YUV420P16LE, COLOR_RANGE_UNDEF }, |
75 | | {VLC_CODEC_I420_16B, AV_PIX_FMT_YUV420P16BE, COLOR_RANGE_UNDEF }, |
76 | | #ifdef AV_PIX_FMT_P010LE |
77 | | {VLC_CODEC_P010, AV_PIX_FMT_P010LE, COLOR_RANGE_UNDEF }, |
78 | | #endif |
79 | | #ifdef AV_PIX_FMT_P016LE |
80 | | {VLC_CODEC_P016, AV_PIX_FMT_P016LE, COLOR_RANGE_UNDEF }, |
81 | | #endif |
82 | | |
83 | | {VLC_CODEC_I422_9L, AV_PIX_FMT_YUV422P9LE, COLOR_RANGE_UNDEF }, |
84 | | {VLC_CODEC_I422_9B, AV_PIX_FMT_YUV422P9BE, COLOR_RANGE_UNDEF }, |
85 | | {VLC_CODEC_I422_10L, AV_PIX_FMT_YUV422P10LE, COLOR_RANGE_UNDEF }, |
86 | | {VLC_CODEC_I422_10B, AV_PIX_FMT_YUV422P10BE, COLOR_RANGE_UNDEF }, |
87 | | {VLC_CODEC_I422_16L, AV_PIX_FMT_YUV422P16LE, COLOR_RANGE_UNDEF }, |
88 | | {VLC_CODEC_I422_16B, AV_PIX_FMT_YUV422P16BE, COLOR_RANGE_UNDEF }, |
89 | | #ifdef AV_PIX_FMT_YUV422P12 /* 54, 17, 100 */ |
90 | | {VLC_CODEC_I422_12L, AV_PIX_FMT_YUV422P12LE, COLOR_RANGE_UNDEF }, |
91 | | {VLC_CODEC_I422_12B, AV_PIX_FMT_YUV422P12BE, COLOR_RANGE_UNDEF }, |
92 | | #endif |
93 | | |
94 | | {VLC_CODEC_YUV420A, AV_PIX_FMT_YUVA420P, COLOR_RANGE_UNDEF }, |
95 | | {VLC_CODEC_YUV422A, AV_PIX_FMT_YUVA422P, COLOR_RANGE_UNDEF }, |
96 | | {VLC_CODEC_YUVA, AV_PIX_FMT_YUVA444P, COLOR_RANGE_UNDEF }, |
97 | | |
98 | | {VLC_CODEC_YUVA_444_10L, AV_PIX_FMT_YUVA444P10LE, COLOR_RANGE_UNDEF }, |
99 | | {VLC_CODEC_YUVA_444_10B, AV_PIX_FMT_YUVA444P10BE, COLOR_RANGE_UNDEF }, |
100 | | |
101 | | {VLC_CODEC_YUVA_444_12L, AV_PIX_FMT_YUVA444P12LE, COLOR_RANGE_UNDEF }, |
102 | | {VLC_CODEC_YUVA_444_12B, AV_PIX_FMT_YUVA444P12BE, COLOR_RANGE_UNDEF }, |
103 | | |
104 | | {VLC_CODEC_I444_9L, AV_PIX_FMT_YUV444P9LE, COLOR_RANGE_UNDEF }, |
105 | | {VLC_CODEC_I444_9B, AV_PIX_FMT_YUV444P9BE, COLOR_RANGE_UNDEF }, |
106 | | {VLC_CODEC_I444_10L, AV_PIX_FMT_YUV444P10LE, COLOR_RANGE_UNDEF }, |
107 | | {VLC_CODEC_I444_10B, AV_PIX_FMT_YUV444P10BE, COLOR_RANGE_UNDEF }, |
108 | | #ifdef AV_PIX_FMT_YUV444P12 /* 54, 17, 100 */ |
109 | | {VLC_CODEC_I444_12L, AV_PIX_FMT_YUV444P12LE, COLOR_RANGE_UNDEF }, |
110 | | {VLC_CODEC_I444_12B, AV_PIX_FMT_YUV444P12BE, COLOR_RANGE_UNDEF }, |
111 | | #endif |
112 | | {VLC_CODEC_I444_16L, AV_PIX_FMT_YUV444P16LE, COLOR_RANGE_UNDEF }, |
113 | | {VLC_CODEC_I444_16B, AV_PIX_FMT_YUV444P16BE, COLOR_RANGE_UNDEF }, |
114 | | |
115 | | /* Packed YUV formats */ |
116 | | {VLC_CODEC_YUYV, AV_PIX_FMT_YUYV422, COLOR_RANGE_UNDEF }, |
117 | | {VLC_CODEC_UYVY, AV_PIX_FMT_UYVY422, COLOR_RANGE_UNDEF }, |
118 | | {VLC_CODEC_YVYU, AV_PIX_FMT_YVYU422, COLOR_RANGE_UNDEF }, |
119 | | |
120 | | #if LIBAVUTIL_VERSION_CHECK(57, 34, 100) |
121 | | {VLC_CODEC_VUYA, AV_PIX_FMT_VUYX, COLOR_RANGE_UNDEF }, |
122 | | {VLC_CODEC_VUYX, AV_PIX_FMT_VUYX, COLOR_RANGE_UNDEF }, |
123 | | #endif |
124 | | #if LIBAVUTIL_VERSION_CHECK(57, 36, 100) |
125 | | {VLC_CODEC_Y210, AV_PIX_FMT_Y210LE, COLOR_RANGE_UNDEF }, |
126 | | {VLC_CODEC_Y212, AV_PIX_FMT_Y212LE, COLOR_RANGE_UNDEF }, |
127 | | {VLC_CODEC_Y410, AV_PIX_FMT_XV30LE, COLOR_RANGE_UNDEF }, |
128 | | {VLC_CODEC_Y412, AV_PIX_FMT_XV36LE, COLOR_RANGE_UNDEF }, |
129 | | #endif |
130 | | |
131 | | /* Packed RGB formats */ |
132 | | {VLC_CODEC_RGB332, AV_PIX_FMT_RGB8, COLOR_RANGE_UNDEF }, |
133 | | {VLC_CODEC_BGR233, AV_PIX_FMT_BGR8, COLOR_RANGE_UNDEF }, |
134 | | |
135 | | {VLC_CODEC_RGB565BE, AV_PIX_FMT_RGB565BE, COLOR_RANGE_UNDEF }, |
136 | | {VLC_CODEC_RGB565LE, AV_PIX_FMT_RGB565LE, COLOR_RANGE_UNDEF }, |
137 | | {VLC_CODEC_BGR565BE, AV_PIX_FMT_BGR565BE, COLOR_RANGE_UNDEF }, |
138 | | {VLC_CODEC_BGR565LE, AV_PIX_FMT_BGR565LE, COLOR_RANGE_UNDEF }, |
139 | | |
140 | | {VLC_CODEC_RGB555BE, AV_PIX_FMT_RGB555BE, COLOR_RANGE_UNDEF }, |
141 | | {VLC_CODEC_RGB555LE, AV_PIX_FMT_RGB555LE, COLOR_RANGE_UNDEF }, |
142 | | {VLC_CODEC_BGR555BE, AV_PIX_FMT_BGR555BE, COLOR_RANGE_UNDEF }, |
143 | | {VLC_CODEC_BGR555LE, AV_PIX_FMT_BGR555LE, COLOR_RANGE_UNDEF }, |
144 | | |
145 | | {VLC_CODEC_RGB24, AV_PIX_FMT_RGB24, COLOR_RANGE_UNDEF }, |
146 | | {VLC_CODEC_BGR24, AV_PIX_FMT_BGR24, COLOR_RANGE_UNDEF }, |
147 | | |
148 | | {VLC_CODEC_RGBX, AV_PIX_FMT_RGB0, COLOR_RANGE_UNDEF }, |
149 | | {VLC_CODEC_XRGB, AV_PIX_FMT_0RGB, COLOR_RANGE_UNDEF }, |
150 | | {VLC_CODEC_BGRX, AV_PIX_FMT_BGR0, COLOR_RANGE_UNDEF }, |
151 | | {VLC_CODEC_XBGR, AV_PIX_FMT_0BGR, COLOR_RANGE_UNDEF }, |
152 | | |
153 | | {VLC_CODEC_RGBA, AV_PIX_FMT_RGBA, COLOR_RANGE_UNDEF }, |
154 | | {VLC_CODEC_ARGB, AV_PIX_FMT_ARGB, COLOR_RANGE_UNDEF }, |
155 | | {VLC_CODEC_BGRA, AV_PIX_FMT_BGRA, COLOR_RANGE_UNDEF }, |
156 | | {VLC_CODEC_ABGR, AV_PIX_FMT_ABGR, COLOR_RANGE_UNDEF }, |
157 | | |
158 | | #ifdef WORDS_BIGENDIAN |
159 | | {VLC_CODEC_RGBA64, AV_PIX_FMT_RGBA64BE, COLOR_RANGE_UNDEF }, |
160 | | #else /* !WORDS_BIGENDIAN */ |
161 | | {VLC_CODEC_RGBA64, AV_PIX_FMT_RGBA64LE, COLOR_RANGE_UNDEF }, |
162 | | #endif /* !WORDS_BIGENDIAN */ |
163 | | |
164 | | #ifdef AV_PIX_FMT_X2BGR10 |
165 | | {VLC_CODEC_RGBA10LE, AV_PIX_FMT_X2BGR10, COLOR_RANGE_UNDEF }, |
166 | | #endif |
167 | | |
168 | | {VLC_CODEC_GREY, AV_PIX_FMT_GRAY8, COLOR_RANGE_UNDEF}, |
169 | | #ifdef AV_PIX_FMT_GRAY10 |
170 | | {VLC_CODEC_GREY_10L, AV_PIX_FMT_GRAY10LE, COLOR_RANGE_UNDEF}, |
171 | | {VLC_CODEC_GREY_10B, AV_PIX_FMT_GRAY10BE, COLOR_RANGE_UNDEF}, |
172 | | #endif |
173 | | #ifdef AV_PIX_FMT_GRAY12 |
174 | | {VLC_CODEC_GREY_12L, AV_PIX_FMT_GRAY12LE, COLOR_RANGE_UNDEF}, |
175 | | {VLC_CODEC_GREY_12B, AV_PIX_FMT_GRAY12BE, COLOR_RANGE_UNDEF}, |
176 | | #endif |
177 | | {VLC_CODEC_GREY_16L, AV_PIX_FMT_GRAY16LE, COLOR_RANGE_UNDEF}, |
178 | | {VLC_CODEC_GREY_16B, AV_PIX_FMT_GRAY16BE, COLOR_RANGE_UNDEF}, |
179 | | |
180 | | /* Paletized RGB */ |
181 | | {VLC_CODEC_RGBP, AV_PIX_FMT_PAL8, COLOR_RANGE_UNDEF}, |
182 | | |
183 | | {VLC_CODEC_GBR_PLANAR, AV_PIX_FMT_GBRP, COLOR_RANGE_UNDEF }, |
184 | | {VLC_CODEC_GBR_PLANAR_9L, AV_PIX_FMT_GBRP9LE, COLOR_RANGE_UNDEF }, |
185 | | {VLC_CODEC_GBR_PLANAR_9B, AV_PIX_FMT_GBRP9BE, COLOR_RANGE_UNDEF }, |
186 | | {VLC_CODEC_GBR_PLANAR_10L, AV_PIX_FMT_GBRP10LE, COLOR_RANGE_UNDEF }, |
187 | | {VLC_CODEC_GBR_PLANAR_10B, AV_PIX_FMT_GBRP10BE, COLOR_RANGE_UNDEF }, |
188 | | #ifdef AV_PIX_FMT_GBRP12 /* 55, 24, 0 / 51, 74, 100 */ |
189 | | {VLC_CODEC_GBR_PLANAR_12L, AV_PIX_FMT_GBRP12LE, COLOR_RANGE_UNDEF }, |
190 | | {VLC_CODEC_GBR_PLANAR_12B, AV_PIX_FMT_GBRP12BE, COLOR_RANGE_UNDEF }, |
191 | | #endif |
192 | | #ifdef AV_PIX_FMT_GBRP14 /* ffmpeg only */ |
193 | | {VLC_CODEC_GBR_PLANAR_14L, AV_PIX_FMT_GBRP14LE, COLOR_RANGE_UNDEF }, |
194 | | {VLC_CODEC_GBR_PLANAR_14B, AV_PIX_FMT_GBRP14BE, COLOR_RANGE_UNDEF }, |
195 | | #endif |
196 | | {VLC_CODEC_GBR_PLANAR_16L, AV_PIX_FMT_GBRP16LE, COLOR_RANGE_UNDEF }, |
197 | | {VLC_CODEC_GBR_PLANAR_16B, AV_PIX_FMT_GBRP16BE, COLOR_RANGE_UNDEF }, |
198 | | {VLC_CODEC_GBRA_PLANAR, AV_PIX_FMT_GBRAP, COLOR_RANGE_UNDEF }, |
199 | | #ifdef AV_PIX_FMT_GBRAP10 /* 56, 1, 0 / 55, 25, 100 */ |
200 | | {VLC_CODEC_GBRA_PLANAR_10L, AV_PIX_FMT_GBRAP10LE, COLOR_RANGE_UNDEF }, |
201 | | {VLC_CODEC_GBRA_PLANAR_10B, AV_PIX_FMT_GBRAP10BE, COLOR_RANGE_UNDEF }, |
202 | | #endif |
203 | | #ifdef AV_PIX_FMT_GBRAP12 /* 55, 25, 0, 19, 100 */ |
204 | | {VLC_CODEC_GBRA_PLANAR_12L, AV_PIX_FMT_GBRAP12LE, COLOR_RANGE_UNDEF }, |
205 | | {VLC_CODEC_GBRA_PLANAR_12B, AV_PIX_FMT_GBRAP12BE, COLOR_RANGE_UNDEF }, |
206 | | #endif |
207 | | {VLC_CODEC_GBRA_PLANAR_16L, AV_PIX_FMT_GBRAP16LE, COLOR_RANGE_UNDEF }, |
208 | | {VLC_CODEC_GBRA_PLANAR_16B, AV_PIX_FMT_GBRAP16BE, COLOR_RANGE_UNDEF }, |
209 | | |
210 | | /* XYZ */ |
211 | | {VLC_CODEC_XYZ_12L, AV_PIX_FMT_XYZ12LE, COLOR_RANGE_UNDEF }, |
212 | | {VLC_CODEC_XYZ_12B, AV_PIX_FMT_XYZ12BE, COLOR_RANGE_UNDEF }, |
213 | | }; |
214 | | |
215 | | |
216 | | const struct vlc_chroma_ffmpeg *GetVlcChromaFfmpegTable( size_t *count ) |
217 | 0 | { |
218 | 0 | *count = ARRAY_SIZE(chroma_table); |
219 | 0 | return chroma_table; |
220 | 0 | } |
221 | | |
222 | | int GetVlcChroma( video_format_t *fmt, enum AVPixelFormat i_ffmpeg_chroma ) |
223 | 567k | { |
224 | 33.7M | for( size_t i = 0; i < ARRAY_SIZE(chroma_table); i++ ) |
225 | 33.4M | { |
226 | 33.4M | if( chroma_table[i].i_chroma_id == i_ffmpeg_chroma ) |
227 | 279k | { |
228 | 279k | fmt->i_chroma = chroma_table[i].i_chroma; |
229 | 279k | if (chroma_table[i].range != COLOR_RANGE_UNDEF) |
230 | 26.2k | fmt->color_range = chroma_table[i].range; |
231 | 279k | return VLC_SUCCESS; |
232 | 279k | } |
233 | 33.4M | } |
234 | 288k | return VLC_EGENERIC; |
235 | 567k | } |
236 | | |
237 | | enum AVPixelFormat FindFfmpegChroma( vlc_fourcc_t fourcc, bool *uv_flipped ) |
238 | 1.38k | { |
239 | 40.6k | for (size_t i = 0; i < ARRAY_SIZE(chroma_table); i++) |
240 | 40.6k | if( chroma_table[i].i_chroma == fourcc ) |
241 | 1.38k | { |
242 | 1.38k | *uv_flipped = fourcc == VLC_CODEC_YV12; |
243 | 1.38k | return chroma_table[i].i_chroma_id; |
244 | 1.38k | } |
245 | 0 | return AV_PIX_FMT_NONE; |
246 | 1.38k | } |