FFmpeg
Loading...
Searching...
No Matches
format.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024 Niklas Haas
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
22#include "libavutil/avassert.h"
25#include "libavutil/refstruct.h"
26
27#include "format.h"
28#include "csputils.h"
29#include "ops_internal.h"
30#include "config_components.h"
31
32#if CONFIG_UNSTABLE
33#include "libavutil/hwcontext.h"
34#endif
35
36#define RET(x) \
37 do { \
38 int _ret = (x); \
39 if (_ret < 0) \
40 return _ret; \
41 } while (0)
42
48
49/* Format support table for legacy swscale */
51 [AV_PIX_FMT_YUV420P] = { 1, 1 },
52 [AV_PIX_FMT_YUYV422] = { 1, 1 },
53 [AV_PIX_FMT_RGB24] = { 1, 1 },
54 [AV_PIX_FMT_BGR24] = { 1, 1 },
55 [AV_PIX_FMT_YUV422P] = { 1, 1 },
56 [AV_PIX_FMT_YUV444P] = { 1, 1 },
57 [AV_PIX_FMT_YUV410P] = { 1, 1 },
58 [AV_PIX_FMT_YUV411P] = { 1, 1 },
59 [AV_PIX_FMT_GRAY8] = { 1, 1 },
60 [AV_PIX_FMT_MONOWHITE] = { 1, 1 },
61 [AV_PIX_FMT_MONOBLACK] = { 1, 1 },
62 [AV_PIX_FMT_PAL8] = { 1, 0 },
63 [AV_PIX_FMT_YUVJ420P] = { 1, 1 },
64 [AV_PIX_FMT_YUVJ411P] = { 1, 1 },
65 [AV_PIX_FMT_YUVJ422P] = { 1, 1 },
66 [AV_PIX_FMT_YUVJ444P] = { 1, 1 },
67 [AV_PIX_FMT_YVYU422] = { 1, 1 },
68 [AV_PIX_FMT_UYVY422] = { 1, 1 },
69 [AV_PIX_FMT_UYYVYY411] = { 1, 0 },
70 [AV_PIX_FMT_BGR8] = { 1, 1 },
71 [AV_PIX_FMT_BGR4] = { 0, 1 },
72 [AV_PIX_FMT_BGR4_BYTE] = { 1, 1 },
73 [AV_PIX_FMT_RGB8] = { 1, 1 },
74 [AV_PIX_FMT_RGB4] = { 0, 1 },
75 [AV_PIX_FMT_RGB4_BYTE] = { 1, 1 },
76 [AV_PIX_FMT_NV12] = { 1, 1 },
77 [AV_PIX_FMT_NV21] = { 1, 1 },
78 [AV_PIX_FMT_ARGB] = { 1, 1 },
79 [AV_PIX_FMT_RGBA] = { 1, 1 },
80 [AV_PIX_FMT_ABGR] = { 1, 1 },
81 [AV_PIX_FMT_BGRA] = { 1, 1 },
82 [AV_PIX_FMT_0RGB] = { 1, 1 },
83 [AV_PIX_FMT_RGB0] = { 1, 1 },
84 [AV_PIX_FMT_0BGR] = { 1, 1 },
85 [AV_PIX_FMT_BGR0] = { 1, 1 },
86 [AV_PIX_FMT_GRAY9BE] = { 1, 1 },
87 [AV_PIX_FMT_GRAY9LE] = { 1, 1 },
88 [AV_PIX_FMT_GRAY10BE] = { 1, 1 },
89 [AV_PIX_FMT_GRAY10LE] = { 1, 1 },
90 [AV_PIX_FMT_GRAY12BE] = { 1, 1 },
91 [AV_PIX_FMT_GRAY12LE] = { 1, 1 },
92 [AV_PIX_FMT_GRAY14BE] = { 1, 1 },
93 [AV_PIX_FMT_GRAY14LE] = { 1, 1 },
94 [AV_PIX_FMT_GRAY16BE] = { 1, 1 },
95 [AV_PIX_FMT_GRAY16LE] = { 1, 1 },
96 [AV_PIX_FMT_YUV440P] = { 1, 1 },
97 [AV_PIX_FMT_YUVJ440P] = { 1, 1 },
98 [AV_PIX_FMT_YUV440P10LE] = { 1, 1 },
99 [AV_PIX_FMT_YUV440P10BE] = { 1, 1 },
100 [AV_PIX_FMT_YUV440P12LE] = { 1, 1 },
101 [AV_PIX_FMT_YUV440P12BE] = { 1, 1 },
102 [AV_PIX_FMT_YUVA420P] = { 1, 1 },
103 [AV_PIX_FMT_YUVA422P] = { 1, 1 },
104 [AV_PIX_FMT_YUVA444P] = { 1, 1 },
105 [AV_PIX_FMT_YUVA420P9BE] = { 1, 1 },
106 [AV_PIX_FMT_YUVA420P9LE] = { 1, 1 },
107 [AV_PIX_FMT_YUVA422P9BE] = { 1, 1 },
108 [AV_PIX_FMT_YUVA422P9LE] = { 1, 1 },
109 [AV_PIX_FMT_YUVA444P9BE] = { 1, 1 },
110 [AV_PIX_FMT_YUVA444P9LE] = { 1, 1 },
111 [AV_PIX_FMT_YUVA420P10BE] = { 1, 1 },
112 [AV_PIX_FMT_YUVA420P10LE] = { 1, 1 },
113 [AV_PIX_FMT_YUVA422P10BE] = { 1, 1 },
114 [AV_PIX_FMT_YUVA422P10LE] = { 1, 1 },
115 [AV_PIX_FMT_YUVA444P10BE] = { 1, 1 },
116 [AV_PIX_FMT_YUVA444P10LE] = { 1, 1 },
117 [AV_PIX_FMT_YUVA420P16BE] = { 1, 1 },
118 [AV_PIX_FMT_YUVA420P16LE] = { 1, 1 },
119 [AV_PIX_FMT_YUVA422P16BE] = { 1, 1 },
120 [AV_PIX_FMT_YUVA422P16LE] = { 1, 1 },
121 [AV_PIX_FMT_YUVA444P16BE] = { 1, 1 },
122 [AV_PIX_FMT_YUVA444P16LE] = { 1, 1 },
123 [AV_PIX_FMT_RGB48BE] = { 1, 1 },
124 [AV_PIX_FMT_RGB48LE] = { 1, 1 },
125 [AV_PIX_FMT_RGBA64BE] = { 1, 1, 1 },
126 [AV_PIX_FMT_RGBA64LE] = { 1, 1, 1 },
127 [AV_PIX_FMT_RGB565BE] = { 1, 1 },
128 [AV_PIX_FMT_RGB565LE] = { 1, 1 },
129 [AV_PIX_FMT_RGB555BE] = { 1, 1 },
130 [AV_PIX_FMT_RGB555LE] = { 1, 1 },
131 [AV_PIX_FMT_BGR565BE] = { 1, 1 },
132 [AV_PIX_FMT_BGR565LE] = { 1, 1 },
133 [AV_PIX_FMT_BGR555BE] = { 1, 1 },
134 [AV_PIX_FMT_BGR555LE] = { 1, 1 },
135 [AV_PIX_FMT_YUV420P16LE] = { 1, 1 },
136 [AV_PIX_FMT_YUV420P16BE] = { 1, 1 },
137 [AV_PIX_FMT_YUV422P16LE] = { 1, 1 },
138 [AV_PIX_FMT_YUV422P16BE] = { 1, 1 },
139 [AV_PIX_FMT_YUV444P16LE] = { 1, 1 },
140 [AV_PIX_FMT_YUV444P16BE] = { 1, 1 },
141 [AV_PIX_FMT_RGB444LE] = { 1, 1 },
142 [AV_PIX_FMT_RGB444BE] = { 1, 1 },
143 [AV_PIX_FMT_BGR444LE] = { 1, 1 },
144 [AV_PIX_FMT_BGR444BE] = { 1, 1 },
145 [AV_PIX_FMT_YA8] = { 1, 1 },
146 [AV_PIX_FMT_YA16BE] = { 1, 1 },
147 [AV_PIX_FMT_YA16LE] = { 1, 1 },
148 [AV_PIX_FMT_BGR48BE] = { 1, 1 },
149 [AV_PIX_FMT_BGR48LE] = { 1, 1 },
150 [AV_PIX_FMT_BGRA64BE] = { 1, 1, 1 },
151 [AV_PIX_FMT_BGRA64LE] = { 1, 1, 1 },
152 [AV_PIX_FMT_YUV420P9BE] = { 1, 1 },
153 [AV_PIX_FMT_YUV420P9LE] = { 1, 1 },
154 [AV_PIX_FMT_YUV420P10BE] = { 1, 1 },
155 [AV_PIX_FMT_YUV420P10LE] = { 1, 1 },
156 [AV_PIX_FMT_YUV420P12BE] = { 1, 1 },
157 [AV_PIX_FMT_YUV420P12LE] = { 1, 1 },
158 [AV_PIX_FMT_YUV420P14BE] = { 1, 1 },
159 [AV_PIX_FMT_YUV420P14LE] = { 1, 1 },
160 [AV_PIX_FMT_YUV422P9BE] = { 1, 1 },
161 [AV_PIX_FMT_YUV422P9LE] = { 1, 1 },
162 [AV_PIX_FMT_YUV422P10BE] = { 1, 1 },
163 [AV_PIX_FMT_YUV422P10LE] = { 1, 1 },
164 [AV_PIX_FMT_YUV422P12BE] = { 1, 1 },
165 [AV_PIX_FMT_YUV422P12LE] = { 1, 1 },
166 [AV_PIX_FMT_YUV422P14BE] = { 1, 1 },
167 [AV_PIX_FMT_YUV422P14LE] = { 1, 1 },
168 [AV_PIX_FMT_YUV444P9BE] = { 1, 1 },
169 [AV_PIX_FMT_YUV444P9LE] = { 1, 1 },
170 [AV_PIX_FMT_YUV444P10BE] = { 1, 1 },
171 [AV_PIX_FMT_YUV444P10LE] = { 1, 1 },
172 [AV_PIX_FMT_YUV444P12BE] = { 1, 1 },
173 [AV_PIX_FMT_YUV444P12LE] = { 1, 1 },
174 [AV_PIX_FMT_YUV444P14BE] = { 1, 1 },
175 [AV_PIX_FMT_YUV444P14LE] = { 1, 1 },
176 [AV_PIX_FMT_YUV444P10MSBBE] = { 1, 1 },
177 [AV_PIX_FMT_YUV444P10MSBLE] = { 1, 1 },
178 [AV_PIX_FMT_YUV444P12MSBBE] = { 1, 1 },
179 [AV_PIX_FMT_YUV444P12MSBLE] = { 1, 1 },
180 [AV_PIX_FMT_GBRP] = { 1, 1 },
181 [AV_PIX_FMT_GBRP9LE] = { 1, 1 },
182 [AV_PIX_FMT_GBRP9BE] = { 1, 1 },
183 [AV_PIX_FMT_GBRP10LE] = { 1, 1 },
184 [AV_PIX_FMT_GBRP10BE] = { 1, 1 },
185 [AV_PIX_FMT_GBRAP10LE] = { 1, 1 },
186 [AV_PIX_FMT_GBRAP10BE] = { 1, 1 },
187 [AV_PIX_FMT_GBRP10MSBLE] = { 1, 1 },
188 [AV_PIX_FMT_GBRP10MSBBE] = { 1, 1 },
189 [AV_PIX_FMT_GBRP12LE] = { 1, 1 },
190 [AV_PIX_FMT_GBRP12BE] = { 1, 1 },
191 [AV_PIX_FMT_GBRP12MSBLE] = { 1, 1 },
192 [AV_PIX_FMT_GBRP12MSBBE] = { 1, 1 },
193 [AV_PIX_FMT_GBRAP12LE] = { 1, 1 },
194 [AV_PIX_FMT_GBRAP12BE] = { 1, 1 },
195 [AV_PIX_FMT_GBRP14LE] = { 1, 1 },
196 [AV_PIX_FMT_GBRP14BE] = { 1, 1 },
197 [AV_PIX_FMT_GBRAP14LE] = { 1, 1 },
198 [AV_PIX_FMT_GBRAP14BE] = { 1, 1 },
199 [AV_PIX_FMT_GBRP16LE] = { 1, 1 },
200 [AV_PIX_FMT_GBRP16BE] = { 1, 1 },
201 [AV_PIX_FMT_GBRPF32LE] = { 1, 1 },
202 [AV_PIX_FMT_GBRPF32BE] = { 1, 1 },
203 [AV_PIX_FMT_GBRAPF32LE] = { 1, 1 },
204 [AV_PIX_FMT_GBRAPF32BE] = { 1, 1 },
205 [AV_PIX_FMT_GBRPF16LE] = { 1, 0 },
206 [AV_PIX_FMT_GBRPF16BE] = { 1, 0 },
207 [AV_PIX_FMT_GBRAPF16LE] = { 1, 0 },
208 [AV_PIX_FMT_GBRAPF16BE] = { 1, 0 },
209 [AV_PIX_FMT_GBRAP] = { 1, 1 },
210 [AV_PIX_FMT_GBRAP16LE] = { 1, 1 },
211 [AV_PIX_FMT_GBRAP16BE] = { 1, 1 },
212 [AV_PIX_FMT_BAYER_BGGR8] = { 1, 0 },
213 [AV_PIX_FMT_BAYER_RGGB8] = { 1, 0 },
214 [AV_PIX_FMT_BAYER_GBRG8] = { 1, 0 },
215 [AV_PIX_FMT_BAYER_GRBG8] = { 1, 0 },
216 [AV_PIX_FMT_BAYER_BGGR16LE] = { 1, 0 },
217 [AV_PIX_FMT_BAYER_BGGR16BE] = { 1, 0 },
218 [AV_PIX_FMT_BAYER_RGGB16LE] = { 1, 0 },
219 [AV_PIX_FMT_BAYER_RGGB16BE] = { 1, 0 },
220 [AV_PIX_FMT_BAYER_GBRG16LE] = { 1, 0 },
221 [AV_PIX_FMT_BAYER_GBRG16BE] = { 1, 0 },
222 [AV_PIX_FMT_BAYER_GRBG16LE] = { 1, 0 },
223 [AV_PIX_FMT_BAYER_GRBG16BE] = { 1, 0 },
224 [AV_PIX_FMT_XYZ12BE] = { 1, 1, 1 },
225 [AV_PIX_FMT_XYZ12LE] = { 1, 1, 1 },
226 [AV_PIX_FMT_AYUV64LE] = { 1, 1},
227 [AV_PIX_FMT_AYUV64BE] = { 1, 1 },
228 [AV_PIX_FMT_P010LE] = { 1, 1 },
229 [AV_PIX_FMT_P010BE] = { 1, 1 },
230 [AV_PIX_FMT_P012LE] = { 1, 1 },
231 [AV_PIX_FMT_P012BE] = { 1, 1 },
232 [AV_PIX_FMT_P016LE] = { 1, 1 },
233 [AV_PIX_FMT_P016BE] = { 1, 1 },
234 [AV_PIX_FMT_GRAYF32LE] = { 1, 1 },
235 [AV_PIX_FMT_GRAYF32BE] = { 1, 1 },
236 [AV_PIX_FMT_GRAYF16LE] = { 1, 0 },
237 [AV_PIX_FMT_GRAYF16BE] = { 1, 0 },
238 [AV_PIX_FMT_YAF32LE] = { 1, 0 },
239 [AV_PIX_FMT_YAF32BE] = { 1, 0 },
240 [AV_PIX_FMT_YAF16LE] = { 1, 0 },
241 [AV_PIX_FMT_YAF16BE] = { 1, 0 },
242 [AV_PIX_FMT_YUVA422P12BE] = { 1, 1 },
243 [AV_PIX_FMT_YUVA422P12LE] = { 1, 1 },
244 [AV_PIX_FMT_YUVA444P12BE] = { 1, 1 },
245 [AV_PIX_FMT_YUVA444P12LE] = { 1, 1 },
246 [AV_PIX_FMT_NV24] = { 1, 1 },
247 [AV_PIX_FMT_NV42] = { 1, 1 },
248 [AV_PIX_FMT_Y210LE] = { 1, 1 },
249 [AV_PIX_FMT_Y212LE] = { 1, 1 },
250 [AV_PIX_FMT_Y216LE] = { 1, 1 },
251 [AV_PIX_FMT_X2RGB10LE] = { 1, 1 },
252 [AV_PIX_FMT_X2BGR10LE] = { 1, 1 },
253 [AV_PIX_FMT_NV20BE] = { 1, 1 },
254 [AV_PIX_FMT_NV20LE] = { 1, 1 },
255 [AV_PIX_FMT_P210BE] = { 1, 1 },
256 [AV_PIX_FMT_P210LE] = { 1, 1 },
257 [AV_PIX_FMT_P212BE] = { 1, 1 },
258 [AV_PIX_FMT_P212LE] = { 1, 1 },
259 [AV_PIX_FMT_P410BE] = { 1, 1 },
260 [AV_PIX_FMT_P410LE] = { 1, 1 },
261 [AV_PIX_FMT_P412BE] = { 1, 1 },
262 [AV_PIX_FMT_P412LE] = { 1, 1 },
263 [AV_PIX_FMT_P216BE] = { 1, 1 },
264 [AV_PIX_FMT_P216LE] = { 1, 1 },
265 [AV_PIX_FMT_P416BE] = { 1, 1 },
266 [AV_PIX_FMT_P416LE] = { 1, 1 },
267 [AV_PIX_FMT_NV16] = { 1, 1 },
268 [AV_PIX_FMT_VUYA] = { 1, 1 },
269 [AV_PIX_FMT_VUYX] = { 1, 1 },
270 [AV_PIX_FMT_RGBAF16BE] = { 1, 0 },
271 [AV_PIX_FMT_RGBAF16LE] = { 1, 0 },
272 [AV_PIX_FMT_RGBF16BE] = { 1, 0 },
273 [AV_PIX_FMT_RGBF16LE] = { 1, 0 },
274 [AV_PIX_FMT_RGBF32BE] = { 1, 0 },
275 [AV_PIX_FMT_RGBF32LE] = { 1, 0 },
276 [AV_PIX_FMT_XV30LE] = { 1, 1 },
277 [AV_PIX_FMT_XV36LE] = { 1, 1 },
278 [AV_PIX_FMT_XV36BE] = { 1, 1 },
279 [AV_PIX_FMT_XV48LE] = { 1, 1 },
280 [AV_PIX_FMT_XV48BE] = { 1, 1 },
281 [AV_PIX_FMT_AYUV] = { 1, 1 },
282 [AV_PIX_FMT_UYVA] = { 1, 1 },
283 [AV_PIX_FMT_VYU444] = { 1, 1 },
284 [AV_PIX_FMT_V30XLE] = { 1, 1 },
285};
286
288{
289 return (unsigned)pix_fmt < FF_ARRAY_ELEMS(legacy_format_entries) ?
290 legacy_format_entries[pix_fmt].is_supported_in : 0;
291}
292
294{
295 return (unsigned)pix_fmt < FF_ARRAY_ELEMS(legacy_format_entries) ?
296 legacy_format_entries[pix_fmt].is_supported_out : 0;
297}
298
300{
301 return (unsigned)pix_fmt < FF_ARRAY_ELEMS(legacy_format_entries) ?
302 legacy_format_entries[pix_fmt].is_supported_endianness : 0;
303}
304
306{
308 /* RGB-like family */
309 fmt->csp = AVCOL_SPC_RGB;
310 fmt->range = AVCOL_RANGE_JPEG;
311 } else if (desc->flags & AV_PIX_FMT_FLAG_XYZ) {
313 fmt->color = (SwsColor) {
314 .prim = AVCOL_PRI_BT709, /* swscale currently hard-codes this XYZ matrix */
315 .trc = AVCOL_TRC_SMPTE428,
316 };
317 } else if (desc->nb_components < 3) {
318 /* Grayscale formats */
321 if (desc->flags & AV_PIX_FMT_FLAG_FLOAT)
323 else
324 fmt->range = AVCOL_RANGE_JPEG; // FIXME: this restriction should be lifted
325 }
326
327 switch (av_pix_fmt_desc_get_id(desc)) {
333 fmt->range = AVCOL_RANGE_JPEG;
334 break;
335 }
336
337 if (!desc->log2_chroma_w && !desc->log2_chroma_h)
339}
340
341/**
342 * This function also sanitizes and strips the input data, removing irrelevant
343 * fields for certain formats.
344 */
346{
348 AVFrameSideData *sd;
349
350 enum AVPixelFormat format = frame->format;
351 enum AVPixelFormat hw_format = AV_PIX_FMT_NONE;
352
353#if CONFIG_UNSTABLE
354 const AVPixFmtDescriptor *hw_desc = av_pix_fmt_desc_get(frame->format);
355 av_assert0(hw_desc);
356
357 if (hw_desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
358 av_assert0(frame->hw_frames_ctx);
359
360 AVHWFramesContext *hwfc = (AVHWFramesContext *)frame->hw_frames_ctx->data;
361 hw_format = frame->format;
362 format = hwfc->sw_format;
363 }
364#endif
365
367
368 SwsFormat fmt = {
369 .width = frame->width,
370 .height = frame->height,
371 .format = format,
372 .hw_format = hw_format,
373 .range = frame->color_range,
374 .csp = frame->colorspace,
375 .loc = frame->chroma_location,
376 .desc = desc,
377 .color = {
378 .prim = frame->color_primaries,
379 .trc = frame->color_trc,
380 },
381 };
382
383 av_assert1(fmt.width > 0);
384 av_assert1(fmt.height > 0);
387 sanitize_fmt(&fmt, desc);
388
389 if (frame->flags & AV_FRAME_FLAG_INTERLACED) {
390 fmt.height = (fmt.height + (field == FIELD_TOP)) >> 1;
391 fmt.interlaced = 1;
392 fmt.field = field;
393 }
394
395 /* Set luminance and gamut information */
396 fmt.color.min_luma = av_make_q(0, 1);
397 switch (fmt.color.trc) {
399 fmt.color.max_luma = av_make_q(10000, 1); break;
401 fmt.color.max_luma = av_make_q( 1000, 1); break; /* HLG reference display */
402 default:
403 fmt.color.max_luma = av_make_q( 203, 1); break; /* SDR reference brightness */
404 }
405
407 if (primaries)
408 fmt.color.gamut = primaries->prim;
409
412 if (mdm->has_luminance) {
413 fmt.color.min_luma = mdm->min_luminance;
414 fmt.color.max_luma = mdm->max_luminance;
415 }
416
417 if (mdm->has_primaries) {
418 /* Ignore mastering display white point as it has no bearance on
419 * the underlying content */
420 fmt.color.gamut.r.x = mdm->display_primaries[0][0];
421 fmt.color.gamut.r.y = mdm->display_primaries[0][1];
422 fmt.color.gamut.g.x = mdm->display_primaries[1][0];
423 fmt.color.gamut.g.y = mdm->display_primaries[1][1];
424 fmt.color.gamut.b.x = mdm->display_primaries[2][0];
425 fmt.color.gamut.b.y = mdm->display_primaries[2][1];
426 }
427 }
428
430 const AVDynamicHDRPlus *dhp = (const AVDynamicHDRPlus *) sd->data;
431 const AVHDRPlusColorTransformParams *pars = &dhp->params[0];
432 const AVRational nits = av_make_q(10000, 1);
433 AVRational maxrgb = pars->maxscl[0];
434
435 if (!dhp->num_windows || dhp->application_version > 1)
436 goto skip_hdr10;
437
438 /* Maximum of MaxSCL components */
439 if (av_cmp_q(pars->maxscl[1], maxrgb) > 0)
440 maxrgb = pars->maxscl[1];
441 if (av_cmp_q(pars->maxscl[2], maxrgb) > 0)
442 maxrgb = pars->maxscl[2];
443
444 if (maxrgb.num > 0) {
445 /* Estimate true luminance from MaxSCL */
447 if (!luma)
448 goto skip_hdr10;
449 fmt.color.frame_peak = av_add_q(av_mul_q(luma->cr, pars->maxscl[0]),
450 av_add_q(av_mul_q(luma->cg, pars->maxscl[1]),
451 av_mul_q(luma->cb, pars->maxscl[2])));
452 /* Scale the scene average brightness by the ratio between the
453 * maximum luminance and the MaxRGB values */
455 av_div_q(fmt.color.frame_peak, maxrgb));
456 } else {
457 /**
458 * Calculate largest value from histogram to use as fallback for
459 * clips with missing MaxSCL information. Note that this may end
460 * up picking the "reserved" value at the 5% percentile, which in
461 * practice appears to track the brightest pixel in the scene.
462 */
463 for (int i = 0; i < pars->num_distribution_maxrgb_percentiles; i++) {
464 const AVRational pct = pars->distribution_maxrgb[i].percentile;
465 if (av_cmp_q(pct, maxrgb) > 0)
466 maxrgb = pct;
467 fmt.color.frame_peak = maxrgb;
468 fmt.color.frame_avg = pars->average_maxrgb;
469 }
470 }
471
472 /* Rescale to nits */
473 fmt.color.frame_peak = av_mul_q(nits, fmt.color.frame_peak);
474 fmt.color.frame_avg = av_mul_q(nits, fmt.color.frame_avg);
475 }
476skip_hdr10:
477
478 /* PQ is always scaled down to absolute zero, so ignore mastering metadata */
479 if (fmt.color.trc == AVCOL_TRC_SMPTE2084)
480 fmt.color.min_luma = av_make_q(0, 1);
481
482 return fmt;
483}
484
486{
487 ff_fmt_clear(fmt);
488 fmt->format = pixfmt;
490 sanitize_fmt(fmt, fmt->desc);
491}
492
493static int infer_prim_ref(SwsColor *csp, const SwsColor *ref)
494{
495 if (csp->prim != AVCOL_PRI_UNSPECIFIED)
496 return 0;
497
498 /* Reuse the reference gamut only for "safe", similar primaries */
499 switch (ref->prim) {
500 case AVCOL_PRI_BT709:
501 case AVCOL_PRI_BT470M:
505 csp->prim = ref->prim;
506 csp->gamut = ref->gamut;
507 break;
508 default:
509 csp->prim = AVCOL_PRI_BT709;
511 break;
512 }
513
514 return 1;
515}
516
517static int infer_trc_ref(SwsColor *csp, const SwsColor *ref)
518{
519 if (csp->trc != AVCOL_TRC_UNSPECIFIED)
520 return 0;
521
522 /* Pick a suitable SDR transfer function, to try and minimize conversions */
523 switch (ref->trc) {
525 /* HDR curves, never default to these */
528 csp->trc = AVCOL_TRC_BT709;
529 csp->min_luma = av_make_q(0, 1);
530 csp->max_luma = av_make_q(203, 1);
531 break;
532 default:
533 csp->trc = ref->trc;
534 csp->min_luma = ref->min_luma;
535 csp->max_luma = ref->max_luma;
536 break;
537 }
538
539 return 1;
540}
541
543{
544 int incomplete = 0;
545
546 incomplete |= infer_prim_ref(dst, src);
547 incomplete |= infer_prim_ref(src, dst);
550
551 incomplete |= infer_trc_ref(dst, src);
552 incomplete |= infer_trc_ref(src, dst);
555
556 return incomplete;
557}
558
559void ff_sws_chroma_pos(const SwsFormat *fmt, bool *incomplete,
560 int *out_x_pos, int *out_y_pos)
561{
562 enum AVChromaLocation chroma_loc = fmt->loc;
563 const int sub_x = fmt->desc->log2_chroma_w;
564 const int sub_y = fmt->desc->log2_chroma_h;
565 int x_pos, y_pos;
566
567 /* Explicitly default to center siting for compatibility with swscale */
568 if (chroma_loc == AVCHROMA_LOC_UNSPECIFIED) {
569 chroma_loc = AVCHROMA_LOC_CENTER;
570 *incomplete |= sub_x || sub_y;
571 }
572
573 /* av_chroma_location_enum_to_pos() always gives us values in the range from
574 * 0 to 256, but we need to adjust this to the true value range of the
575 * subsampling grid, which may be larger for h/v_sub > 1 */
576 av_chroma_location_enum_to_pos(&x_pos, &y_pos, chroma_loc);
577 x_pos *= (1 << sub_x) - 1;
578 y_pos *= (1 << sub_y) - 1;
579
580 /* Fix vertical chroma position for interlaced frames */
581 if (sub_y && fmt->interlaced) {
582 /* When vertically subsampling, chroma samples are effectively only
583 * placed next to even rows. To access them from the odd field, we need
584 * to account for this shift by offsetting the distance of one luma row.
585 *
586 * For 4x vertical subsampling (v_sub == 2), they are only placed
587 * next to every *other* even row, so we need to shift by three luma
588 * rows to get to the chroma sample. */
589 if (fmt->field == FIELD_BOTTOM)
590 y_pos += (256 << sub_y) - 256;
591
592 /* Luma row distance is doubled for fields, so halve offsets */
593 y_pos >>= 1;
594 }
595
596 *out_x_pos = x_pos;
597 *out_y_pos = y_pos;
598}
599
600/* Variant of sws_test_format() for the ops-based code */
601static int test_format_ops(enum AVPixelFormat format, int output);
602static int test_format_legacy(enum AVPixelFormat format, int output)
603{
605}
606
608 enum AVPixelFormat format, int output)
609{
610 /* The only non-ops backend is the legacy backend */
611 const SwsBackend backends_ops = SWS_BACKEND_ALL ^ SWS_BACKEND_LEGACY;
612 return ((backends & SWS_BACKEND_LEGACY) && test_format_legacy(format, output)) ||
613 ((backends & backends_ops) && test_format_ops(format, output));
614}
615
617{
619}
620
622{
623 switch (format) {
624 case AV_PIX_FMT_NONE: return 1;
625#if CONFIG_VULKAN
626 case AV_PIX_FMT_VULKAN: return 1;
627#endif
628 default: return 0;
629 }
630}
631
632int sws_test_colorspace(enum AVColorSpace csp, int output)
633{
634 switch (csp) {
636 case AVCOL_SPC_RGB:
637 case AVCOL_SPC_BT709:
640 case AVCOL_SPC_FCC:
643 return 1;
644 default:
645 return 0;
646 }
647}
648
649int sws_test_primaries(enum AVColorPrimaries prim, int output)
650{
651 return ((prim > AVCOL_PRI_RESERVED0 && prim < AVCOL_PRI_NB) ||
652 (prim >= AVCOL_PRI_EXT_BASE && prim < AVCOL_PRI_EXT_NB)) &&
653 prim != AVCOL_PRI_RESERVED;
654}
655
657{
658 av_csp_eotf_function eotf = output ? av_csp_itu_eotf_inv(trc)
659 : av_csp_itu_eotf(trc);
660 return trc == AVCOL_TRC_UNSPECIFIED || eotf != NULL;
661}
662
664{
665 return (unsigned)range < AVCOL_RANGE_NB;
666}
667
668static int test_loc(enum AVChromaLocation loc)
669{
670 return (unsigned)loc < AVCHROMA_LOC_NB;
671}
672
673int ff_test_fmt(const SwsBackend backends, const SwsFormat *fmt, int output)
674{
675 return fmt->width > 0 && fmt->height > 0 &&
676 ff_sws_test_pixfmt_backend(backends, fmt->format, output) &&
677 sws_test_colorspace(fmt->csp, output) &&
678 sws_test_primaries (fmt->color.prim, output) &&
679 sws_test_transfer (fmt->color.trc, output) &&
681 test_range (fmt->range) &&
682 test_loc (fmt->loc);
683}
684
685int sws_test_frame(const AVFrame *frame, int output)
686{
687 for (int field = 0; field < 2; field++) {
688 const SwsFormat fmt = ff_fmt_from_frame(frame, field);
689 if (!ff_test_fmt(SWS_BACKEND_STABLE, &fmt, output))
690 return 0;
691 if (!fmt.interlaced)
692 break;
693 }
694
695 return 1;
696}
697
698int sws_is_noop(const AVFrame *dst, const AVFrame *src)
699{
700 for (int field = 0; field < 2; field++) {
701 SwsFormat dst_fmt = ff_fmt_from_frame(dst, field);
702 SwsFormat src_fmt = ff_fmt_from_frame(src, field);
703 if (!ff_fmt_equal(&dst_fmt, &src_fmt))
704 return 0;
705 if (!dst_fmt.interlaced)
706 break;
707 }
708
709 return 1;
710}
711
713{
714 dst->format = src->format;
715 dst->width = src->width;
716 dst->height = src->height;
717 dst->avframe = src;
718 for (int i = 0; i < FF_ARRAY_ELEMS(dst->data); i++) {
719 dst->data[i] = src->data[i];
720 dst->linesize[i] = src->linesize[i];
721 }
722}
723
724#if CONFIG_UNSTABLE
725
726/**
727 * Returns the underlying descriptor for fake formats like PAL8 whose
728 * descriptors alone do not fully describe the pixel data.
729 */
730static inline const AVPixFmtDescriptor *fmt_desc_decoded(enum AVPixelFormat fmt)
731{
732 if (fmt == AV_PIX_FMT_PAL8)
734
737 return desc;
738}
739
740/* Returns the type suitable for a pixel after fully decoding/unpacking it */
741static SwsPixelType fmt_pixel_type(enum AVPixelFormat fmt)
742{
743 const AVPixFmtDescriptor *desc = fmt_desc_decoded(fmt);
744 const int bits = FFALIGN(desc->comp[0].depth, 8);
745 if (desc->flags & AV_PIX_FMT_FLAG_FLOAT) {
746 switch (bits) {
747 case 32: return SWS_PIXEL_F32;
748 /* TODO: no support for 16-bit float yet */
749 }
750 } else {
751 switch (bits) {
752 case 8: return SWS_PIXEL_U8;
753 case 16: return SWS_PIXEL_U16;
754 /* TODO: AVRational cannot represent UINT32_MAX */
755 }
756 }
757
758 return SWS_PIXEL_NONE;
759}
760
761/* A regular format is defined as any format that contains only a single
762 * component per elementary data type (i.e. no sub-byte pack/unpack needed),
763 * and whose components map 1:1 onto elementary data units */
764static int is_regular_fmt(enum AVPixelFormat fmt)
765{
768 return 0; /* no 1:1 correspondence between components and data units */
769 if (desc->flags & (AV_PIX_FMT_FLAG_BITSTREAM))
770 return 0; /* bitstream formats are packed by definition */
771 if ((desc->flags & AV_PIX_FMT_FLAG_PLANAR) || desc->nb_components == 1)
772 return 1; /* planar formats are regular by definition */
773
774 const int step = desc->comp[0].step;
775 int total_bits = 0;
776
777 for (int i = 0; i < desc->nb_components; i++) {
778 if (desc->comp[i].shift || desc->comp[i].step != step)
779 return 0; /* irregular/packed format */
780 total_bits += desc->comp[i].depth;
781 }
782
783 /* Exclude formats with missing components like RGB0, 0RGB, etc. */
784 return total_bits == step * 8;
785}
786
787typedef struct FmtInfo {
788 SwsReadWriteOp rw;
789 SwsSwizzleOp swizzle;
790 SwsPackOp pack;
791 int shift;
792} FmtInfo;
793
794#define BITSTREAM_FMT(SWIZ, FRAC, MODE, ...) (FmtInfo) { \
795 .rw = { .elems = 1, .frac = FRAC, .mode = MODE }, \
796 .swizzle = SWIZ, \
797 __VA_ARGS__ \
798}
799
800#define SUBPACKED_FMT(SWIZ, ...) (FmtInfo) { \
801 .rw = { .elems = 1, .mode = SWS_RW_PACKED }, \
802 .swizzle = SWIZ, \
803 .pack.pattern = {__VA_ARGS__}, \
804}
805
806#define PACKED_FMT(SWIZ, N, ...) (FmtInfo) { \
807 .rw = { .elems = N, .mode = SWS_RW_PACKED }, \
808 .swizzle = SWIZ, \
809 __VA_ARGS__ \
810}
811
812#define RGBA SWS_SWIZZLE(0, 1, 2, 3)
813#define BGRA SWS_SWIZZLE(2, 1, 0, 3)
814#define ARGB SWS_SWIZZLE(3, 0, 1, 2)
815#define ABGR SWS_SWIZZLE(3, 2, 1, 0)
816#define AVYU SWS_SWIZZLE(3, 2, 0, 1)
817#define VYUA SWS_SWIZZLE(2, 0, 1, 3)
818#define UYVA SWS_SWIZZLE(1, 0, 2, 3)
819#define VUYA BGRA
820
821static FmtInfo fmt_info_irregular(enum AVPixelFormat fmt)
822{
823 switch (fmt) {
824 /* Bitstream formats */
827 return BITSTREAM_FMT(RGBA, 3, SWS_RW_PLANAR);
828 case AV_PIX_FMT_RGB4: return BITSTREAM_FMT(RGBA, 1, SWS_RW_PACKED, .pack = {{ 1, 2, 1 }});
829 case AV_PIX_FMT_BGR4: return BITSTREAM_FMT(BGRA, 1, SWS_RW_PACKED, .pack = {{ 1, 2, 1 }});
830
831 /* Sub-packed 8-bit aligned formats */
832 case AV_PIX_FMT_RGB4_BYTE: return SUBPACKED_FMT(RGBA, 1, 2, 1);
833 case AV_PIX_FMT_BGR4_BYTE: return SUBPACKED_FMT(BGRA, 1, 2, 1);
834 case AV_PIX_FMT_RGB8: return SUBPACKED_FMT(RGBA, 3, 3, 2);
835 case AV_PIX_FMT_BGR8: return SUBPACKED_FMT(BGRA, 2, 3, 3);
836
837 /* Sub-packed 16-bit aligned formats */
840 return SUBPACKED_FMT(RGBA, 5, 6, 5);
843 return SUBPACKED_FMT(BGRA, 5, 6, 5);
846 return SUBPACKED_FMT(RGBA, 5, 5, 5);
849 return SUBPACKED_FMT(BGRA, 5, 5, 5);
852 return SUBPACKED_FMT(RGBA, 4, 4, 4);
855 return SUBPACKED_FMT(BGRA, 4, 4, 4);
856
857 /* Sub-packed 32-bit aligned formats */
860 return SUBPACKED_FMT(ARGB, 2, 10, 10, 10);
863 return SUBPACKED_FMT(ABGR, 2, 10, 10, 10);
866 return SUBPACKED_FMT(AVYU, 2, 10, 10, 10);
869 return SUBPACKED_FMT(VYUA, 10, 10, 10, 2);
870
871 /* 3-component formats with extra padding */
872 case AV_PIX_FMT_RGB0: return PACKED_FMT(RGBA, 4);
873 case AV_PIX_FMT_BGR0: return PACKED_FMT(BGRA, 4);
874 case AV_PIX_FMT_0RGB: return PACKED_FMT(ARGB, 4);
875 case AV_PIX_FMT_0BGR: return PACKED_FMT(ABGR, 4);
876 case AV_PIX_FMT_VUYX: return PACKED_FMT(VUYA, 4);
879 return PACKED_FMT(UYVA, 4, .shift = 4);
882 return PACKED_FMT(UYVA, 4);
883
884 /* Miscellaneous irregular formats */
885 case AV_PIX_FMT_PAL8:
886 return (FmtInfo) {
887 .rw = { .elems = 4, .mode = SWS_RW_PALETTE },
888 /* PAL8 is explicitly defined as endian-dependent */
889 #if AV_HAVE_BIGENDIAN
890 .swizzle = ARGB,
891 #else
892 .swizzle = BGRA,
893 #endif
894 };
895 }
896
897 return (FmtInfo) {0};
898}
899
900struct comp {
901 int index;
902 int plane;
903 int offset;
904};
905
906/* Compare by (plane, offset) */
907static int cmp_comp(const void *a, const void *b) {
908 const struct comp *ca = a;
909 const struct comp *cb = b;
910 if (ca->plane != cb->plane)
911 return ca->plane - cb->plane;
912 return ca->offset - cb->offset;
913}
914
915static int fmt_analyze_regular(const AVPixFmtDescriptor *desc, SwsReadWriteOp *rw_op,
916 SwsSwizzleOp *swizzle, SwsShiftOp *shift)
917{
918 if (desc->nb_components == 2) {
919 /* YA formats */
920 *swizzle = SWS_SWIZZLE(0, 3, 1, 2);
921 } else {
922 /* Sort by increasing component order */
923 struct comp sorted[4] = { {0}, {1}, {2}, {3} };
924 for (int i = 0; i < desc->nb_components; i++) {
925 sorted[i].plane = desc->comp[i].plane;
926 sorted[i].offset = desc->comp[i].offset;
927 }
928
929 qsort(sorted, desc->nb_components, sizeof(struct comp), cmp_comp);
930
931 SwsSwizzleOp swiz = SWS_SWIZZLE(0, 1, 2, 3);
932 for (int i = 0; i < desc->nb_components; i++)
933 swiz.in[i] = sorted[i].index;
934 *swizzle = swiz;
935 }
936
938 if (desc->nb_components > 1 && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR))
940
941 *shift = (SwsShiftOp) { desc->comp[0].shift };
942 *rw_op = (SwsReadWriteOp) {
943 .elems = desc->nb_components,
944 .mode = mode,
945 };
946 return 0;
947}
948
949static int fmt_analyze(enum AVPixelFormat fmt, SwsReadWriteOp *rw_op,
950 SwsPackOp *pack_op, SwsSwizzleOp *swizzle,
951 SwsShiftOp *shift, SwsPixelType *pixel_type,
952 SwsPixelType *raw_type)
953{
955 if (!desc)
956 return AVERROR(EINVAL);
957
958 /* No support for subsampled formats at the moment */
959 if (desc->log2_chroma_w || desc->log2_chroma_h)
960 return AVERROR(ENOTSUP);
961
962 /* No support for semi-planar formats at the moment */
963 if (desc->flags & AV_PIX_FMT_FLAG_PLANAR &&
964 av_pix_fmt_count_planes(fmt) < desc->nb_components)
965 return AVERROR(ENOTSUP);
966
967 *pixel_type = *raw_type = fmt_pixel_type(fmt);
968 if (!*pixel_type)
969 return AVERROR(ENOTSUP);
970
971 if (is_regular_fmt(fmt)) {
972 *pack_op = (SwsPackOp) {0};
973 return fmt_analyze_regular(desc, rw_op, swizzle, shift);
974 }
975
976 FmtInfo info = fmt_info_irregular(fmt);
977 if (!info.rw.elems)
978 return AVERROR(ENOTSUP);
979
980 *rw_op = info.rw;
981 *pack_op = info.pack;
982 *swizzle = info.swizzle;
983 *shift = (SwsShiftOp) { info.shift };
984
985 if (info.pack.pattern[0]) {
986 const int sum = info.pack.pattern[0] + info.pack.pattern[1] +
987 info.pack.pattern[2] + info.pack.pattern[3];
988 if (sum > 16)
989 *raw_type = SWS_PIXEL_U32;
990 else if (sum > 8)
991 *raw_type = SWS_PIXEL_U16;
992 else
993 *raw_type = SWS_PIXEL_U8;
994 }
995
996 return 0;
997}
998
999static int test_format_ops(enum AVPixelFormat format, int output)
1000{
1001 SwsReadWriteOp rw;
1002 SwsSwizzleOp swizzle;
1003 SwsPackOp pack;
1005 SwsPixelType pixel_type, raw_type;
1006 int ret = fmt_analyze(format, &rw, &pack, &swizzle, &shift,
1007 &pixel_type, &raw_type);
1008 if (ret < 0)
1009 return 0;
1010 if (rw.mode == SWS_RW_PALETTE && output)
1011 return 0; /* palettes are currently only supported as input */
1012 return 1;
1013}
1014
1015static void swizzle_inv(SwsSwizzleOp *swiz)
1016{
1017 /* Input[x] =: Output[swizzle.x] */
1018 unsigned tmp[4];
1019 tmp[swiz->x] = 0;
1020 tmp[swiz->y] = 1;
1021 tmp[swiz->z] = 2;
1022 tmp[swiz->w] = 3;
1023 *swiz = (SwsSwizzleOp) {{ .x = tmp[0], tmp[1], tmp[2], tmp[3] }};
1024}
1025
1026/**
1027 * This initializes all absent components explicitly to zero. There is no
1028 * need to worry about the correct neutral value as fmt_decode() will
1029 * implicitly ignore and overwrite absent components in any case. This function
1030 * is just to ensure that we don't operate on undefined memory. In most cases,
1031 * it will end up getting pushed towards the output or optimized away entirely
1032 * by the optimization pass.
1033 */
1034static SwsClearOp fmt_clear(const SwsFormat *fmt)
1035{
1036 const AVPixFmtDescriptor *desc = fmt_desc_decoded(fmt->format);
1037 const bool has_chroma = desc->nb_components >= 3;
1038 const bool has_alpha = desc->flags & AV_PIX_FMT_FLAG_ALPHA;
1039
1040 SwsClearOp c = {0};
1041 if (!has_chroma) {
1042 c.mask |= SWS_COMP(1) | SWS_COMP(2);
1043 c.value[1] = c.value[2] = Q(0);
1044 }
1045
1046 if (!has_alpha) {
1047 c.mask |= SWS_COMP(3);
1048 c.value[3] = Q(0);
1049 }
1050
1051 return c;
1052}
1053
1054#if HAVE_BIGENDIAN
1055# define NATIVE_ENDIAN_FLAG AV_PIX_FMT_FLAG_BE
1056#else
1057# define NATIVE_ENDIAN_FLAG 0
1058#endif
1059
1060static inline AVRational64 intmax_q64(int bits)
1061{
1062 av_assert1(bits >= 0 && bits < 64);
1063 return Q(UINT64_MAX >> (64 - bits));
1064}
1065
1066int ff_sws_decode_pixfmt(SwsOpList *ops, const SwsFormat *fmt)
1067{
1068 const AVPixFmtDescriptor *desc = fmt_desc_decoded(fmt->format);
1069 SwsPixelType pixel_type, raw_type;
1070 SwsReadWriteOp rw_op;
1071 SwsSwizzleOp swizzle;
1073 SwsComps *comps = &ops->comps_src;
1075
1076 RET(fmt_analyze(fmt->format, &rw_op, &unpack, &swizzle, &shift,
1077 &pixel_type, &raw_type));
1078
1079 swizzle_inv(&swizzle);
1080
1081 /* Set baseline pixel content flags */
1082 const int integer = ff_sws_pixel_type_is_int(raw_type);
1083 const int swapped = ff_sws_pixel_type_size(raw_type) > 1 &&
1084 (desc->flags & AV_PIX_FMT_FLAG_BE) != NATIVE_ENDIAN_FLAG;
1085 for (int i = 0; i < rw_op.elems; i++) {
1086 comps->flags[i] = (integer ? SWS_COMP_EXACT : 0) |
1087 (swapped ? SWS_COMP_SWAPPED : 0);
1088 }
1089
1090 /* Generate value range information for simple unpacked formats */
1091 if (integer && !unpack.pattern[0]) {
1092 /* YA formats have desc->comp[] in the order {Y, A} instead of the
1093 * canonical order {Y, U, V, A} */
1094 const int is_ya = desc->nb_components == 2;
1095 for (int c = 0; c < desc->nb_components; c++) {
1096 const int bits = desc->comp[c].depth + shift.amount;
1097 const int idx = swizzle.in[is_ya ? 3 * c : c];
1098 comps->min[idx] = Q(0);
1099 comps->max[idx] = intmax_q64(bits);
1100 }
1101 }
1102
1103 /* TODO: handle subsampled or semipacked input formats */
1105 .op = SWS_OP_READ,
1106 .type = raw_type,
1107 .rw = rw_op,
1108 }));
1109
1110 if (swapped) {
1112 .op = SWS_OP_SWAP_BYTES,
1113 .type = raw_type,
1114 }));
1115 }
1116
1117 if (unpack.pattern[0]) {
1119 .op = SWS_OP_UNPACK,
1120 .type = raw_type,
1121 .pack = unpack,
1122 }));
1123
1125 .op = SWS_OP_CONVERT,
1126 .type = raw_type,
1127 .convert.to = pixel_type,
1128 }));
1129 }
1130
1132 .op = SWS_OP_SWIZZLE,
1133 .type = pixel_type,
1134 .swizzle = swizzle,
1135 }));
1136
1137 if (shift.amount) {
1139 .op = SWS_OP_RSHIFT,
1140 .type = pixel_type,
1141 .shift = shift,
1142 }));
1143 }
1144
1146 .op = SWS_OP_CLEAR,
1147 .type = pixel_type,
1148 .clear = fmt_clear(fmt),
1149 }));
1150
1151 return 0;
1152}
1153
1154int ff_sws_encode_pixfmt(SwsOpList *ops, const SwsFormat *fmt)
1155{
1156 const AVPixFmtDescriptor *desc = fmt_desc_decoded(fmt->format);
1157 SwsPixelType pixel_type, raw_type;
1158 SwsReadWriteOp rw_op;
1159 SwsSwizzleOp swizzle;
1160 SwsPackOp pack;
1162
1163 RET(fmt_analyze(fmt->format, &rw_op, &pack, &swizzle, &shift,
1164 &pixel_type, &raw_type));
1165
1166 if (rw_op.mode == SWS_RW_PALETTE)
1167 return AVERROR(ENOTSUP);
1168
1169 if (shift.amount) {
1171 .op = SWS_OP_LSHIFT,
1172 .type = pixel_type,
1173 .shift = shift,
1174 }));
1175 }
1176
1177 if (rw_op.elems > desc->nb_components) {
1178 /* Format writes unused alpha channel, clear it explicitly for sanity */
1181 .op = SWS_OP_CLEAR,
1182 .type = pixel_type,
1183 .clear.mask = SWS_COMP(3),
1184 .clear.value[3] = Q(0),
1185 }));
1186 }
1187
1189 .op = SWS_OP_SWIZZLE,
1190 .type = pixel_type,
1191 .swizzle = swizzle,
1192 }));
1193
1194 if (pack.pattern[0]) {
1196 .op = SWS_OP_CONVERT,
1197 .type = pixel_type,
1198 .convert.to = raw_type,
1199 }));
1200
1202 .op = SWS_OP_PACK,
1203 .type = raw_type,
1204 .pack = pack,
1205 }));
1206 }
1207
1208 if (ff_sws_pixel_type_size(raw_type) > 1 &&
1209 (desc->flags & AV_PIX_FMT_FLAG_BE) != NATIVE_ENDIAN_FLAG) {
1211 .op = SWS_OP_SWAP_BYTES,
1212 .type = raw_type,
1213 }));
1214 }
1215
1217 .op = SWS_OP_WRITE,
1218 .type = raw_type,
1219 .rw = rw_op,
1220 }));
1221
1222 return 0;
1223}
1224
1225static inline AVRational64 av_neg_q64(AVRational64 x)
1226{
1227 return (AVRational64) { -x.num, x.den };
1228}
1229
1230static SwsLinearOp fmt_encode_range(const SwsFormat *fmt, bool *incomplete)
1231{
1232 const AVRational64 q0 = Q(0);
1233 const AVRational64 q1 = Q(1);
1234
1235 SwsLinearOp c = { .m = {
1236 { q1, q0, q0, q0, q0 },
1237 { q0, q1, q0, q0, q0 },
1238 { q0, q0, q1, q0, q0 },
1239 { q0, q0, q0, q1, q0 },
1240 }};
1241
1242 const AVPixFmtDescriptor *desc = fmt_desc_decoded(fmt->format);
1243 const int depth0 = desc->comp[0].depth;
1244 const int depth1 = desc->comp[1].depth;
1245 const int depth2 = desc->comp[2].depth;
1246 const int depth3 = desc->comp[3].depth;
1247
1248 if (desc->flags & AV_PIX_FMT_FLAG_FLOAT)
1249 return c; /* floats are directly output as-is */
1250
1251 if (fmt->csp == AVCOL_SPC_RGB || (desc->flags & AV_PIX_FMT_FLAG_XYZ)) {
1252 c.m[0][0] = intmax_q64(depth0);
1253 c.m[1][1] = intmax_q64(depth1);
1254 c.m[2][2] = intmax_q64(depth2);
1255 } else if (fmt->range == AVCOL_RANGE_JPEG) {
1256 /* Full range YUV */
1257 c.m[0][0] = intmax_q64(depth0);
1258 if (desc->nb_components >= 3) {
1259 /* This follows the ITU-R convention, which is slightly different
1260 * from the JFIF convention. */
1261 c.m[1][1] = intmax_q64(depth1);
1262 c.m[2][2] = intmax_q64(depth2);
1263 c.m[1][4] = Q(1 << (depth1 - 1));
1264 c.m[2][4] = Q(1 << (depth2 - 1));
1265 }
1266 } else {
1267 /* Limited range YUV */
1268 if (fmt->range == AVCOL_RANGE_UNSPECIFIED)
1269 *incomplete = true;
1270 c.m[0][0] = Q(219 << (depth0 - 8));
1271 c.m[0][4] = Q( 16 << (depth0 - 8));
1272 if (desc->nb_components >= 3) {
1273 c.m[1][1] = Q(224 << (depth1 - 8));
1274 c.m[2][2] = Q(224 << (depth2 - 8));
1275 c.m[1][4] = Q(128 << (depth1 - 8));
1276 c.m[2][4] = Q(128 << (depth2 - 8));
1277 }
1278 }
1279
1280 if (desc->flags & AV_PIX_FMT_FLAG_ALPHA) {
1281 const bool is_ya = desc->nb_components == 2;
1282 c.m[3][3] = intmax_q64(is_ya ? depth1 : depth3);
1283 }
1284
1285 if (fmt->format == AV_PIX_FMT_MONOWHITE) {
1286 /* This format is inverted, 0 = white, 1 = black */
1287 c.m[0][4] = ff_add_q64(c.m[0][4], c.m[0][0]);
1288 c.m[0][0] = av_neg_q64(c.m[0][0]);
1289 }
1290
1291 return c;
1292}
1293
1294static SwsLinearOp fmt_decode_range(const SwsFormat *fmt, bool *incomplete)
1295{
1296 SwsLinearOp c = fmt_encode_range(fmt, incomplete);
1297
1298 /* Invert main diagonal + offset: x = s * y + k ==> y = (x - k) / s */
1299 for (int i = 0; i < 4; i++) {
1300 av_assert1(c.m[i][i].num);
1301 c.m[i][i] = ff_inv_q64(c.m[i][i]);
1302 c.m[i][4] = ff_mul_q64(c.m[i][4], av_neg_q64(c.m[i][i]));
1303 }
1304
1305 /* Explicitly initialize alpha for sanity */
1306 if (!(fmt->desc->flags & AV_PIX_FMT_FLAG_ALPHA))
1307 c.m[3][4] = Q(1);
1308
1309 return c;
1310}
1311
1312static AVRational64 *generate_bayer_matrix(const int size_log2)
1313{
1314 const int size = 1 << size_log2;
1315 const int num_entries = size * size;
1316 AVRational64 *m = av_refstruct_allocz(sizeof(*m) * num_entries);
1317 av_assert1(size_log2 < 16);
1318 if (!m)
1319 return NULL;
1320
1321 /* Start with a 1x1 matrix */
1322 m[0] = Q(0);
1323
1324 /* Generate three copies of the current, appropriately scaled and offset */
1325 for (int sz = 1; sz < size; sz <<= 1) {
1326 const int den = 4 * sz * sz;
1327 for (int y = 0; y < sz; y++) {
1328 for (int x = 0; x < sz; x++) {
1329 const AVRational64 cur = m[y * size + x];
1330 m[(y + sz) * size + x + sz] = ff_add_q64(cur, ff_make_q64(1, den));
1331 m[(y ) * size + x + sz] = ff_add_q64(cur, ff_make_q64(2, den));
1332 m[(y + sz) * size + x ] = ff_add_q64(cur, ff_make_q64(3, den));
1333 }
1334 }
1335 }
1336
1337 /**
1338 * To correctly round, we need to evenly distribute the result on [0, 1),
1339 * giving an average value of 1/2.
1340 *
1341 * After the above construction, we have a matrix with average value:
1342 * [ 0/N + 1/N + 2/N + ... (N-1)/N ] / N = (N-1)/(2N)
1343 * where N = size * size is the total number of entries.
1344 *
1345 * To make the average value equal to 1/2 = N/(2N), add a bias of 1/(2N).
1346 */
1347 for (int i = 0; i < num_entries; i++)
1348 m[i] = ff_add_q64(m[i], ff_make_q64(1, 2 * num_entries));
1349
1350 return m;
1351}
1352
1353static bool trc_is_hdr(enum AVColorTransferCharacteristic trc)
1354{
1355 static_assert(AVCOL_TRC_NB == 19, "Update this list when adding TRCs");
1356 static_assert(AVCOL_TRC_EXT_NB == 257, "Update this list when adding TRCs");
1357 switch (trc) {
1358 case AVCOL_TRC_LOG:
1359 case AVCOL_TRC_LOG_SQRT:
1360 case AVCOL_TRC_V_LOG:
1363 return true;
1364 default:
1365 return false;
1366 }
1367}
1368
1369static int fmt_dither(SwsContext *ctx, SwsOpList *ops,
1370 const SwsPixelType type,
1371 const SwsFormat *src, const SwsFormat *dst)
1372{
1373 SwsDither mode = ctx->dither;
1375 const int bpc = dst->desc->comp[0].depth;
1376
1377 if (mode == SWS_DITHER_AUTO) {
1378 /* Visual threshold of perception: 12 bits for SDR, 14 bits for HDR */
1379 const int jnd_bits = trc_is_hdr(dst->color.trc) ? 14 : 12;
1380 mode = bpc >= jnd_bits ? SWS_DITHER_NONE : SWS_DITHER_BAYER;
1381 }
1382
1383 switch (mode) {
1384 case SWS_DITHER_NONE:
1385 if (ctx->flags & SWS_ACCURATE_RND) {
1386 /* Add constant 0.5 for correct rounding */
1388 if (!bias)
1389 return AVERROR(ENOMEM);
1390 *bias = (AVRational64) {1, 2};
1391 return ff_sws_op_list_append(ops, &(SwsOp) {
1392 .op = SWS_OP_DITHER,
1393 .type = type,
1394 .dither.matrix = bias,
1395 .dither.min = *bias,
1396 .dither.max = *bias,
1397 });
1398 } else {
1399 return 0; /* No-op */
1400 }
1401 case SWS_DITHER_BAYER:
1402 /* Hardcode 16x16 matrix for now; in theory we could adjust this
1403 * based on the expected level of precision in the output, since lower
1404 * bit depth outputs can suffice with smaller dither matrices; however
1405 * in practice we probably want to use error diffusion for such low bit
1406 * depths anyway */
1407 dither.size_log2 = 4;
1408 dither.matrix = generate_bayer_matrix(dither.size_log2);
1409 if (!dither.matrix)
1410 return AVERROR(ENOMEM);
1411
1412 const int size = 1 << dither.size_log2;
1413 dither.min = dither.max = dither.matrix[0];
1414 for (int i = 1; i < size * size; i++) {
1415 if (ff_cmp_q64(dither.min, dither.matrix[i]) > 0)
1416 dither.min = dither.matrix[i];
1417 if (ff_cmp_q64(dither.matrix[i], dither.max) > 0)
1418 dither.max = dither.matrix[i];
1419 }
1420
1421 /* Brute-forced offsets; minimizes quantization error across a 16x16
1422 * bayer dither pattern for standard RGBA and YUVA pixel formats */
1423 const int offsets_16x16[4] = {0, 3, 2, 5};
1424 for (int i = 0; i < 4; i++) {
1425 av_assert0(offsets_16x16[i] <= INT8_MAX);
1426 dither.y_offset[i] = offsets_16x16[i];
1427 }
1428
1429 const AVPixFmtDescriptor *src_desc = fmt_desc_decoded(src->format);
1430 if (src_desc->nb_components < 3 && bpc >= 8) {
1431 /**
1432 * For high-bit-depth sources without chroma, use same matrix
1433 * offset for all color channels. This prevents introducing color
1434 * noise in grayscale images; and also allows optimizing the dither
1435 * operation. Skipped for low bit depth (<8 bpc) as the loss in
1436 * PSNR, from the inability to diffuse error among all three
1437 * channels, can be substantial.
1438 *
1439 * This shifts: { X, Y, Z, W } -> { X, X, X, Y }
1440 */
1441 dither.y_offset[3] = dither.y_offset[1];
1442 dither.y_offset[1] = dither.y_offset[2] = dither.y_offset[0];
1443 }
1444
1445 return ff_sws_op_list_append(ops, &(SwsOp) {
1446 .op = SWS_OP_DITHER,
1447 .type = type,
1448 .dither = dither,
1449 });
1450 case SWS_DITHER_ED:
1453 return AVERROR(ENOTSUP);
1454
1455 case SWS_DITHER_NB:
1456 break;
1457 }
1458
1459 av_unreachable("Invalid dither mode");
1460 return AVERROR(EINVAL);
1461}
1462
1463#define Q64(x) ff_make_q64((x).num, (x).den)
1464
1465static inline SwsLinearOp
1466linear_mat3(const AVRational m00, const AVRational m01, const AVRational m02,
1467 const AVRational m10, const AVRational m11, const AVRational m12,
1468 const AVRational m20, const AVRational m21, const AVRational m22)
1469{
1470 return (SwsLinearOp) {{
1471 { Q64(m00), Q64(m01), Q64(m02), Q(0), Q(0) },
1472 { Q64(m10), Q64(m11), Q64(m12), Q(0), Q(0) },
1473 { Q64(m20), Q64(m21), Q64(m22), Q(0), Q(0) },
1474 { Q(0), Q(0), Q(0), Q(1), Q(0) },
1475 }};
1476}
1477
1479 SwsOpList *ops, const SwsFormat *fmt, bool *incomplete)
1480{
1482 const SwsPixelType pixel_type = fmt_pixel_type(fmt->format);
1483 if (!pixel_type)
1484 return AVERROR(ENOTSUP);
1485
1486 const AVRational q0 = av_make_q(0, 1);
1487 const AVRational q1 = av_make_q(1, 1);
1488 const AVRational q2 = av_make_q(2, 1);
1489
1491 .op = SWS_OP_CONVERT,
1492 .type = pixel_type,
1493 .convert.to = type,
1494 }));
1495
1496 /* Decode pixel format into standardized range */
1498 .type = type,
1499 .op = SWS_OP_LINEAR,
1500 .lin = fmt_decode_range(fmt, incomplete),
1501 }));
1502
1503 /* Final step, decode colorspace */
1504 switch (fmt->csp) {
1505 case AVCOL_SPC_RGB:
1506 return 0;
1509 *incomplete = true;
1511 case AVCOL_SPC_FCC:
1512 case AVCOL_SPC_BT470BG:
1514 case AVCOL_SPC_BT709:
1516 case AVCOL_SPC_BT2020_NCL: {
1517 AVRational crg = av_sub_q(q0, av_div_q(c->cr, c->cg));
1518 AVRational cbg = av_sub_q(q0, av_div_q(c->cb, c->cg));
1519 AVRational m02 = av_mul_q(q2, av_sub_q(q1, c->cr));
1520 AVRational m21 = av_mul_q(q2, av_sub_q(q1, c->cb));
1521 AVRational m11 = av_mul_q(cbg, m21);
1522 AVRational m12 = av_mul_q(crg, m02);
1523
1524 return ff_sws_op_list_append(ops, &(SwsOp) {
1525 .type = type,
1526 .op = SWS_OP_LINEAR,
1527 .lin = linear_mat3(
1528 q1, q0, m02,
1529 q1, m11, m12,
1530 q1, m21, q0
1531 ),
1532 });
1533 }
1534
1535 case AVCOL_SPC_YCGCO:
1536 return ff_sws_op_list_append(ops, &(SwsOp) {
1537 .type = type,
1538 .op = SWS_OP_LINEAR,
1539 .lin = linear_mat3(
1540 q1, av_make_q(-1, 1), av_make_q( 1, 1),
1541 q1, av_make_q( 1, 1), av_make_q( 0, 1),
1542 q1, av_make_q(-1, 1), av_make_q(-1, 1)
1543 ),
1544 });
1545
1550 case AVCOL_SPC_ICTCP:
1551 case AVCOL_SPC_IPT_C2:
1552 case AVCOL_SPC_YCGCO_RE:
1553 case AVCOL_SPC_YCGCO_RO:
1554 return AVERROR(ENOTSUP);
1555
1556 case AVCOL_SPC_RESERVED:
1557 return AVERROR(EINVAL);
1558
1559 case AVCOL_SPC_NB:
1560 break;
1561 }
1562
1563 av_unreachable("Corrupt AVColorSpace value?");
1564 return AVERROR(EINVAL);
1565}
1566
1568 SwsOpList *ops, const SwsFormat *src,
1569 const SwsFormat *dst, bool *incomplete)
1570{
1572 const SwsPixelType pixel_type = fmt_pixel_type(dst->format);
1573 if (!pixel_type)
1574 return AVERROR(ENOTSUP);
1575
1576 switch (dst->csp) {
1577 case AVCOL_SPC_RGB:
1578 break;
1581 *incomplete = true;
1583 case AVCOL_SPC_FCC:
1584 case AVCOL_SPC_BT470BG:
1586 case AVCOL_SPC_BT709:
1588 case AVCOL_SPC_BT2020_NCL: {
1589 AVRational cb1 = av_sub_q(c->cb, av_make_q(1, 1));
1590 AVRational cr1 = av_sub_q(c->cr, av_make_q(1, 1));
1591 AVRational m20 = av_make_q(1,2);
1592 AVRational m10 = av_mul_q(m20, av_div_q(c->cr, cb1));
1593 AVRational m11 = av_mul_q(m20, av_div_q(c->cg, cb1));
1594 AVRational m21 = av_mul_q(m20, av_div_q(c->cg, cr1));
1595 AVRational m22 = av_mul_q(m20, av_div_q(c->cb, cr1));
1596
1598 .type = type,
1599 .op = SWS_OP_LINEAR,
1600 .lin = linear_mat3(
1601 c->cr, c->cg, c->cb,
1602 m10, m11, m20,
1603 m20, m21, m22
1604 ),
1605 }));
1606 break;
1607 }
1608
1609 case AVCOL_SPC_YCGCO:
1611 .type = type,
1612 .op = SWS_OP_LINEAR,
1613 .lin = linear_mat3(
1614 av_make_q( 1, 4), av_make_q(1, 2), av_make_q( 1, 4),
1615 av_make_q( 1, 2), av_make_q(0, 1), av_make_q(-1, 2),
1616 av_make_q(-1, 4), av_make_q(1, 2), av_make_q(-1, 4)
1617 ),
1618 }));
1619 break;
1620
1625 case AVCOL_SPC_ICTCP:
1626 case AVCOL_SPC_IPT_C2:
1627 case AVCOL_SPC_YCGCO_RE:
1628 case AVCOL_SPC_YCGCO_RO:
1629 return AVERROR(ENOTSUP);
1630
1631 case AVCOL_SPC_RESERVED:
1632 case AVCOL_SPC_NB:
1633 return AVERROR(EINVAL);
1634 }
1635
1637 .type = type,
1638 .op = SWS_OP_LINEAR,
1639 .lin = fmt_encode_range(dst, incomplete),
1640 }));
1641
1642 if (!(dst->desc->flags & AV_PIX_FMT_FLAG_FLOAT)) {
1643 SwsClampOp range = {0};
1644
1645 const bool is_ya = dst->desc->nb_components == 2;
1646 for (int i = 0; i < dst->desc->nb_components; i++) {
1647 /* Clamp to legal pixel range */
1648 const int idx = i * (is_ya ? 3 : 1);
1649 range.limit[idx] = intmax_q64(dst->desc->comp[i].depth);
1650 }
1651
1652 RET(fmt_dither(ctx, ops, type, src, dst));
1654 .op = SWS_OP_MAX,
1655 .type = type,
1656 .clamp = {{ Q(0), Q(0), Q(0), Q(0) }},
1657 }));
1658
1660 .op = SWS_OP_MIN,
1661 .type = type,
1662 .clamp = range,
1663 }));
1664 }
1665
1666 return ff_sws_op_list_append(ops, &(SwsOp) {
1667 .type = type,
1668 .op = SWS_OP_CONVERT,
1669 .convert.to = pixel_type,
1670 });
1671}
1672
1673static SwsScaler get_scaler_fallback(SwsContext *ctx)
1674{
1675 if (ctx->scaler != SWS_SCALE_AUTO)
1676 return ctx->scaler;
1677
1678 /* Backwards compatibility with legacy flags API */
1679 if (ctx->flags & SWS_BILINEAR) {
1680 return SWS_SCALE_BILINEAR;
1681 } else if (ctx->flags & (SWS_BICUBIC | SWS_BICUBLIN)) {
1682 return SWS_SCALE_BICUBIC;
1683 } else if (ctx->flags & SWS_POINT) {
1684 return SWS_SCALE_POINT;
1685 } else if (ctx->flags & SWS_AREA) {
1686 return SWS_SCALE_AREA;
1687 } else if (ctx->flags & SWS_GAUSS) {
1688 return SWS_SCALE_GAUSSIAN;
1689 } else if (ctx->flags & SWS_SINC) {
1690 return SWS_SCALE_SINC;
1691 } else if (ctx->flags & SWS_LANCZOS) {
1692 return SWS_SCALE_LANCZOS;
1693 } else if (ctx->flags & SWS_SPLINE) {
1694 return SWS_SCALE_SPLINE;
1695 } else {
1696 return SWS_SCALE_AUTO;
1697 }
1698}
1699
1701 SwsOpType filter, int src_size, int dst_size)
1702{
1703 if (src_size == dst_size)
1704 return 0; /* no-op */
1705
1707 .scaler = get_scaler_fallback(ctx),
1708 .src_size = src_size,
1709 .dst_size = dst_size,
1710 };
1711
1712 for (int i = 0; i < SWS_NUM_SCALER_PARAMS; i++)
1713 params.scaler_params[i] = ctx->scaler_params[i];
1714
1715 SwsFilterWeights *kernel;
1716 int ret = ff_sws_filter_generate(ctx, &params, &kernel);
1717 if (ret == AVERROR(ENOTSUP)) {
1718 /* Filter size exceeds limit; cascade with geometric mean size */
1719 int mean = sqrt((int64_t) src_size * dst_size);
1720 if (mean == src_size || mean == dst_size)
1721 return AVERROR_BUG; /* sanity, prevent infinite loop */
1722 ret = add_filter(ctx, type, ops, filter, src_size, mean);
1723 if (ret < 0)
1724 return ret;
1725 return add_filter(ctx, type, ops, filter, mean, dst_size);
1726 } else if (ret < 0) {
1727 return ret;
1728 }
1729
1730 return ff_sws_op_list_append(ops, &(SwsOp) {
1731 .type = type,
1732 .op = filter,
1733 .filter.kernel = kernel,
1734 .filter.type = type,
1735 });
1736}
1737
1739 const SwsFormat *src, const SwsFormat *dst)
1740{
1741 /**
1742 * Always perform horizontal scaling first, since it's much more likely to
1743 * benefit from small integer optimizations; we should maybe flip the order
1744 * here if we're downscaling the vertical resolution by a lot, though.
1745 */
1746 int ret = add_filter(ctx, type, ops, SWS_OP_FILTER_H, src->width, dst->width);
1747 if (ret < 0)
1748 return ret;
1749
1750 return add_filter(ctx, type, ops, SWS_OP_FILTER_V, src->height, dst->height);
1751}
1752
1754 const SwsLut3D *lut3d)
1755{
1756 /* Unnormalize to LUT input domain and clamp */
1757 const AVRational64 domain = Q(INPUT_LUT_SIZE - 1);
1758
1760 .type = type,
1761 .op = SWS_OP_LINEAR,
1762 .lin = {{
1763 { domain, Q(0), Q(0), Q(0), Q(0) },
1764 { Q(0), domain, Q(0), Q(0), Q(0) },
1765 { Q(0), Q(0), domain, Q(0), Q(0) },
1766 { Q(0), Q(0), Q(0), Q(1), Q(0) },
1767 }},
1768 }));
1769
1771 .op = SWS_OP_MAX,
1772 .type = type,
1773 .clamp = {{ Q(0), Q(0), Q(0) }},
1774 }));
1775
1777 .op = SWS_OP_MIN,
1778 .type = type,
1779 .clamp = {{ domain, domain, domain }},
1780 }));
1781
1782 /* Apply the 3DLUT itself */
1784 .op = SWS_OP_LUT_3D,
1785 .type = type,
1786 .lut3d.lut = av_refstruct_ref_c(lut3d),
1787 .lut3d.dynamic = lut3d->dynamic,
1788 }));
1789
1790 /* Normalize back to [0, 1] */
1791 const AVRational64 inv = ff_inv_q64(Q(UINT16_MAX));
1793 .type = type,
1794 .op = SWS_OP_LINEAR,
1795 .lin = {{
1796 { inv, Q(0), Q(0), Q(0), Q(0) },
1797 { Q(0), inv, Q(0), Q(0), Q(0) },
1798 { Q(0), Q(0), inv, Q(0), Q(0) },
1799 { Q(0), Q(0), Q(0), Q(1), Q(0) },
1800 }},
1801 }));
1802
1803 return 0;
1804}
1805
1807 const SwsFormat *dst, const SwsLut3D *lut3d,
1808 SwsOpList **out_ops, bool *incomplete)
1809{
1810 /* The new code does not yet support alpha blending */
1811 if (src->desc->flags & AV_PIX_FMT_FLAG_ALPHA &&
1812 ctx->alpha_blend != SWS_ALPHA_BLEND_NONE)
1813 return AVERROR(ENOTSUP);
1814
1816 if (!ops)
1817 return AVERROR(ENOMEM);
1818 ops->src = *src;
1819 ops->dst = *dst;
1820
1822 int ret = ff_sws_decode_pixfmt(ops, src);
1823 if (ret < 0)
1824 goto fail;
1825 ret = ff_sws_decode_colors(ctx, type, ops, src, incomplete);
1826 if (ret < 0)
1827 goto fail;
1828 ret = ff_sws_add_filters(ctx, type, ops, src, dst);
1829 if (ret < 0)
1830 goto fail;
1831 if (lut3d) {
1832 ret = ff_sws_apply_lut3d(ctx, type, ops, lut3d);
1833 if (ret < 0)
1834 goto fail;
1835 }
1836 ret = ff_sws_encode_colors(ctx, type, ops, src, dst, incomplete);
1837 if (ret < 0)
1838 goto fail;
1839 ret = ff_sws_encode_pixfmt(ops, dst);
1840 if (ret < 0)
1841 goto fail;
1842
1843 *out_ops = ops;
1844 return 0;
1845
1846fail:
1847 ff_sws_op_list_free(&ops);
1848 return ret;
1849}
1850
1851#else /* !CONFIG_UNSTABLE */
1852
1853static int test_format_ops(enum AVPixelFormat format, int output)
1854{
1855 return 0;
1856}
1857
1858#endif
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
SwsAArch64OpImplParams params
Definition ops.c:51
static const char *const format[]
Definition af_aiir.c:445
static int add_filter(AudioNEqualizerContext *s, AVFilterLink *inlink)
static AVFormatContext * ctx
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition avassert.h:109
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static enum AVPixelFormat pix_fmt
static AVFrame * frame
#define RGBA(r, g, b, a)
Definition dvbsubdec.c:42
static void comp(unsigned char *dst, ptrdiff_t dst_stride, unsigned char *src, ptrdiff_t src_stride, int add)
Definition eamad.c:79
static int unpack(const uint8_t *src, const uint8_t *src_end, uint8_t *dst, int width, int height)
Unpack buffer.
Definition eatgv.c:73
static const uint8_t bits[8]
Definition fastaudio.c:100
int ff_sws_filter_generate(void *log, const SwsFilterParams *params, SwsFilterWeights **out)
Generate a filter kernel for the given parameters.
Definition filters.c:187
@ FIELD_TOP
Definition format.h:56
@ FIELD_BOTTOM
Definition format.h:57
static void ff_fmt_clear(SwsFormat *fmt)
Definition format.h:90
static int ff_fmt_equal(const SwsFormat *fmt1, const SwsFormat *fmt2)
Definition format.h:125
int ff_sws_apply_lut3d(SwsContext *ctx, SwsPixelType type, SwsOpList *ops, const SwsLut3D *lut3d)
int ff_sws_op_list_generate(SwsContext *ctx, const SwsFormat *src, const SwsFormat *dst, const SwsLut3D *lut3d, SwsOpList **out_ops, bool *incomplete)
Generate an SwsOpList defining a conversion from src to dst, with an optional 3DLUT for converting be...
int ff_sws_decode_pixfmt(SwsOpList *ops, const SwsFormat *fmt)
Append a set of operations for decoding/encoding raw pixels.
int ff_sws_add_filters(SwsContext *ctx, SwsPixelType type, SwsOpList *ops, const SwsFormat *src, const SwsFormat *dst)
Append a set of operations for scaling pixels to a different resolution.
int ff_sws_encode_colors(SwsContext *ctx, SwsPixelType type, SwsOpList *ops, const SwsFormat *src, const SwsFormat *dst, bool *incomplete)
int ff_sws_encode_pixfmt(SwsOpList *ops, const SwsFormat *fmt)
int ff_sws_decode_colors(SwsContext *ctx, SwsPixelType type, SwsOpList *ops, const SwsFormat *fmt, bool *incomplete)
Append a set of operations for transforming decoded pixel values to/from normalized RGB in the specif...
static av_always_inline AVRational64 ff_inv_q64(AVRational64 q)
Invert a 64-bit rational.
Definition rational64.h:131
AVRational64 ff_mul_q64(AVRational64 b, AVRational64 c)
Multiply two 64-bit rationals.
Definition rational64.c:124
static AVRational64 ff_make_q64(int64_t num, int64_t den)
Create an AVRational64.
Definition rational64.h:64
AVRational64 ff_add_q64(AVRational64 b, AVRational64 c)
Add two 64-bit rationals.
Definition rational64.c:135
int ff_cmp_q64(AVRational64 a, AVRational64 b)
Compare two 64-bit rationals.
Definition rational64.c:108
#define fail
Definition test.h:479
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition error.h:52
#define AVERROR(e)
Definition error.h:45
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition frame.h:695
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition frame.c:659
@ AV_FRAME_DATA_DYNAMIC_HDR_PLUS
HDR dynamic metadata associated with a video frame.
Definition frame.h:159
@ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata associated with a video frame.
Definition frame.h:120
const struct AVLumaCoefficients * av_csp_luma_coeffs_from_avcsp(enum AVColorSpace csp)
Retrieves the Luma coefficients necessary to construct a conversion matrix from an enum constant desc...
Definition csp.c:58
const AVColorPrimariesDesc * av_csp_primaries_desc_from_id(enum AVColorPrimaries prm)
Retrieves a complete gamut description from an enum constant describing the color primaries.
Definition csp.c:95
av_csp_eotf_function av_csp_itu_eotf_inv(enum AVColorTransferCharacteristic trc)
Returns the mathematical inverse of the corresponding EOTF.
Definition csp.c:710
void(* av_csp_eotf_function)(double Lw, double Lb, double c[3])
Function pointer representing an ITU EOTF transfer for a given reference display configuration.
Definition csp.h:178
av_csp_eotf_function av_csp_itu_eotf(enum AVColorTransferCharacteristic trc)
Returns the ITU EOTF corresponding to a given TRC.
Definition csp.c:684
AVRational av_add_q(AVRational b, AVRational c)
Add two rationals.
Definition rational.c:93
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition rational.c:80
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition rational.h:71
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition rational.h:89
AVRational av_sub_q(AVRational b, AVRational c)
Subtract one rational from another.
Definition rational.c:101
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition rational.c:88
int sws_test_transfer(enum AVColorTransferCharacteristic trc, int output)
Test if a given color transfer function is supported.
Definition format.c:656
int sws_test_hw_format(enum AVPixelFormat format)
Test if a given hardware pixel format is supported by any backend, excluding unstable backends.
Definition format.c:621
int sws_test_colorspace(enum AVColorSpace csp, int output)
Test if a given color space is supported.
Definition format.c:632
int sws_test_primaries(enum AVColorPrimaries prim, int output)
Test if a given set of color primaries is supported.
Definition format.c:649
int sws_is_noop(const AVFrame *dst, const AVFrame *src)
Check if a given conversion is a noop.
Definition format.c:698
int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt)
Definition format.c:299
SwsDither
Definition swscale.h:77
int sws_test_frame(const AVFrame *frame, int output)
Helper function to run all sws_test_* against a frame, as well as testing the basic frame properties ...
Definition format.c:685
SwsBackend
Definition swscale.h:110
int sws_test_format(enum AVPixelFormat format, int output)
Test if a given (software) pixel format is supported by any backend, excluding unstable backends.
Definition format.c:616
SwsScaler
Definition swscale.h:96
@ SWS_DITHER_NB
Definition swscale.h:84
@ SWS_DITHER_ED
Definition swscale.h:81
@ SWS_DITHER_A_DITHER
Definition swscale.h:82
@ SWS_DITHER_X_DITHER
Definition swscale.h:83
@ SWS_DITHER_AUTO
Definition swscale.h:79
@ SWS_DITHER_BAYER
Definition swscale.h:80
@ SWS_DITHER_NONE
Definition swscale.h:78
@ SWS_ALPHA_BLEND_NONE
Definition swscale.h:89
@ SWS_BACKEND_LEGACY
Legacy bespoke format-specific code.
Definition swscale.h:112
@ SWS_BACKEND_STABLE
Definition swscale.h:113
@ SWS_BACKEND_ALL
Definition swscale.h:127
@ SWS_SCALE_SPLINE
unwindowned natural cubic spline
Definition swscale.h:105
@ SWS_SCALE_POINT
nearest neighbor (point sampling)
Definition swscale.h:100
@ SWS_SCALE_LANCZOS
3-tap sinc/sinc
Definition swscale.h:104
@ SWS_SCALE_BILINEAR
bilinear filtering
Definition swscale.h:98
@ SWS_SCALE_GAUSSIAN
2-tap gaussian approximation
Definition swscale.h:102
@ SWS_SCALE_BICUBIC
2-tap cubic BC-spline
Definition swscale.h:99
@ SWS_SCALE_AREA
area averaging
Definition swscale.h:101
@ SWS_SCALE_SINC
unwindowed sinc
Definition swscale.h:103
@ SWS_SCALE_AUTO
Definition swscale.h:97
@ SWS_SPLINE
unwindowed natural cubic spline
Definition swscale.h:207
@ SWS_BICUBIC
2-tap cubic B-spline
Definition swscale.h:199
@ SWS_AREA
area averaging
Definition swscale.h:202
@ SWS_BICUBLIN
bicubic luma, bilinear chroma
Definition swscale.h:203
@ SWS_BILINEAR
bilinear filtering
Definition swscale.h:198
@ SWS_SINC
unwindowed sinc
Definition swscale.h:205
@ SWS_LANCZOS
3-tap sinc/sinc
Definition swscale.h:206
@ SWS_GAUSS
gaussian approximation
Definition swscale.h:204
@ SWS_ACCURATE_RND
Force bit-exact output.
Definition swscale.h:177
@ SWS_POINT
nearest neighbor
Definition swscale.h:201
int index
Definition gxfenc.c:90
int a
#define Q(q)
cl_device_type type
#define b
Definition input.c:43
enum AVPixelFormat pixfmt
Definition kmsgrab.c:367
unsigned offset
Definition libaomenc.c:763
static int shift(int a, int b)
Definition bonk.c:261
Macro definitions for various function/variable attributes.
#define av_fallthrough
Definition attributes.h:67
const char * desc
Definition libsvtav1.c:83
static int test_range(enum AVColorRange range)
Definition format.c:663
#define RET(x)
Definition format.c:36
int ff_sws_test_pixfmt_backend(const SwsBackend backends, enum AVPixelFormat format, int output)
Definition format.c:607
static int test_format_ops(enum AVPixelFormat format, int output)
Definition format.c:1853
bool ff_infer_colors(SwsColor *src, SwsColor *dst)
Definition format.c:542
void ff_sws_chroma_pos(const SwsFormat *fmt, bool *incomplete, int *out_x_pos, int *out_y_pos)
Wrapper around av_chroma_location_enum_to_pos() that accounts for the per-field offset introduced by ...
Definition format.c:559
static int test_format_legacy(enum AVPixelFormat format, int output)
Definition format.c:602
static int test_loc(enum AVChromaLocation loc)
Definition format.c:668
void ff_fmt_from_pixfmt(enum AVPixelFormat pixfmt, SwsFormat *fmt)
Subset of ff_fmt_from_frame() that sets default metadata for the format.
Definition format.c:485
int ff_test_fmt(const SwsBackend backends, const SwsFormat *fmt, int output)
Statically test if a given format is supported by the given set of backends.
Definition format.c:673
static int infer_prim_ref(SwsColor *csp, const SwsColor *ref)
Definition format.c:493
static void sanitize_fmt(SwsFormat *fmt, const AVPixFmtDescriptor *desc)
Definition format.c:305
static const LegacyFormatEntry legacy_format_entries[]
Definition format.c:50
SwsFormat ff_fmt_from_frame(const AVFrame *frame, int field)
This function also sanitizes and strips the input data, removing irrelevant fields for certain format...
Definition format.c:345
void ff_sws_frame_from_avframe(SwsFrame *dst, const AVFrame *src)
Initialize a SwsFrame from an AVFrame.
Definition format.c:712
static int infer_trc_ref(SwsColor *csp, const SwsColor *ref)
Definition format.c:517
@ INPUT_LUT_SIZE
Definition lut3d.h:36
#define FFALIGN(x, a)
Definition macros.h:78
enum AVColorPrimaries primaries
enum AVColorRange range
void ff_sws_op_list_free(SwsOpList **p_ops)
Definition ops.c:659
int ff_sws_op_list_append(SwsOpList *ops, SwsOp *op)
These will take over ownership of op and set it to {0}, even on failure.
Definition ops.c:756
SwsOpList * ff_sws_op_list_alloc(void)
Definition ops.c:646
SwsOpType
Copyright (C) 2025 Niklas Haas.
Definition ops.h:36
@ SWS_OP_RSHIFT
Definition ops.h:49
@ SWS_OP_SWIZZLE
Definition ops.h:43
@ SWS_OP_LSHIFT
Definition ops.h:48
@ SWS_OP_FILTER_V
Definition ops.h:64
@ SWS_OP_FILTER_H
Definition ops.h:63
@ SWS_OP_WRITE
Definition ops.h:41
@ SWS_OP_READ
Definition ops.h:40
@ SWS_OP_CLEAR
Definition ops.h:52
@ SWS_OP_SWAP_BYTES
Definition ops.h:42
@ SWS_OP_MIN
Definition ops.h:54
@ SWS_OP_UNPACK
Definition ops.h:46
@ SWS_OP_LINEAR
Definition ops.h:59
@ SWS_OP_PACK
Definition ops.h:47
@ SWS_OP_DITHER
Definition ops.h:60
@ SWS_OP_MAX
Definition ops.h:55
@ SWS_OP_LUT_3D
Definition ops.h:67
@ SWS_OP_CONVERT
Definition ops.h:53
SwsReadWriteMode
Definition ops.h:97
@ SWS_RW_PALETTE
Definition ops.h:109
@ SWS_RW_PLANAR
Note: 1-component reads are either SWS_RW_PLANAR or SWS_RW_PACKED, depending on the underlying interp...
Definition ops.h:107
@ SWS_RW_PACKED
Definition ops.h:108
@ SWS_COMP_EXACT
Definition ops.h:79
@ SWS_COMP_SWAPPED
Definition ops.h:81
#define SWS_SWIZZLE(X, Y, Z, W)
Definition ops.h:160
#define sws_isSupportedOutput(x)
#define sws_isSupportedInput(x)
enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
Definition pixdesc.c:3479
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3500
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
int av_chroma_location_enum_to_pos(int *xpos, int *ypos, enum AVChromaLocation pos)
Converts AVChromaLocation to swscale x/y chroma position.
Definition pixdesc.c:3902
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition pixdesc.h:147
#define AV_PIX_FMT_FLAG_BITSTREAM
All values of a component are bit-wise packed end to end.
Definition pixdesc.h:124
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition pixdesc.h:136
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
Definition pixdesc.h:158
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
Definition pixdesc.h:128
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition pixdesc.h:132
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
Definition pixdesc.h:116
#define AV_PIX_FMT_FLAG_XYZ
The pixel format contains XYZ-like data (as opposed to YUV/RGB/grayscale).
Definition pixdesc.h:163
#define AV_PIX_FMT_FLAG_BAYER
The pixel format is following a Bayer pattern.
Definition pixdesc.h:152
#define AV_PIX_FMT_FLAG_PAL
Pixel format has a palette in data[1], values are indexes in this palette.
Definition pixdesc.h:120
AVChromaLocation
Location of chroma samples.
Definition pixfmt.h:802
@ AVCHROMA_LOC_NB
Not part of ABI.
Definition pixfmt.h:810
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
Definition pixfmt.h:805
@ AVCHROMA_LOC_UNSPECIFIED
Definition pixfmt.h:803
AVColorRange
Visual content value range.
Definition pixfmt.h:748
@ AVCOL_RANGE_UNSPECIFIED
Definition pixfmt.h:749
@ AVCOL_RANGE_NB
Not part of ABI.
Definition pixfmt.h:784
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_BAYER_GBRG8
bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples
Definition pixfmt.h:287
@ AV_PIX_FMT_YAF16BE
IEEE-754 half precision packed YA, 16 bits gray, 16 bits alpha, 32bpp, big-endian.
Definition pixfmt.h:485
@ AV_PIX_FMT_YUV444P16BE
planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
Definition pixfmt.h:133
@ AV_PIX_FMT_UYVA
packed UYVA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), UYVAUYVA...
Definition pixfmt.h:444
@ AV_PIX_FMT_GRAY16BE
Y , 16bpp, big-endian.
Definition pixfmt.h:104
@ AV_PIX_FMT_P210BE
interleaved chroma YUV 4:2:2, 20bpp, data in the high bits, big-endian
Definition pixfmt.h:389
@ AV_PIX_FMT_XYZ12LE
packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as lit...
Definition pixfmt.h:196
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition pixfmt.h:96
@ AV_PIX_FMT_YUV420P16BE
planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
Definition pixfmt.h:129
@ AV_PIX_FMT_V30XLE
packed VYUX 4:4:4 like XV30, 32bpp, (msb)10V 10Y 10U 2X(lsb), little-endian
Definition pixfmt.h:449
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_AYUV64BE
packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
Definition pixfmt.h:303
@ AV_PIX_FMT_P010LE
like NV12, with 10bpp per component, data in the high bits, zeros in the low bits,...
Definition pixfmt.h:307
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition pixfmt.h:379
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition pixfmt.h:75
@ AV_PIX_FMT_GRAY10LE
Y , 10bpp, little-endian.
Definition pixfmt.h:321
@ AV_PIX_FMT_GRAYF32LE
IEEE-754 single precision Y, 32bpp, little-endian.
Definition pixfmt.h:364
@ AV_PIX_FMT_P210LE
interleaved chroma YUV 4:2:2, 20bpp, data in the high bits, little-endian
Definition pixfmt.h:390
@ AV_PIX_FMT_GBRP10BE
planar GBR 4:4:4 30bpp, big-endian
Definition pixfmt.h:169
@ AV_PIX_FMT_YA16BE
16 bits gray, 16 bits alpha (big-endian)
Definition pixfmt.h:209
@ AV_PIX_FMT_YUV444P12MSBBE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, big-endian
Definition pixfmt.h:493
@ AV_PIX_FMT_YUVA420P9BE
planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
Definition pixfmt.h:175
@ AV_PIX_FMT_XV36LE
packed XVYU 4:4:4, 48bpp, data in the high bits, zeros in the low bits, little-endian,...
Definition pixfmt.h:418
@ AV_PIX_FMT_YUVA444P12BE
planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian
Definition pixfmt.h:368
@ AV_PIX_FMT_NV42
as above, but U and V bytes are swapped
Definition pixfmt.h:372
@ AV_PIX_FMT_YUV420P14LE
planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition pixfmt.h:270
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition pixfmt.h:106
@ AV_PIX_FMT_YUV440P10BE
planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
Definition pixfmt.h:299
@ AV_PIX_FMT_GBRPF16BE
IEEE-754 half precision planer GBR 4:4:4, 48bpp, big-endian.
Definition pixfmt.h:466
@ AV_PIX_FMT_NV21
as above, but U and V bytes are swapped
Definition pixfmt.h:97
@ AV_PIX_FMT_XV30LE
packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), little-endian, variant of Y410 where alpha channe...
Definition pixfmt.h:415
@ AV_PIX_FMT_GBRPF32BE
IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian.
Definition pixfmt.h:341
@ AV_PIX_FMT_MONOBLACK
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb.
Definition pixfmt.h:83
@ AV_PIX_FMT_BGR565BE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
Definition pixfmt.h:117
@ AV_PIX_FMT_RGBF32LE
IEEE-754 single precision packed RGB 32:32:32, 96bpp, RGBRGB..., little-endian.
Definition pixfmt.h:421
@ AV_PIX_FMT_YUVA422P12BE
planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian
Definition pixfmt.h:366
@ AV_PIX_FMT_YUVA444P9LE
planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
Definition pixfmt.h:180
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Definition pixfmt.h:265
@ AV_PIX_FMT_YUVA444P10LE
planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
Definition pixfmt.h:186
@ AV_PIX_FMT_VUYX
packed VUYX 4:4:4:4, 32bpp, Variant of VUYA where alpha channel is left undefined
Definition pixfmt.h:406
@ AV_PIX_FMT_GBRP9LE
planar GBR 4:4:4 27bpp, little-endian
Definition pixfmt.h:168
@ AV_PIX_FMT_NV20LE
interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition pixfmt.h:199
@ AV_PIX_FMT_GBRP10MSBBE
planar GBR 4:4:4 30bpp, lowest bits zero, big-endian
Definition pixfmt.h:495
@ AV_PIX_FMT_YUV444P14BE
planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
Definition pixfmt.h:277
@ AV_PIX_FMT_YUVA420P10BE
planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
Definition pixfmt.h:181
@ AV_PIX_FMT_YUVA422P12LE
planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian
Definition pixfmt.h:367
@ AV_PIX_FMT_P416LE
interleaved chroma YUV 4:4:4, 48bpp, little-endian
Definition pixfmt.h:399
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_BAYER_GRBG16LE
bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian
Definition pixfmt.h:295
@ AV_PIX_FMT_P016LE
like NV12, with 16bpp per component, little-endian
Definition pixfmt.h:323
@ AV_PIX_FMT_P010BE
like NV12, with 10bpp per component, data in the high bits, zeros in the low bits,...
Definition pixfmt.h:308
@ AV_PIX_FMT_AYUV64LE
packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
Definition pixfmt.h:302
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition pixfmt.h:99
@ AV_PIX_FMT_RGB555BE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
Definition pixfmt.h:114
@ AV_PIX_FMT_YVYU422
packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb
Definition pixfmt.h:207
@ AV_PIX_FMT_GBRP12BE
planar GBR 4:4:4 36bpp, big-endian
Definition pixfmt.h:279
@ AV_PIX_FMT_YUVA422P9LE
planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
Definition pixfmt.h:178
@ AV_PIX_FMT_GRAY12LE
Y , 12bpp, little-endian.
Definition pixfmt.h:319
@ AV_PIX_FMT_P012BE
like NV12, with 12bpp per component, data in the high bits, zeros in the low bits,...
Definition pixfmt.h:409
@ AV_PIX_FMT_GBRAP12BE
planar GBR 4:4:4:4 48bpp, big-endian
Definition pixfmt.h:310
@ AV_PIX_FMT_YUV420P9LE
planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition pixfmt.h:154
@ AV_PIX_FMT_NV20BE
interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
Definition pixfmt.h:200
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition pixfmt.h:102
@ AV_PIX_FMT_V30XBE
packed VYUX 4:4:4 like XV30, 32bpp, (msb)10V 10Y 10U 2X(lsb), big-endian
Definition pixfmt.h:448
@ AV_PIX_FMT_GRAY12BE
Y , 12bpp, big-endian.
Definition pixfmt.h:318
@ AV_PIX_FMT_X2BGR10LE
packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:386
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_GRAYF16BE
IEEE-754 half precision Y, 16bpp, big-endian.
Definition pixfmt.h:471
@ AV_PIX_FMT_BGR48BE
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big...
Definition pixfmt.h:145
@ AV_PIX_FMT_YA16LE
16 bits gray, 16 bits alpha (little-endian)
Definition pixfmt.h:210
@ AV_PIX_FMT_YUVA420P10LE
planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
Definition pixfmt.h:182
@ AV_PIX_FMT_GRAY14LE
Y , 14bpp, little-endian.
Definition pixfmt.h:361
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
Definition pixfmt.h:88
@ AV_PIX_FMT_Y210LE
packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, little-endian
Definition pixfmt.h:382
@ AV_PIX_FMT_P012LE
like NV12, with 12bpp per component, data in the high bits, zeros in the low bits,...
Definition pixfmt.h:408
@ AV_PIX_FMT_RGB48BE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
Definition pixfmt.h:109
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition pixfmt.h:101
@ AV_PIX_FMT_YAF16LE
IEEE-754 half precision packed YA, 16 bits gray, 16 bits alpha, 32bpp, little-endian.
Definition pixfmt.h:486
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition pixfmt.h:108
@ AV_PIX_FMT_YUV422P10BE
planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
Definition pixfmt.h:157
@ AV_PIX_FMT_P016BE
like NV12, with 16bpp per component, big-endian
Definition pixfmt.h:324
@ AV_PIX_FMT_YUVA422P10LE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
Definition pixfmt.h:184
@ AV_PIX_FMT_YUV444P10MSBBE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, big-endian
Definition pixfmt.h:491
@ AV_PIX_FMT_YUV420P10LE
planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition pixfmt.h:156
@ AV_PIX_FMT_GBRPF16LE
IEEE-754 half precision planer GBR 4:4:4, 48bpp, little-endian.
Definition pixfmt.h:467
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
Definition pixfmt.h:107
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition pixfmt.h:79
@ AV_PIX_FMT_RGBA64BE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
Definition pixfmt.h:202
@ AV_PIX_FMT_RGB8
packed RGB 3:3:2, 8bpp, (msb)3R 3G 2B(lsb)
Definition pixfmt.h:93
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition pixfmt.h:371
@ AV_PIX_FMT_YAF32BE
IEEE-754 single precision packed YA, 32 bits gray, 32 bits alpha, 64bpp, big-endian.
Definition pixfmt.h:482
@ AV_PIX_FMT_XV30BE
packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), big-endian, variant of Y410 where alpha channel i...
Definition pixfmt.h:414
@ AV_PIX_FMT_GBRAP14BE
planar GBR 4:4:4:4 56bpp, big-endian
Definition pixfmt.h:432
@ AV_PIX_FMT_RGBA64LE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
Definition pixfmt.h:203
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
Definition pixfmt.h:264
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition pixfmt.h:80
@ AV_PIX_FMT_YUV422P16LE
planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition pixfmt.h:130
@ AV_PIX_FMT_YUV420P14BE
planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
Definition pixfmt.h:269
@ AV_PIX_FMT_GBRAP16BE
planar GBRA 4:4:4:4 64bpp, big-endian
Definition pixfmt.h:213
@ AV_PIX_FMT_YUV444P14LE
planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition pixfmt.h:278
@ AV_PIX_FMT_BAYER_RGGB16LE
bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian
Definition pixfmt.h:291
@ AV_PIX_FMT_GBRPF32LE
IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian.
Definition pixfmt.h:342
@ AV_PIX_FMT_YUVA444P9BE
planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
Definition pixfmt.h:179
@ AV_PIX_FMT_YUV422P12LE
planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition pixfmt.h:272
@ AV_PIX_FMT_BGR8
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
Definition pixfmt.h:90
@ AV_PIX_FMT_RGB444LE
packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:136
@ AV_PIX_FMT_YUV444P10BE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
Definition pixfmt.h:161
@ AV_PIX_FMT_P410LE
interleaved chroma YUV 4:4:4, 30bpp, data in the high bits, little-endian
Definition pixfmt.h:393
@ AV_PIX_FMT_YUV440P12LE
planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
Definition pixfmt.h:300
@ AV_PIX_FMT_GBRP10MSBLE
planar GBR 4:4:4 30bpp, lowest bits zero, little-endian
Definition pixfmt.h:496
@ AV_PIX_FMT_RGB4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
Definition pixfmt.h:95
@ AV_PIX_FMT_BGR4_BYTE
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
Definition pixfmt.h:92
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:198
@ AV_PIX_FMT_YUVA420P9LE
planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian
Definition pixfmt.h:176
@ AV_PIX_FMT_YAF32LE
IEEE-754 single precision packed YA, 32 bits gray, 32 bits alpha, 64bpp, little-endian.
Definition pixfmt.h:483
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition pixfmt.h:100
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_XYZ12BE
packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big...
Definition pixfmt.h:197
@ AV_PIX_FMT_YUV444P9LE
planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition pixfmt.h:160
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition pixfmt.h:174
@ AV_PIX_FMT_RGBF16LE
IEEE-754 half precision packed RGB 16:16:16, 48bpp, RGBRGB..., little-endian.
Definition pixfmt.h:452
@ AV_PIX_FMT_BAYER_GRBG8
bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples
Definition pixfmt.h:288
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
Definition pixfmt.h:283
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition pixfmt.h:212
@ AV_PIX_FMT_GBRP12LE
planar GBR 4:4:4 36bpp, little-endian
Definition pixfmt.h:280
@ AV_PIX_FMT_GRAY9BE
Y , 9bpp, big-endian.
Definition pixfmt.h:338
@ AV_PIX_FMT_YUVA444P16LE
planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
Definition pixfmt.h:192
@ AV_PIX_FMT_YUVA422P10BE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
Definition pixfmt.h:183
@ AV_PIX_FMT_UYYVYY411
packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
Definition pixfmt.h:89
@ AV_PIX_FMT_P216LE
interleaved chroma YUV 4:2:2, 32bpp, little-endian
Definition pixfmt.h:396
@ AV_PIX_FMT_YUVA422P16BE
planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
Definition pixfmt.h:189
@ AV_PIX_FMT_BGRA64BE
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
Definition pixfmt.h:204
@ AV_PIX_FMT_P416BE
interleaved chroma YUV 4:4:4, 48bpp, big-endian
Definition pixfmt.h:398
@ AV_PIX_FMT_P212BE
interleaved chroma YUV 4:2:2, 24bpp, data in the high bits, big-endian
Definition pixfmt.h:426
@ AV_PIX_FMT_YUV444P10MSBLE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian
Definition pixfmt.h:492
@ AV_PIX_FMT_RGB565LE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
Definition pixfmt.h:113
@ AV_PIX_FMT_BAYER_BGGR16BE
bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian
Definition pixfmt.h:290
@ AV_PIX_FMT_GBRP16BE
planar GBR 4:4:4 48bpp, big-endian
Definition pixfmt.h:171
@ AV_PIX_FMT_AYUV
packed AYUV 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), AYUVAYUV...
Definition pixfmt.h:442
@ AV_PIX_FMT_GBRAP12LE
planar GBR 4:4:4:4 48bpp, little-endian
Definition pixfmt.h:311
@ AV_PIX_FMT_GBRP9BE
planar GBR 4:4:4 27bpp, big-endian
Definition pixfmt.h:167
@ AV_PIX_FMT_YUVA420P16LE
planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
Definition pixfmt.h:188
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:115
@ AV_PIX_FMT_BGR444BE
packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined
Definition pixfmt.h:139
@ AV_PIX_FMT_RGB48LE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
Definition pixfmt.h:110
@ AV_PIX_FMT_BGR555BE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
Definition pixfmt.h:119
@ AV_PIX_FMT_GBRAPF32BE
IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian.
Definition pixfmt.h:343
@ AV_PIX_FMT_XV36BE
packed XVYU 4:4:4, 48bpp, data in the high bits, zeros in the low bits, big-endian,...
Definition pixfmt.h:417
@ AV_PIX_FMT_GBRP12MSBLE
planar GBR 4:4:4 36bpp, lowest bits zero, little-endian
Definition pixfmt.h:498
@ AV_PIX_FMT_Y212LE
packed YUV 4:2:2 like YUYV422, 24bpp, data in the high bits, zeros in the low bits,...
Definition pixfmt.h:412
@ AV_PIX_FMT_Y216LE
packed YUV 4:2:2 like YUYV422, 32bpp, little-endian
Definition pixfmt.h:461
@ AV_PIX_FMT_BGR444LE
packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:138
@ AV_PIX_FMT_YUVA420P16BE
planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
Definition pixfmt.h:187
@ AV_PIX_FMT_YUV420P12LE
planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition pixfmt.h:268
@ AV_PIX_FMT_BAYER_RGGB16BE
bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian
Definition pixfmt.h:292
@ AV_PIX_FMT_X2RGB10LE
packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:384
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition pixfmt.h:86
@ AV_PIX_FMT_YUV444P9BE
planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
Definition pixfmt.h:159
@ AV_PIX_FMT_GBRAPF32LE
IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian.
Definition pixfmt.h:344
@ AV_PIX_FMT_P410BE
interleaved chroma YUV 4:4:4, 30bpp, data in the high bits, big-endian
Definition pixfmt.h:392
@ AV_PIX_FMT_GBRAP14LE
planar GBR 4:4:4:4 56bpp, little-endian
Definition pixfmt.h:433
@ AV_PIX_FMT_RGBAF16LE
IEEE-754 half precision packed RGBA 16:16:16:16, 64bpp, RGBARGBA..., little-endian.
Definition pixfmt.h:404
@ AV_PIX_FMT_YUV422P9LE
planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition pixfmt.h:164
@ AV_PIX_FMT_GRAYF32BE
IEEE-754 single precision Y, 32bpp, big-endian.
Definition pixfmt.h:363
@ AV_PIX_FMT_RGB444BE
packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined
Definition pixfmt.h:137
@ AV_PIX_FMT_YUV422P9BE
planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
Definition pixfmt.h:163
@ AV_PIX_FMT_BGR48LE
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as lit...
Definition pixfmt.h:146
@ AV_PIX_FMT_GBRP14LE
planar GBR 4:4:4 42bpp, little-endian
Definition pixfmt.h:282
@ AV_PIX_FMT_XV48LE
packed XVYU 4:4:4, 64bpp, little-endian, variant of Y416 where alpha channel is left undefined
Definition pixfmt.h:464
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
Definition pixfmt.h:263
@ AV_PIX_FMT_YUV422P10LE
planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition pixfmt.h:158
@ AV_PIX_FMT_GRAY16LE
Y , 16bpp, little-endian.
Definition pixfmt.h:105
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition pixfmt.h:173
@ AV_PIX_FMT_GBRP10LE
planar GBR 4:4:4 30bpp, little-endian
Definition pixfmt.h:170
@ AV_PIX_FMT_GBRAP10BE
planar GBR 4:4:4:4 40bpp, big-endian
Definition pixfmt.h:313
@ AV_PIX_FMT_GBRAPF16BE
IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, big-endian.
Definition pixfmt.h:468
@ AV_PIX_FMT_YUV444P12MSBLE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian
Definition pixfmt.h:494
@ AV_PIX_FMT_GRAYF16LE
IEEE-754 half precision Y, 16bpp, little-endian.
Definition pixfmt.h:472
@ AV_PIX_FMT_BAYER_GRBG16BE
bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian
Definition pixfmt.h:296
@ AV_PIX_FMT_RGB565BE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
Definition pixfmt.h:112
@ AV_PIX_FMT_BGR555LE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
Definition pixfmt.h:120
@ AV_PIX_FMT_YUV420P12BE
planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
Definition pixfmt.h:267
@ AV_PIX_FMT_BGRA64LE
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
Definition pixfmt.h:205
@ AV_PIX_FMT_YUV440P12BE
planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
Definition pixfmt.h:301
@ AV_PIX_FMT_GBRAP10LE
planar GBR 4:4:4:4 40bpp, little-endian
Definition pixfmt.h:314
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition pixfmt.h:74
@ AV_PIX_FMT_YUV422P16BE
planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
Definition pixfmt.h:131
@ AV_PIX_FMT_BAYER_GBRG16LE
bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian
Definition pixfmt.h:293
@ AV_PIX_FMT_RGBAF16BE
IEEE-754 half precision packed RGBA 16:16:16:16, 64bpp, RGBARGBA..., big-endian.
Definition pixfmt.h:403
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition pixfmt.h:84
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition pixfmt.h:76
@ AV_PIX_FMT_GRAY9LE
Y , 9bpp, little-endian.
Definition pixfmt.h:339
@ AV_PIX_FMT_VUYA
packed VUYA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), VUYAVUYA...
Definition pixfmt.h:401
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition pixfmt.h:165
@ AV_PIX_FMT_XV48BE
packed XVYU 4:4:4, 64bpp, big-endian, variant of Y416 where alpha channel is left undefined
Definition pixfmt.h:463
@ AV_PIX_FMT_YUV422P14LE
planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition pixfmt.h:274
@ AV_PIX_FMT_GBRAP16LE
planar GBRA 4:4:4:4 64bpp, little-endian
Definition pixfmt.h:214
@ AV_PIX_FMT_BAYER_BGGR16LE
bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian
Definition pixfmt.h:289
@ AV_PIX_FMT_YUV420P10BE
planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
Definition pixfmt.h:155
@ AV_PIX_FMT_GBRAPF16LE
IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, little-endian.
Definition pixfmt.h:469
@ AV_PIX_FMT_YUV420P9BE
The following 12 formats have the disadvantage of needing 1 format for each bit depth.
Definition pixfmt.h:153
@ AV_PIX_FMT_GRAY10BE
Y , 10bpp, big-endian.
Definition pixfmt.h:320
@ AV_PIX_FMT_YUVA444P10BE
planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
Definition pixfmt.h:185
@ AV_PIX_FMT_YUV440P10LE
planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
Definition pixfmt.h:298
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition pixfmt.h:140
@ AV_PIX_FMT_YUV444P16LE
planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition pixfmt.h:132
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
Definition pixfmt.h:262
@ AV_PIX_FMT_GRAY14BE
Y , 14bpp, big-endian.
Definition pixfmt.h:360
@ AV_PIX_FMT_P212LE
interleaved chroma YUV 4:2:2, 24bpp, data in the high bits, little-endian
Definition pixfmt.h:427
@ AV_PIX_FMT_GBRP14BE
planar GBR 4:4:4 42bpp, big-endian
Definition pixfmt.h:281
@ AV_PIX_FMT_BGR565LE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
Definition pixfmt.h:118
@ AV_PIX_FMT_YUV422P14BE
planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
Definition pixfmt.h:273
@ AV_PIX_FMT_BAYER_GBRG16BE
bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian
Definition pixfmt.h:294
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition pixfmt.h:87
@ AV_PIX_FMT_X2BGR10BE
packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), big-endian, X=unused/undefined
Definition pixfmt.h:387
@ AV_PIX_FMT_P216BE
interleaved chroma YUV 4:2:2, 32bpp, big-endian
Definition pixfmt.h:395
@ AV_PIX_FMT_YUV444P12BE
planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
Definition pixfmt.h:275
@ AV_PIX_FMT_YUVA444P16BE
planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
Definition pixfmt.h:191
@ AV_PIX_FMT_YUVA422P16LE
planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
Definition pixfmt.h:190
@ AV_PIX_FMT_RGBF32BE
IEEE-754 single precision packed RGB 32:32:32, 96bpp, RGBRGB..., big-endian.
Definition pixfmt.h:420
@ AV_PIX_FMT_BAYER_RGGB8
bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples
Definition pixfmt.h:286
@ AV_PIX_FMT_GBRP16LE
planar GBR 4:4:4 48bpp, little-endian
Definition pixfmt.h:172
@ AV_PIX_FMT_YUVA422P9BE
planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
Definition pixfmt.h:177
@ AV_PIX_FMT_VYU444
packed VYU 4:4:4, 24bpp (1 Cr & Cb sample per 1x1 Y), VYUVYU...
Definition pixfmt.h:446
@ AV_PIX_FMT_RGB4
packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in ...
Definition pixfmt.h:94
@ AV_PIX_FMT_YUVA444P12LE
planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian
Definition pixfmt.h:369
@ AV_PIX_FMT_MONOWHITE
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb.
Definition pixfmt.h:82
@ AV_PIX_FMT_BGR4
packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in ...
Definition pixfmt.h:91
@ AV_PIX_FMT_YUV444P10LE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition pixfmt.h:162
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition pixfmt.h:85
@ AV_PIX_FMT_YUV422P12BE
planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
Definition pixfmt.h:271
@ AV_PIX_FMT_X2RGB10BE
packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), big-endian, X=unused/undefined
Definition pixfmt.h:385
@ AV_PIX_FMT_P412BE
interleaved chroma YUV 4:4:4, 36bpp, data in the high bits, big-endian
Definition pixfmt.h:429
@ AV_PIX_FMT_GBRP12MSBBE
planar GBR 4:4:4 36bpp, lowest bits zero, big-endian
Definition pixfmt.h:497
@ AV_PIX_FMT_P412LE
interleaved chroma YUV 4:4:4, 36bpp, data in the high bits, little-endian
Definition pixfmt.h:430
@ AV_PIX_FMT_BAYER_BGGR8
bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples
Definition pixfmt.h:285
@ AV_PIX_FMT_YUV420P16LE
planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition pixfmt.h:128
@ AV_PIX_FMT_RGBF16BE
IEEE-754 half precision packed RGB 16:16:16, 48bpp, RGBRGB..., big-endian.
Definition pixfmt.h:451
@ AV_PIX_FMT_YUV444P12LE
planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition pixfmt.h:276
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition pixfmt.h:642
@ AVCOL_PRI_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
Definition pixfmt.h:649
@ AVCOL_PRI_NB
Not part of ABI.
Definition pixfmt.h:660
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition pixfmt.h:644
@ AVCOL_PRI_RESERVED
Definition pixfmt.h:646
@ AVCOL_PRI_EXT_NB
Not part of ABI.
Definition pixfmt.h:665
@ AVCOL_PRI_SMPTE240M
identical to above, also called "SMPTE C" even though it uses D65
Definition pixfmt.h:651
@ AVCOL_PRI_EXT_BASE
Definition pixfmt.h:663
@ AVCOL_PRI_UNSPECIFIED
Definition pixfmt.h:645
@ AVCOL_PRI_RESERVED0
Definition pixfmt.h:643
@ AVCOL_PRI_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
Definition pixfmt.h:650
@ AVCOL_PRI_BT470M
also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
Definition pixfmt.h:647
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition pixfmt.h:672
@ AVCOL_TRC_SMPTEST2084
Definition pixfmt.h:690
@ AVCOL_TRC_SMPTE2084
SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems.
Definition pixfmt.h:689
@ AVCOL_TRC_V_LOG
Definition pixfmt.h:698
@ AVCOL_TRC_LOG
"Logarithmic transfer characteristic (100:1 range)"
Definition pixfmt.h:682
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
Definition pixfmt.h:693
@ AVCOL_TRC_SMPTE428
SMPTE ST 428-1.
Definition pixfmt.h:691
@ AVCOL_TRC_LOG_SQRT
"Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
Definition pixfmt.h:683
@ AVCOL_TRC_EXT_NB
Not part of ABI.
Definition pixfmt.h:699
@ AVCOL_TRC_UNSPECIFIED
Definition pixfmt.h:675
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition pixfmt.h:674
@ AVCOL_TRC_NB
Not part of ABI.
Definition pixfmt.h:694
#define AV_PIX_FMT_RGB32
Definition pixfmt.h:517
AVColorSpace
YUV colorspace type.
Definition pixfmt.h:706
@ AVCOL_SPC_YCGCO_RE
YCgCo-R, even addition of bits.
Definition pixfmt.h:724
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
Definition pixfmt.h:708
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
Definition pixfmt.h:712
@ AVCOL_SPC_CHROMA_DERIVED_CL
Chromaticity-derived constant luminance system.
Definition pixfmt.h:721
@ AVCOL_SPC_BT2020_CL
ITU-R BT2020 constant luminance system.
Definition pixfmt.h:718
@ AVCOL_SPC_NB
Not part of ABI.
Definition pixfmt.h:726
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition pixfmt.h:707
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
Definition pixfmt.h:717
@ AVCOL_SPC_SMPTE2085
SMPTE 2085, Y'D'zD'x.
Definition pixfmt.h:719
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
Definition pixfmt.h:713
@ AVCOL_SPC_FCC
FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
Definition pixfmt.h:711
@ AVCOL_SPC_CHROMA_DERIVED_NCL
Chromaticity-derived non-constant luminance system.
Definition pixfmt.h:720
@ AVCOL_SPC_SMPTE240M
derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries
Definition pixfmt.h:714
@ AVCOL_SPC_YCGCO_RO
YCgCo-R, odd addition of bits.
Definition pixfmt.h:725
@ AVCOL_SPC_YCGCO
used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
Definition pixfmt.h:715
@ AVCOL_SPC_ICTCP
ITU-R BT.2100-0, ICtCp.
Definition pixfmt.h:722
@ AVCOL_SPC_RESERVED
reserved for future use by ITU-T and ISO/IEC just like 15-255 are
Definition pixfmt.h:710
@ AVCOL_SPC_IPT_C2
SMPTE ST 2128, IPT-C2.
Definition pixfmt.h:723
const void * av_refstruct_ref_c(const void *obj)
Analog of av_refstruct_ref(), but for constant objects.
Definition refstruct.c:150
static void * av_refstruct_allocz(size_t size)
Equivalent to av_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition refstruct.h:105
#define FF_ARRAY_ELEMS(a)
AVRational x
Definition csp.h:57
AVRational y
Definition csp.h:57
Struct that contains both white point location and primaries location, providing the complete descrip...
Definition csp.h:78
AVPrimaryCoefficients prim
Definition csp.h:80
This struct represents dynamic metadata for color volume transform - application 4 of SMPTE 2094-40:2...
AVHDRPlusColorTransformParams params[3]
The color transform parameters for every processing window.
uint8_t application_version
Application version in the application defining document in ST-2094 suite.
uint8_t num_windows
The number of processing windows.
Structure to hold side data for an AVFrame.
Definition frame.h:327
uint8_t * data
Definition frame.h:329
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
Color transform parameters at a processing window in a dynamic metadata for SMPTE 2094-40.
AVRational average_maxrgb
The average of linearized maxRGB values in the processing window in the scene.
AVRational maxscl[3]
The maximum of the color components of linearized RGB values in the processing window in the scene.
AVHDRPlusPercentile distribution_maxrgb[15]
The linearized maxRGB values at given percentiles in the processing window in the scene.
uint8_t num_distribution_maxrgb_percentiles
The number of linearized maxRGB values at given percentiles in the processing window in the scene.
AVRational percentile
The linearized maxRGB value at a specific percentile in the processing window in the scene.
This struct describes a set or pool of "hardware" frames (i.e.
Definition hwcontext.h:118
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition hwcontext.h:213
Struct containing luma coefficients to be used for RGB to YUV/YCoCg, or similar calculations.
Definition csp.h:48
AVRational cb
Definition csp.h:49
AVRational cr
Definition csp.h:49
AVRational cg
Definition csp.h:49
Mastering display metadata capable of representing the color volume of the display used to master the...
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition pixdesc.h:80
uint64_t flags
Combination of AV_PIX_FMT_FLAG_... flags.
Definition pixdesc.h:94
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition pixdesc.h:89
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition pixdesc.h:71
64-bit Rational number (pair of numerator and denominator).
Definition rational64.h:52
int64_t num
Numerator.
Definition rational64.h:53
int64_t den
Denominator.
Definition rational64.h:54
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
uint8_t is_supported_in
Definition format.c:44
uint8_t is_supported_out
Definition format.c:45
uint8_t is_supported_endianness
Definition format.c:46
AVPrimaryCoefficients gamut
Definition format.h:63
AVRational min_luma
Definition format.h:64
enum AVColorPrimaries prim
Definition format.h:61
AVRational frame_peak
Definition format.h:66
AVRational max_luma
Definition format.h:65
AVRational frame_avg
Definition format.h:67
enum AVColorTransferCharacteristic trc
Definition format.h:62
Definition ops.h:86
SwsCompFlags flags[4]
Definition ops.h:87
AVRational64 min[4]
Definition ops.h:91
AVRational64 max[4]
Definition ops.h:91
Main external API structure.
Definition swscale.h:227
Represents a computed filter kernel.
Definition filters.h:85
SwsColor color
Definition format.h:87
enum AVPixelFormat format
Definition format.h:81
int interlaced
Definition format.h:79
int field
Definition format.h:80
enum AVPixelFormat hw_format
Definition format.h:82
const AVPixFmtDescriptor * desc
Definition format.h:86
enum AVColorSpace csp
Definition format.h:84
int width
Definition format.h:78
enum AVColorRange range
Definition format.h:83
int height
Definition format.h:78
enum AVChromaLocation loc
Definition format.h:85
Represents a view into a single field of frame data.
Definition format.h:236
Append a set of operations for applying a gamut/tone mapping 3D LUT to the pixels.
Definition lut3d.h:50
bool dynamic
Definition lut3d.h:52
Helper struct for representing a list of operations.
Definition ops.h:293
SwsFormat dst
Definition ops.h:298
SwsComps comps_src
Source component metadata associated with pixel values from each corresponding component (in plane/me...
Definition ops.h:312
SwsFormat src
Definition ops.h:298
Definition ops.h:237
uint8_t pattern[4]
Packed bits are assumed to be LSB-aligned within the underlying integer type; i.e.
Definition ops.h:145
SwsReadWriteMode mode
Examples: rgba = 4x u8 packed yuv444p = 3x u8 rgb565 = 1x u16 <- use SWS_OP_UNPACK to unpack monow = ...
Definition ops.h:122
uint8_t elems
Definition ops.h:123
uint8_t x
Definition ops.h:156
uint8_t z
Definition ops.h:156
uint8_t w
Definition ops.h:156
uint8_t in[4]
Definition ops.h:155
uint8_t y
Definition ops.h:156
Definition swscale.c:71
int integer
#define SWS_NUM_SCALER_PARAMS
Extra parameters for fine-tuning certain scalers.
Definition swscale.h:243
static uint8_t tmp[40]
Definition aes_ctr.c:52
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
Definition h263dsp.c:29
#define src
Definition vp8dsp.c:248
static int ref[MAX_W *MAX_W]
int size
static const uint8_t q1[256]
Definition twofish.c:100
static const uint8_t q0[256]
Definition twofish.c:81
SwsPixelType
Definition uops.h:39
@ SWS_PIXEL_F32
Definition uops.h:44
@ SWS_PIXEL_U32
Definition uops.h:43
@ SWS_PIXEL_U16
Definition uops.h:42
@ SWS_PIXEL_NONE
Definition uops.h:40
@ SWS_PIXEL_U8
Definition uops.h:41
#define SWS_COMP(X)
Definition uops.h:97
static av_const bool ff_sws_pixel_type_is_int(SwsPixelType type)
Definition uops.h:63
static av_const int ff_sws_pixel_type_size(SwsPixelType type)
Definition uops.h:50
static double cb(void *priv, double x, double y)
Definition vf_geq.c:247
static const uint16_t dither[8][8]
Definition vf_gradfun.c:46
static float mean(const float *input, int size)
Definition vf_nnedi.c:861
static int bias(int x, int c)
Definition vqcdec.c:115
static double c[64]