Merge commit 'dd343fd986459f467a2d1d70c26101dff1d47d68'
[ffmpeg.git] / libavutil / pixdesc.c
1 /*
2  * pixel format descriptor
3  * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #include <stdio.h>
23 #include <string.h>
24
25 #include "avassert.h"
26 #include "avstring.h"
27 #include "common.h"
28 #include "pixfmt.h"
29 #include "pixdesc.h"
30 #include "internal.h"
31 #include "intreadwrite.h"
32 #include "version.h"
33
34 void av_read_image_line(uint16_t *dst,
35                         const uint8_t *data[4], const int linesize[4],
36                         const AVPixFmtDescriptor *desc,
37                         int x, int y, int c, int w,
38                         int read_pal_component)
39 {
40     AVComponentDescriptor comp = desc->comp[c];
41     int plane = comp.plane;
42     int depth = comp.depth;
43     int mask  = (1 << depth) - 1;
44     int shift = comp.shift;
45     int step  = comp.step;
46     int flags = desc->flags;
47
48     if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
49         int skip = x * step + comp.offset;
50         const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
51         int shift = 8 - depth - (skip & 7);
52
53         while (w--) {
54             int val = (*p >> shift) & mask;
55             if (read_pal_component)
56                 val = data[1][4*val + c];
57             shift -= step;
58             p -= shift >> 3;
59             shift &= 7;
60             *dst++ = val;
61         }
62     } else {
63         const uint8_t *p = data[plane] + y * linesize[plane] +
64                            x * step + comp.offset;
65         int is_8bit = shift + depth <= 8;
66
67         if (is_8bit)
68             p += !!(flags & AV_PIX_FMT_FLAG_BE);
69
70         while (w--) {
71             int val = is_8bit ? *p :
72                 flags & AV_PIX_FMT_FLAG_BE ? AV_RB16(p) : AV_RL16(p);
73             val = (val >> shift) & mask;
74             if (read_pal_component)
75                 val = data[1][4 * val + c];
76             p += step;
77             *dst++ = val;
78         }
79     }
80 }
81
82 void av_write_image_line(const uint16_t *src,
83                          uint8_t *data[4], const int linesize[4],
84                          const AVPixFmtDescriptor *desc,
85                          int x, int y, int c, int w)
86 {
87     AVComponentDescriptor comp = desc->comp[c];
88     int plane = comp.plane;
89     int depth = comp.depth;
90     int step  = comp.step;
91     int flags = desc->flags;
92
93     if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
94         int skip = x * step + comp.offset;
95         uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
96         int shift = 8 - depth - (skip & 7);
97
98         while (w--) {
99             *p |= *src++ << shift;
100             shift -= step;
101             p -= shift >> 3;
102             shift &= 7;
103         }
104     } else {
105         int shift = comp.shift;
106         uint8_t *p = data[plane] + y * linesize[plane] +
107                      x * step + comp.offset;
108
109         if (shift + depth <= 8) {
110             p += !!(flags & AV_PIX_FMT_FLAG_BE);
111             while (w--) {
112                 *p |= (*src++ << shift);
113                 p += step;
114             }
115         } else {
116             while (w--) {
117                 if (flags & AV_PIX_FMT_FLAG_BE) {
118                     uint16_t val = AV_RB16(p) | (*src++ << shift);
119                     AV_WB16(p, val);
120                 } else {
121                     uint16_t val = AV_RL16(p) | (*src++ << shift);
122                     AV_WL16(p, val);
123                 }
124                 p += step;
125             }
126         }
127     }
128 }
129
130 #if FF_API_PLUS1_MINUS1
131 FF_DISABLE_DEPRECATION_WARNINGS
132 #endif
133 static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
134     [AV_PIX_FMT_YUV420P] = {
135         .name = "yuv420p",
136         .nb_components = 3,
137         .log2_chroma_w = 1,
138         .log2_chroma_h = 1,
139         .comp = {
140             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
141             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
142             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
143         },
144         .flags = AV_PIX_FMT_FLAG_PLANAR,
145     },
146     [AV_PIX_FMT_YUYV422] = {
147         .name = "yuyv422",
148         .nb_components = 3,
149         .log2_chroma_w = 1,
150         .log2_chroma_h = 0,
151         .comp = {
152             { 0, 2, 0, 0, 8, 1, 7, 1 },        /* Y */
153             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* U */
154             { 0, 4, 3, 0, 8, 3, 7, 4 },        /* V */
155         },
156     },
157     [AV_PIX_FMT_YVYU422] = {
158         .name = "yvyu422",
159         .nb_components = 3,
160         .log2_chroma_w = 1,
161         .log2_chroma_h = 0,
162         .comp = {
163             { 0, 2, 0, 0, 8, 1, 7, 1 },        /* Y */
164             { 0, 4, 3, 0, 8, 3, 7, 4 },        /* U */
165             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* V */
166         },
167     },
168     [AV_PIX_FMT_RGB24] = {
169         .name = "rgb24",
170         .nb_components = 3,
171         .log2_chroma_w = 0,
172         .log2_chroma_h = 0,
173         .comp = {
174             { 0, 3, 0, 0, 8, 2, 7, 1 },        /* R */
175             { 0, 3, 1, 0, 8, 2, 7, 2 },        /* G */
176             { 0, 3, 2, 0, 8, 2, 7, 3 },        /* B */
177         },
178         .flags = AV_PIX_FMT_FLAG_RGB,
179     },
180     [AV_PIX_FMT_BGR24] = {
181         .name = "bgr24",
182         .nb_components = 3,
183         .log2_chroma_w = 0,
184         .log2_chroma_h = 0,
185         .comp = {
186             { 0, 3, 2, 0, 8, 2, 7, 3 },        /* R */
187             { 0, 3, 1, 0, 8, 2, 7, 2 },        /* G */
188             { 0, 3, 0, 0, 8, 2, 7, 1 },        /* B */
189         },
190         .flags = AV_PIX_FMT_FLAG_RGB,
191     },
192     [AV_PIX_FMT_YUV422P] = {
193         .name = "yuv422p",
194         .nb_components = 3,
195         .log2_chroma_w = 1,
196         .log2_chroma_h = 0,
197         .comp = {
198             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
199             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
200             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
201         },
202         .flags = AV_PIX_FMT_FLAG_PLANAR,
203     },
204     [AV_PIX_FMT_YUV444P] = {
205         .name = "yuv444p",
206         .nb_components = 3,
207         .log2_chroma_w = 0,
208         .log2_chroma_h = 0,
209         .comp = {
210             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
211             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
212             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
213         },
214         .flags = AV_PIX_FMT_FLAG_PLANAR,
215     },
216     [AV_PIX_FMT_YUV410P] = {
217         .name = "yuv410p",
218         .nb_components = 3,
219         .log2_chroma_w = 2,
220         .log2_chroma_h = 2,
221         .comp = {
222             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
223             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
224             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
225         },
226         .flags = AV_PIX_FMT_FLAG_PLANAR,
227     },
228     [AV_PIX_FMT_YUV411P] = {
229         .name = "yuv411p",
230         .nb_components = 3,
231         .log2_chroma_w = 2,
232         .log2_chroma_h = 0,
233         .comp = {
234             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
235             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
236             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
237         },
238         .flags = AV_PIX_FMT_FLAG_PLANAR,
239     },
240     [AV_PIX_FMT_YUVJ411P] = {
241         .name = "yuvj411p",
242         .nb_components = 3,
243         .log2_chroma_w = 2,
244         .log2_chroma_h = 0,
245         .comp = {
246             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
247             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
248             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
249         },
250         .flags = AV_PIX_FMT_FLAG_PLANAR,
251     },
252     [AV_PIX_FMT_GRAY8] = {
253         .name = "gray",
254         .nb_components = 1,
255         .log2_chroma_w = 0,
256         .log2_chroma_h = 0,
257         .comp = {
258             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
259         },
260         .flags = AV_PIX_FMT_FLAG_PSEUDOPAL,
261         .alias = "gray8,y8",
262     },
263     [AV_PIX_FMT_MONOWHITE] = {
264         .name = "monow",
265         .nb_components = 1,
266         .log2_chroma_w = 0,
267         .log2_chroma_h = 0,
268         .comp = {
269             { 0, 1, 0, 0, 1, 0, 0, 1 },        /* Y */
270         },
271         .flags = AV_PIX_FMT_FLAG_BITSTREAM,
272     },
273     [AV_PIX_FMT_MONOBLACK] = {
274         .name = "monob",
275         .nb_components = 1,
276         .log2_chroma_w = 0,
277         .log2_chroma_h = 0,
278         .comp = {
279             { 0, 1, 0, 7, 1, 0, 0, 1 },        /* Y */
280         },
281         .flags = AV_PIX_FMT_FLAG_BITSTREAM,
282     },
283     [AV_PIX_FMT_PAL8] = {
284         .name = "pal8",
285         .nb_components = 1,
286         .log2_chroma_w = 0,
287         .log2_chroma_h = 0,
288         .comp = {
289             { 0, 1, 0, 0, 8, 0, 7, 1 },
290         },
291         .flags = AV_PIX_FMT_FLAG_PAL,
292     },
293     [AV_PIX_FMT_YUVJ420P] = {
294         .name = "yuvj420p",
295         .nb_components = 3,
296         .log2_chroma_w = 1,
297         .log2_chroma_h = 1,
298         .comp = {
299             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
300             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
301             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
302         },
303         .flags = AV_PIX_FMT_FLAG_PLANAR,
304     },
305     [AV_PIX_FMT_YUVJ422P] = {
306         .name = "yuvj422p",
307         .nb_components = 3,
308         .log2_chroma_w = 1,
309         .log2_chroma_h = 0,
310         .comp = {
311             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
312             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
313             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
314         },
315         .flags = AV_PIX_FMT_FLAG_PLANAR,
316     },
317     [AV_PIX_FMT_YUVJ444P] = {
318         .name = "yuvj444p",
319         .nb_components = 3,
320         .log2_chroma_w = 0,
321         .log2_chroma_h = 0,
322         .comp = {
323             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
324             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
325             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
326         },
327         .flags = AV_PIX_FMT_FLAG_PLANAR,
328     },
329     [AV_PIX_FMT_XVMC] = {
330         .name = "xvmc",
331         .flags = AV_PIX_FMT_FLAG_HWACCEL,
332     },
333     [AV_PIX_FMT_UYVY422] = {
334         .name = "uyvy422",
335         .nb_components = 3,
336         .log2_chroma_w = 1,
337         .log2_chroma_h = 0,
338         .comp = {
339             { 0, 2, 1, 0, 8, 1, 7, 2 },        /* Y */
340             { 0, 4, 0, 0, 8, 3, 7, 1 },        /* U */
341             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* V */
342         },
343     },
344     [AV_PIX_FMT_UYYVYY411] = {
345         .name = "uyyvyy411",
346         .nb_components = 3,
347         .log2_chroma_w = 2,
348         .log2_chroma_h = 0,
349         .comp = {
350             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* Y */
351             { 0, 6, 0, 0, 8, 5, 7, 1 },        /* U */
352             { 0, 6, 3, 0, 8, 5, 7, 4 },        /* V */
353         },
354     },
355     [AV_PIX_FMT_BGR8] = {
356         .name = "bgr8",
357         .nb_components = 3,
358         .log2_chroma_w = 0,
359         .log2_chroma_h = 0,
360         .comp = {
361             { 0, 1, 0, 0, 3, 0, 2, 1 },        /* R */
362             { 0, 1, 0, 3, 3, 0, 2, 1 },        /* G */
363             { 0, 1, 0, 6, 2, 0, 1, 1 },        /* B */
364         },
365         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
366     },
367     [AV_PIX_FMT_BGR4] = {
368         .name = "bgr4",
369         .nb_components = 3,
370         .log2_chroma_w = 0,
371         .log2_chroma_h = 0,
372         .comp = {
373             { 0, 4, 3, 0, 1, 3, 0, 4 },        /* R */
374             { 0, 4, 1, 0, 2, 3, 1, 2 },        /* G */
375             { 0, 4, 0, 0, 1, 3, 0, 1 },        /* B */
376         },
377         .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
378     },
379     [AV_PIX_FMT_BGR4_BYTE] = {
380         .name = "bgr4_byte",
381         .nb_components = 3,
382         .log2_chroma_w = 0,
383         .log2_chroma_h = 0,
384         .comp = {
385             { 0, 1, 0, 0, 1, 0, 0, 1 },        /* R */
386             { 0, 1, 0, 1, 2, 0, 1, 1 },        /* G */
387             { 0, 1, 0, 3, 1, 0, 0, 1 },        /* B */
388         },
389         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
390     },
391     [AV_PIX_FMT_RGB8] = {
392         .name = "rgb8",
393         .nb_components = 3,
394         .log2_chroma_w = 0,
395         .log2_chroma_h = 0,
396         .comp = {
397             { 0, 1, 0, 6, 2, 0, 1, 1 },        /* R */
398             { 0, 1, 0, 3, 3, 0, 2, 1 },        /* G */
399             { 0, 1, 0, 0, 3, 0, 2, 1 },        /* B */
400         },
401         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
402     },
403     [AV_PIX_FMT_RGB4] = {
404         .name = "rgb4",
405         .nb_components = 3,
406         .log2_chroma_w = 0,
407         .log2_chroma_h = 0,
408         .comp = {
409             { 0, 4, 0, 0, 1, 3, 0, 1 },        /* R */
410             { 0, 4, 1, 0, 2, 3, 1, 2 },        /* G */
411             { 0, 4, 3, 0, 1, 3, 0, 4 },        /* B */
412         },
413         .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
414     },
415     [AV_PIX_FMT_RGB4_BYTE] = {
416         .name = "rgb4_byte",
417         .nb_components = 3,
418         .log2_chroma_w = 0,
419         .log2_chroma_h = 0,
420         .comp = {
421             { 0, 1, 0, 3, 1, 0, 0, 1 },        /* R */
422             { 0, 1, 0, 1, 2, 0, 1, 1 },        /* G */
423             { 0, 1, 0, 0, 1, 0, 0, 1 },        /* B */
424         },
425         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
426     },
427     [AV_PIX_FMT_NV12] = {
428         .name = "nv12",
429         .nb_components = 3,
430         .log2_chroma_w = 1,
431         .log2_chroma_h = 1,
432         .comp = {
433             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
434             { 1, 2, 0, 0, 8, 1, 7, 1 },        /* U */
435             { 1, 2, 1, 0, 8, 1, 7, 2 },        /* V */
436         },
437         .flags = AV_PIX_FMT_FLAG_PLANAR,
438     },
439     [AV_PIX_FMT_NV21] = {
440         .name = "nv21",
441         .nb_components = 3,
442         .log2_chroma_w = 1,
443         .log2_chroma_h = 1,
444         .comp = {
445             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
446             { 1, 2, 1, 0, 8, 1, 7, 2 },        /* U */
447             { 1, 2, 0, 0, 8, 1, 7, 1 },        /* V */
448         },
449         .flags = AV_PIX_FMT_FLAG_PLANAR,
450     },
451     [AV_PIX_FMT_ARGB] = {
452         .name = "argb",
453         .nb_components = 4,
454         .log2_chroma_w = 0,
455         .log2_chroma_h = 0,
456         .comp = {
457             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* R */
458             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* G */
459             { 0, 4, 3, 0, 8, 3, 7, 4 },        /* B */
460             { 0, 4, 0, 0, 8, 3, 7, 1 },        /* A */
461         },
462         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
463     },
464     [AV_PIX_FMT_RGBA] = {
465         .name = "rgba",
466         .nb_components = 4,
467         .log2_chroma_w = 0,
468         .log2_chroma_h = 0,
469         .comp = {
470             { 0, 4, 0, 0, 8, 3, 7, 1 },        /* R */
471             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* G */
472             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* B */
473             { 0, 4, 3, 0, 8, 3, 7, 4 },        /* A */
474         },
475         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
476     },
477     [AV_PIX_FMT_ABGR] = {
478         .name = "abgr",
479         .nb_components = 4,
480         .log2_chroma_w = 0,
481         .log2_chroma_h = 0,
482         .comp = {
483             { 0, 4, 3, 0, 8, 3, 7, 4 },        /* R */
484             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* G */
485             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* B */
486             { 0, 4, 0, 0, 8, 3, 7, 1 },        /* A */
487         },
488         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
489     },
490     [AV_PIX_FMT_BGRA] = {
491         .name = "bgra",
492         .nb_components = 4,
493         .log2_chroma_w = 0,
494         .log2_chroma_h = 0,
495         .comp = {
496             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* R */
497             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* G */
498             { 0, 4, 0, 0, 8, 3, 7, 1 },        /* B */
499             { 0, 4, 3, 0, 8, 3, 7, 4 },        /* A */
500         },
501         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
502     },
503     [AV_PIX_FMT_0RGB] = {
504         .name = "0rgb",
505         .nb_components= 3,
506         .log2_chroma_w= 0,
507         .log2_chroma_h= 0,
508         .comp = {
509             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* R */
510             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* G */
511             { 0, 4, 3, 0, 8, 3, 7, 4 },        /* B */
512         },
513         .flags = AV_PIX_FMT_FLAG_RGB,
514     },
515     [AV_PIX_FMT_RGB0] = {
516         .name = "rgb0",
517         .nb_components= 3,
518         .log2_chroma_w= 0,
519         .log2_chroma_h= 0,
520         .comp = {
521             { 0, 4, 0, 0, 8, 3, 7, 1 },        /* R */
522             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* G */
523             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* B */
524         },
525         .flags = AV_PIX_FMT_FLAG_RGB,
526     },
527     [AV_PIX_FMT_0BGR] = {
528         .name = "0bgr",
529         .nb_components= 3,
530         .log2_chroma_w= 0,
531         .log2_chroma_h= 0,
532         .comp = {
533             { 0, 4, 3, 0, 8, 3, 7, 4 },        /* R */
534             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* G */
535             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* B */
536         },
537         .flags = AV_PIX_FMT_FLAG_RGB,
538     },
539     [AV_PIX_FMT_BGR0] = {
540         .name = "bgr0",
541         .nb_components= 3,
542         .log2_chroma_w= 0,
543         .log2_chroma_h= 0,
544         .comp = {
545             { 0, 4, 2, 0, 8, 3, 7, 3 },        /* R */
546             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* G */
547             { 0, 4, 0, 0, 8, 3, 7, 1 },        /* B */
548         },
549         .flags = AV_PIX_FMT_FLAG_RGB,
550     },
551     [AV_PIX_FMT_GRAY9BE] = {
552         .name = "gray9be",
553         .nb_components = 1,
554         .log2_chroma_w = 0,
555         .log2_chroma_h = 0,
556         .comp = {
557             { 0, 2, 0, 0, 9, 1, 8, 1 },       /* Y */
558         },
559         .flags = AV_PIX_FMT_FLAG_BE,
560         .alias = "y9be",
561     },
562     [AV_PIX_FMT_GRAY9LE] = {
563         .name = "gray9le",
564         .nb_components = 1,
565         .log2_chroma_w = 0,
566         .log2_chroma_h = 0,
567         .comp = {
568             { 0, 2, 0, 0, 9, 1, 8, 1 },       /* Y */
569         },
570         .alias = "y9le",
571     },
572     [AV_PIX_FMT_GRAY10BE] = {
573         .name = "gray10be",
574         .nb_components = 1,
575         .log2_chroma_w = 0,
576         .log2_chroma_h = 0,
577         .comp = {
578             { 0, 2, 0, 0, 10, 1, 9, 1 },       /* Y */
579         },
580         .flags = AV_PIX_FMT_FLAG_BE,
581         .alias = "y10be",
582     },
583     [AV_PIX_FMT_GRAY10LE] = {
584         .name = "gray10le",
585         .nb_components = 1,
586         .log2_chroma_w = 0,
587         .log2_chroma_h = 0,
588         .comp = {
589             { 0, 2, 0, 0, 10, 1, 9, 1 },       /* Y */
590         },
591         .alias = "y10le",
592     },
593     [AV_PIX_FMT_GRAY12BE] = {
594         .name = "gray12be",
595         .nb_components = 1,
596         .log2_chroma_w = 0,
597         .log2_chroma_h = 0,
598         .comp = {
599             { 0, 2, 0, 0, 12, 1, 11, 1 },       /* Y */
600         },
601         .flags = AV_PIX_FMT_FLAG_BE,
602         .alias = "y12be",
603     },
604     [AV_PIX_FMT_GRAY12LE] = {
605         .name = "gray12le",
606         .nb_components = 1,
607         .log2_chroma_w = 0,
608         .log2_chroma_h = 0,
609         .comp = {
610             { 0, 2, 0, 0, 12, 1, 11, 1 },       /* Y */
611         },
612         .alias = "y12le",
613     },
614     [AV_PIX_FMT_GRAY16BE] = {
615         .name = "gray16be",
616         .nb_components = 1,
617         .log2_chroma_w = 0,
618         .log2_chroma_h = 0,
619         .comp = {
620             { 0, 2, 0, 0, 16, 1, 15, 1 },       /* Y */
621         },
622         .flags = AV_PIX_FMT_FLAG_BE,
623         .alias = "y16be",
624     },
625     [AV_PIX_FMT_GRAY16LE] = {
626         .name = "gray16le",
627         .nb_components = 1,
628         .log2_chroma_w = 0,
629         .log2_chroma_h = 0,
630         .comp = {
631             { 0, 2, 0, 0, 16, 1, 15, 1 },       /* Y */
632         },
633         .alias = "y16le",
634     },
635     [AV_PIX_FMT_YUV440P] = {
636         .name = "yuv440p",
637         .nb_components = 3,
638         .log2_chroma_w = 0,
639         .log2_chroma_h = 1,
640         .comp = {
641             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
642             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
643             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
644         },
645         .flags = AV_PIX_FMT_FLAG_PLANAR,
646     },
647     [AV_PIX_FMT_YUVJ440P] = {
648         .name = "yuvj440p",
649         .nb_components = 3,
650         .log2_chroma_w = 0,
651         .log2_chroma_h = 1,
652         .comp = {
653             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
654             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
655             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
656         },
657         .flags = AV_PIX_FMT_FLAG_PLANAR,
658     },
659     [AV_PIX_FMT_YUV440P10LE] = {
660         .name = "yuv440p10le",
661         .nb_components = 3,
662         .log2_chroma_w = 0,
663         .log2_chroma_h = 1,
664         .comp = {
665             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
666             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
667             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
668         },
669         .flags = AV_PIX_FMT_FLAG_PLANAR,
670     },
671     [AV_PIX_FMT_YUV440P10BE] = {
672         .name = "yuv440p10be",
673         .nb_components = 3,
674         .log2_chroma_w = 0,
675         .log2_chroma_h = 1,
676         .comp = {
677             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
678             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
679             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
680         },
681         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
682     },
683     [AV_PIX_FMT_YUV440P12LE] = {
684         .name = "yuv440p12le",
685         .nb_components = 3,
686         .log2_chroma_w = 0,
687         .log2_chroma_h = 1,
688         .comp = {
689             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
690             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
691             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
692         },
693         .flags = AV_PIX_FMT_FLAG_PLANAR,
694     },
695     [AV_PIX_FMT_YUV440P12BE] = {
696         .name = "yuv440p12be",
697         .nb_components = 3,
698         .log2_chroma_w = 0,
699         .log2_chroma_h = 1,
700         .comp = {
701             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
702             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
703             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
704         },
705         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
706     },
707     [AV_PIX_FMT_YUVA420P] = {
708         .name = "yuva420p",
709         .nb_components = 4,
710         .log2_chroma_w = 1,
711         .log2_chroma_h = 1,
712         .comp = {
713             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
714             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
715             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
716             { 3, 1, 0, 0, 8, 0, 7, 1 },        /* A */
717         },
718         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
719     },
720     [AV_PIX_FMT_YUVA422P] = {
721         .name = "yuva422p",
722         .nb_components = 4,
723         .log2_chroma_w = 1,
724         .log2_chroma_h = 0,
725         .comp = {
726             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
727             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
728             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
729             { 3, 1, 0, 0, 8, 0, 7, 1 },        /* A */
730         },
731         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
732     },
733     [AV_PIX_FMT_YUVA444P] = {
734         .name = "yuva444p",
735         .nb_components = 4,
736         .log2_chroma_w = 0,
737         .log2_chroma_h = 0,
738         .comp = {
739             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
740             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* U */
741             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* V */
742             { 3, 1, 0, 0, 8, 0, 7, 1 },        /* A */
743         },
744         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
745     },
746     [AV_PIX_FMT_YUVA420P9BE] = {
747         .name = "yuva420p9be",
748         .nb_components = 4,
749         .log2_chroma_w = 1,
750         .log2_chroma_h = 1,
751         .comp = {
752             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
753             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
754             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
755             { 3, 2, 0, 0, 9, 1, 8, 1 },        /* A */
756         },
757         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
758     },
759     [AV_PIX_FMT_YUVA420P9LE] = {
760         .name = "yuva420p9le",
761         .nb_components = 4,
762         .log2_chroma_w = 1,
763         .log2_chroma_h = 1,
764         .comp = {
765             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
766             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
767             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
768             { 3, 2, 0, 0, 9, 1, 8, 1 },        /* A */
769         },
770         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
771     },
772     [AV_PIX_FMT_YUVA422P9BE] = {
773         .name = "yuva422p9be",
774         .nb_components = 4,
775         .log2_chroma_w = 1,
776         .log2_chroma_h = 0,
777         .comp = {
778             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
779             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
780             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
781             { 3, 2, 0, 0, 9, 1, 8, 1 },        /* A */
782         },
783         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
784     },
785     [AV_PIX_FMT_YUVA422P9LE] = {
786         .name = "yuva422p9le",
787         .nb_components = 4,
788         .log2_chroma_w = 1,
789         .log2_chroma_h = 0,
790         .comp = {
791             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
792             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
793             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
794             { 3, 2, 0, 0, 9, 1, 8, 1 },        /* A */
795         },
796         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
797     },
798     [AV_PIX_FMT_YUVA444P9BE] = {
799         .name = "yuva444p9be",
800         .nb_components = 4,
801         .log2_chroma_w = 0,
802         .log2_chroma_h = 0,
803         .comp = {
804             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
805             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
806             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
807             { 3, 2, 0, 0, 9, 1, 8, 1 },        /* A */
808         },
809         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
810     },
811     [AV_PIX_FMT_YUVA444P9LE] = {
812         .name = "yuva444p9le",
813         .nb_components = 4,
814         .log2_chroma_w = 0,
815         .log2_chroma_h = 0,
816         .comp = {
817             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
818             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
819             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
820             { 3, 2, 0, 0, 9, 1, 8, 1 },        /* A */
821         },
822         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
823     },
824     [AV_PIX_FMT_YUVA420P10BE] = {
825         .name = "yuva420p10be",
826         .nb_components = 4,
827         .log2_chroma_w = 1,
828         .log2_chroma_h = 1,
829         .comp = {
830             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
831             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
832             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
833             { 3, 2, 0, 0, 10, 1, 9, 1 },        /* A */
834         },
835         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
836     },
837     [AV_PIX_FMT_YUVA420P10LE] = {
838         .name = "yuva420p10le",
839         .nb_components = 4,
840         .log2_chroma_w = 1,
841         .log2_chroma_h = 1,
842         .comp = {
843             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
844             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
845             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
846             { 3, 2, 0, 0, 10, 1, 9, 1 },        /* A */
847         },
848         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
849     },
850     [AV_PIX_FMT_YUVA422P10BE] = {
851         .name = "yuva422p10be",
852         .nb_components = 4,
853         .log2_chroma_w = 1,
854         .log2_chroma_h = 0,
855         .comp = {
856             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
857             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
858             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
859             { 3, 2, 0, 0, 10, 1, 9, 1 },        /* A */
860         },
861         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
862     },
863     [AV_PIX_FMT_YUVA422P10LE] = {
864         .name = "yuva422p10le",
865         .nb_components = 4,
866         .log2_chroma_w = 1,
867         .log2_chroma_h = 0,
868         .comp = {
869             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
870             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
871             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
872             { 3, 2, 0, 0, 10, 1, 9, 1 },        /* A */
873         },
874         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
875     },
876     [AV_PIX_FMT_YUVA444P10BE] = {
877         .name = "yuva444p10be",
878         .nb_components = 4,
879         .log2_chroma_w = 0,
880         .log2_chroma_h = 0,
881         .comp = {
882             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
883             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
884             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
885             { 3, 2, 0, 0, 10, 1, 9, 1 },        /* A */
886         },
887         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
888     },
889     [AV_PIX_FMT_YUVA444P10LE] = {
890         .name = "yuva444p10le",
891         .nb_components = 4,
892         .log2_chroma_w = 0,
893         .log2_chroma_h = 0,
894         .comp = {
895             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
896             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
897             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
898             { 3, 2, 0, 0, 10, 1, 9, 1 },        /* A */
899         },
900         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
901     },
902     [AV_PIX_FMT_YUVA420P16BE] = {
903         .name = "yuva420p16be",
904         .nb_components = 4,
905         .log2_chroma_w = 1,
906         .log2_chroma_h = 1,
907         .comp = {
908             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
909             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
910             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
911             { 3, 2, 0, 0, 16, 1, 15, 1 },        /* A */
912         },
913         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
914     },
915     [AV_PIX_FMT_YUVA420P16LE] = {
916         .name = "yuva420p16le",
917         .nb_components = 4,
918         .log2_chroma_w = 1,
919         .log2_chroma_h = 1,
920         .comp = {
921             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
922             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
923             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
924             { 3, 2, 0, 0, 16, 1, 15, 1 },        /* A */
925         },
926         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
927     },
928     [AV_PIX_FMT_YUVA422P16BE] = {
929         .name = "yuva422p16be",
930         .nb_components = 4,
931         .log2_chroma_w = 1,
932         .log2_chroma_h = 0,
933         .comp = {
934             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
935             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
936             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
937             { 3, 2, 0, 0, 16, 1, 15, 1 },        /* A */
938         },
939         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
940     },
941     [AV_PIX_FMT_YUVA422P16LE] = {
942         .name = "yuva422p16le",
943         .nb_components = 4,
944         .log2_chroma_w = 1,
945         .log2_chroma_h = 0,
946         .comp = {
947             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
948             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
949             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
950             { 3, 2, 0, 0, 16, 1, 15, 1 },        /* A */
951         },
952         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
953     },
954     [AV_PIX_FMT_YUVA444P16BE] = {
955         .name = "yuva444p16be",
956         .nb_components = 4,
957         .log2_chroma_w = 0,
958         .log2_chroma_h = 0,
959         .comp = {
960             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
961             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
962             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
963             { 3, 2, 0, 0, 16, 1, 15, 1 },        /* A */
964         },
965         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
966     },
967     [AV_PIX_FMT_YUVA444P16LE] = {
968         .name = "yuva444p16le",
969         .nb_components = 4,
970         .log2_chroma_w = 0,
971         .log2_chroma_h = 0,
972         .comp = {
973             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
974             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
975             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
976             { 3, 2, 0, 0, 16, 1, 15, 1 },        /* A */
977         },
978         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
979     },
980     [AV_PIX_FMT_RGB48BE] = {
981         .name = "rgb48be",
982         .nb_components = 3,
983         .log2_chroma_w = 0,
984         .log2_chroma_h = 0,
985         .comp = {
986             { 0, 6, 0, 0, 16, 5, 15, 1 },       /* R */
987             { 0, 6, 2, 0, 16, 5, 15, 3 },       /* G */
988             { 0, 6, 4, 0, 16, 5, 15, 5 },       /* B */
989         },
990         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
991     },
992     [AV_PIX_FMT_RGB48LE] = {
993         .name = "rgb48le",
994         .nb_components = 3,
995         .log2_chroma_w = 0,
996         .log2_chroma_h = 0,
997         .comp = {
998             { 0, 6, 0, 0, 16, 5, 15, 1 },       /* R */
999             { 0, 6, 2, 0, 16, 5, 15, 3 },       /* G */
1000             { 0, 6, 4, 0, 16, 5, 15, 5 },       /* B */
1001         },
1002         .flags = AV_PIX_FMT_FLAG_RGB,
1003     },
1004     [AV_PIX_FMT_RGBA64BE] = {
1005         .name = "rgba64be",
1006         .nb_components = 4,
1007         .log2_chroma_w = 0,
1008         .log2_chroma_h = 0,
1009         .comp = {
1010             { 0, 8, 0, 0, 16, 7, 15, 1 },       /* R */
1011             { 0, 8, 2, 0, 16, 7, 15, 3 },       /* G */
1012             { 0, 8, 4, 0, 16, 7, 15, 5 },       /* B */
1013             { 0, 8, 6, 0, 16, 7, 15, 7 },       /* A */
1014         },
1015         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1016     },
1017     [AV_PIX_FMT_RGBA64LE] = {
1018         .name = "rgba64le",
1019         .nb_components = 4,
1020         .log2_chroma_w = 0,
1021         .log2_chroma_h = 0,
1022         .comp = {
1023             { 0, 8, 0, 0, 16, 7, 15, 1 },       /* R */
1024             { 0, 8, 2, 0, 16, 7, 15, 3 },       /* G */
1025             { 0, 8, 4, 0, 16, 7, 15, 5 },       /* B */
1026             { 0, 8, 6, 0, 16, 7, 15, 7 },       /* A */
1027         },
1028         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1029     },
1030     [AV_PIX_FMT_RGB565BE] = {
1031         .name = "rgb565be",
1032         .nb_components = 3,
1033         .log2_chroma_w = 0,
1034         .log2_chroma_h = 0,
1035         .comp = {
1036             { 0, 2, -1, 3, 5, 1, 4, 0 },        /* R */
1037             { 0, 2,  0, 5, 6, 1, 5, 1 },        /* G */
1038             { 0, 2,  0, 0, 5, 1, 4, 1 },        /* B */
1039         },
1040         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1041     },
1042     [AV_PIX_FMT_RGB565LE] = {
1043         .name = "rgb565le",
1044         .nb_components = 3,
1045         .log2_chroma_w = 0,
1046         .log2_chroma_h = 0,
1047         .comp = {
1048             { 0, 2, 1, 3, 5, 1, 4, 2 },        /* R */
1049             { 0, 2, 0, 5, 6, 1, 5, 1 },        /* G */
1050             { 0, 2, 0, 0, 5, 1, 4, 1 },        /* B */
1051         },
1052         .flags = AV_PIX_FMT_FLAG_RGB,
1053     },
1054     [AV_PIX_FMT_RGB555BE] = {
1055         .name = "rgb555be",
1056         .nb_components = 3,
1057         .log2_chroma_w = 0,
1058         .log2_chroma_h = 0,
1059         .comp = {
1060             { 0, 2, -1, 2, 5, 1, 4, 0 },        /* R */
1061             { 0, 2,  0, 5, 5, 1, 4, 1 },        /* G */
1062             { 0, 2,  0, 0, 5, 1, 4, 1 },        /* B */
1063         },
1064         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1065     },
1066     [AV_PIX_FMT_RGB555LE] = {
1067         .name = "rgb555le",
1068         .nb_components = 3,
1069         .log2_chroma_w = 0,
1070         .log2_chroma_h = 0,
1071         .comp = {
1072             { 0, 2, 1, 2, 5, 1, 4, 2 },        /* R */
1073             { 0, 2, 0, 5, 5, 1, 4, 1 },        /* G */
1074             { 0, 2, 0, 0, 5, 1, 4, 1 },        /* B */
1075         },
1076         .flags = AV_PIX_FMT_FLAG_RGB,
1077     },
1078     [AV_PIX_FMT_RGB444BE] = {
1079         .name = "rgb444be",
1080         .nb_components = 3,
1081         .log2_chroma_w = 0,
1082         .log2_chroma_h = 0,
1083         .comp = {
1084             { 0, 2, -1, 0, 4, 1, 3, 0 },        /* R */
1085             { 0, 2,  0, 4, 4, 1, 3, 1 },        /* G */
1086             { 0, 2,  0, 0, 4, 1, 3, 1 },        /* B */
1087         },
1088         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1089     },
1090     [AV_PIX_FMT_RGB444LE] = {
1091         .name = "rgb444le",
1092         .nb_components = 3,
1093         .log2_chroma_w = 0,
1094         .log2_chroma_h = 0,
1095         .comp = {
1096             { 0, 2, 1, 0, 4, 1, 3, 2 },        /* R */
1097             { 0, 2, 0, 4, 4, 1, 3, 1 },        /* G */
1098             { 0, 2, 0, 0, 4, 1, 3, 1 },        /* B */
1099         },
1100         .flags = AV_PIX_FMT_FLAG_RGB,
1101     },
1102     [AV_PIX_FMT_BGR48BE] = {
1103         .name = "bgr48be",
1104         .nb_components = 3,
1105         .log2_chroma_w = 0,
1106         .log2_chroma_h = 0,
1107         .comp = {
1108             { 0, 6, 4, 0, 16, 5, 15, 5 },       /* R */
1109             { 0, 6, 2, 0, 16, 5, 15, 3 },       /* G */
1110             { 0, 6, 0, 0, 16, 5, 15, 1 },       /* B */
1111         },
1112         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1113     },
1114     [AV_PIX_FMT_BGR48LE] = {
1115         .name = "bgr48le",
1116         .nb_components = 3,
1117         .log2_chroma_w = 0,
1118         .log2_chroma_h = 0,
1119         .comp = {
1120             { 0, 6, 4, 0, 16, 5, 15, 5 },       /* R */
1121             { 0, 6, 2, 0, 16, 5, 15, 3 },       /* G */
1122             { 0, 6, 0, 0, 16, 5, 15, 1 },       /* B */
1123         },
1124         .flags = AV_PIX_FMT_FLAG_RGB,
1125     },
1126     [AV_PIX_FMT_BGRA64BE] = {
1127         .name = "bgra64be",
1128         .nb_components = 4,
1129         .log2_chroma_w = 0,
1130         .log2_chroma_h = 0,
1131         .comp = {
1132             { 0, 8, 4, 0, 16, 7, 15, 5 },       /* R */
1133             { 0, 8, 2, 0, 16, 7, 15, 3 },       /* G */
1134             { 0, 8, 0, 0, 16, 7, 15, 1 },       /* B */
1135             { 0, 8, 6, 0, 16, 7, 15, 7 },       /* A */
1136         },
1137         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1138     },
1139     [AV_PIX_FMT_BGRA64LE] = {
1140         .name = "bgra64le",
1141         .nb_components = 4,
1142         .log2_chroma_w = 0,
1143         .log2_chroma_h = 0,
1144         .comp = {
1145             { 0, 8, 4, 0, 16, 7, 15, 5 },       /* R */
1146             { 0, 8, 2, 0, 16, 7, 15, 3 },       /* G */
1147             { 0, 8, 0, 0, 16, 7, 15, 1 },       /* B */
1148             { 0, 8, 6, 0, 16, 7, 15, 7 },       /* A */
1149         },
1150         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1151     },
1152     [AV_PIX_FMT_BGR565BE] = {
1153         .name = "bgr565be",
1154         .nb_components = 3,
1155         .log2_chroma_w = 0,
1156         .log2_chroma_h = 0,
1157         .comp = {
1158             { 0, 2,  0, 0, 5, 1, 4, 1 },        /* R */
1159             { 0, 2,  0, 5, 6, 1, 5, 1 },        /* G */
1160             { 0, 2, -1, 3, 5, 1, 4, 0 },        /* B */
1161         },
1162         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1163     },
1164     [AV_PIX_FMT_BGR565LE] = {
1165         .name = "bgr565le",
1166         .nb_components = 3,
1167         .log2_chroma_w = 0,
1168         .log2_chroma_h = 0,
1169         .comp = {
1170             { 0, 2, 0, 0, 5, 1, 4, 1 },        /* R */
1171             { 0, 2, 0, 5, 6, 1, 5, 1 },        /* G */
1172             { 0, 2, 1, 3, 5, 1, 4, 2 },        /* B */
1173         },
1174         .flags = AV_PIX_FMT_FLAG_RGB,
1175     },
1176     [AV_PIX_FMT_BGR555BE] = {
1177         .name = "bgr555be",
1178         .nb_components = 3,
1179         .log2_chroma_w = 0,
1180         .log2_chroma_h = 0,
1181         .comp = {
1182             { 0, 2,  0, 0, 5, 1, 4, 1 },       /* R */
1183             { 0, 2,  0, 5, 5, 1, 4, 1 },       /* G */
1184             { 0, 2, -1, 2, 5, 1, 4, 0 },       /* B */
1185         },
1186         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1187      },
1188     [AV_PIX_FMT_BGR555LE] = {
1189         .name = "bgr555le",
1190         .nb_components = 3,
1191         .log2_chroma_w = 0,
1192         .log2_chroma_h = 0,
1193         .comp = {
1194             { 0, 2, 0, 0, 5, 1, 4, 1 },        /* R */
1195             { 0, 2, 0, 5, 5, 1, 4, 1 },        /* G */
1196             { 0, 2, 1, 2, 5, 1, 4, 2 },        /* B */
1197         },
1198         .flags = AV_PIX_FMT_FLAG_RGB,
1199     },
1200     [AV_PIX_FMT_BGR444BE] = {
1201         .name = "bgr444be",
1202         .nb_components = 3,
1203         .log2_chroma_w = 0,
1204         .log2_chroma_h = 0,
1205         .comp = {
1206             { 0, 2,  0, 0, 4, 1, 3, 1 },       /* R */
1207             { 0, 2,  0, 4, 4, 1, 3, 1 },       /* G */
1208             { 0, 2, -1, 0, 4, 1, 3, 0 },       /* B */
1209         },
1210         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1211      },
1212     [AV_PIX_FMT_BGR444LE] = {
1213         .name = "bgr444le",
1214         .nb_components = 3,
1215         .log2_chroma_w = 0,
1216         .log2_chroma_h = 0,
1217         .comp = {
1218             { 0, 2, 0, 0, 4, 1, 3, 1 },        /* R */
1219             { 0, 2, 0, 4, 4, 1, 3, 1 },        /* G */
1220             { 0, 2, 1, 0, 4, 1, 3, 2 },        /* B */
1221         },
1222         .flags = AV_PIX_FMT_FLAG_RGB,
1223     },
1224 #if FF_API_VAAPI
1225     [AV_PIX_FMT_VAAPI_MOCO] = {
1226         .name = "vaapi_moco",
1227         .log2_chroma_w = 1,
1228         .log2_chroma_h = 1,
1229         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1230     },
1231     [AV_PIX_FMT_VAAPI_IDCT] = {
1232         .name = "vaapi_idct",
1233         .log2_chroma_w = 1,
1234         .log2_chroma_h = 1,
1235         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1236     },
1237     [AV_PIX_FMT_VAAPI_VLD] = {
1238         .name = "vaapi_vld",
1239         .log2_chroma_w = 1,
1240         .log2_chroma_h = 1,
1241         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1242     },
1243 #else
1244     [AV_PIX_FMT_VAAPI] = {
1245         .name = "vaapi",
1246         .log2_chroma_w = 1,
1247         .log2_chroma_h = 1,
1248         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1249     },
1250 #endif
1251     [AV_PIX_FMT_YUV420P9LE] = {
1252         .name = "yuv420p9le",
1253         .nb_components = 3,
1254         .log2_chroma_w = 1,
1255         .log2_chroma_h = 1,
1256         .comp = {
1257             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
1258             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
1259             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
1260         },
1261         .flags = AV_PIX_FMT_FLAG_PLANAR,
1262     },
1263     [AV_PIX_FMT_YUV420P9BE] = {
1264         .name = "yuv420p9be",
1265         .nb_components = 3,
1266         .log2_chroma_w = 1,
1267         .log2_chroma_h = 1,
1268         .comp = {
1269             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
1270             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
1271             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
1272         },
1273         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1274     },
1275     [AV_PIX_FMT_YUV420P10LE] = {
1276         .name = "yuv420p10le",
1277         .nb_components = 3,
1278         .log2_chroma_w = 1,
1279         .log2_chroma_h = 1,
1280         .comp = {
1281             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
1282             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
1283             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
1284         },
1285         .flags = AV_PIX_FMT_FLAG_PLANAR,
1286     },
1287     [AV_PIX_FMT_YUV420P10BE] = {
1288         .name = "yuv420p10be",
1289         .nb_components = 3,
1290         .log2_chroma_w = 1,
1291         .log2_chroma_h = 1,
1292         .comp = {
1293             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
1294             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
1295             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
1296         },
1297         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1298     },
1299     [AV_PIX_FMT_YUV420P12LE] = {
1300         .name = "yuv420p12le",
1301         .nb_components = 3,
1302         .log2_chroma_w = 1,
1303         .log2_chroma_h = 1,
1304         .comp = {
1305             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
1306             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
1307             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
1308         },
1309         .flags = AV_PIX_FMT_FLAG_PLANAR,
1310     },
1311     [AV_PIX_FMT_YUV420P12BE] = {
1312         .name = "yuv420p12be",
1313         .nb_components = 3,
1314         .log2_chroma_w = 1,
1315         .log2_chroma_h = 1,
1316         .comp = {
1317             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
1318             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
1319             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
1320         },
1321         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1322     },
1323     [AV_PIX_FMT_YUV420P14LE] = {
1324         .name = "yuv420p14le",
1325         .nb_components = 3,
1326         .log2_chroma_w = 1,
1327         .log2_chroma_h = 1,
1328         .comp = {
1329             { 0, 2, 0, 0, 14, 1, 13, 1 },        /* Y */
1330             { 1, 2, 0, 0, 14, 1, 13, 1 },        /* U */
1331             { 2, 2, 0, 0, 14, 1, 13, 1 },        /* V */
1332         },
1333         .flags = AV_PIX_FMT_FLAG_PLANAR,
1334     },
1335     [AV_PIX_FMT_YUV420P14BE] = {
1336         .name = "yuv420p14be",
1337         .nb_components = 3,
1338         .log2_chroma_w = 1,
1339         .log2_chroma_h = 1,
1340         .comp = {
1341             { 0, 2, 0, 0, 14, 1, 13, 1 },        /* Y */
1342             { 1, 2, 0, 0, 14, 1, 13, 1 },        /* U */
1343             { 2, 2, 0, 0, 14, 1, 13, 1 },        /* V */
1344         },
1345         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1346     },
1347     [AV_PIX_FMT_YUV420P16LE] = {
1348         .name = "yuv420p16le",
1349         .nb_components = 3,
1350         .log2_chroma_w = 1,
1351         .log2_chroma_h = 1,
1352         .comp = {
1353             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
1354             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
1355             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
1356         },
1357         .flags = AV_PIX_FMT_FLAG_PLANAR,
1358     },
1359     [AV_PIX_FMT_YUV420P16BE] = {
1360         .name = "yuv420p16be",
1361         .nb_components = 3,
1362         .log2_chroma_w = 1,
1363         .log2_chroma_h = 1,
1364         .comp = {
1365             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
1366             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
1367             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
1368         },
1369         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1370     },
1371     [AV_PIX_FMT_YUV422P9LE] = {
1372         .name = "yuv422p9le",
1373         .nb_components = 3,
1374         .log2_chroma_w = 1,
1375         .log2_chroma_h = 0,
1376         .comp = {
1377             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
1378             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
1379             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
1380         },
1381         .flags = AV_PIX_FMT_FLAG_PLANAR,
1382     },
1383     [AV_PIX_FMT_YUV422P9BE] = {
1384         .name = "yuv422p9be",
1385         .nb_components = 3,
1386         .log2_chroma_w = 1,
1387         .log2_chroma_h = 0,
1388         .comp = {
1389             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
1390             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
1391             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
1392         },
1393         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1394     },
1395     [AV_PIX_FMT_YUV422P10LE] = {
1396         .name = "yuv422p10le",
1397         .nb_components = 3,
1398         .log2_chroma_w = 1,
1399         .log2_chroma_h = 0,
1400         .comp = {
1401             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
1402             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
1403             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
1404         },
1405         .flags = AV_PIX_FMT_FLAG_PLANAR,
1406     },
1407     [AV_PIX_FMT_YUV422P10BE] = {
1408         .name = "yuv422p10be",
1409         .nb_components = 3,
1410         .log2_chroma_w = 1,
1411         .log2_chroma_h = 0,
1412         .comp = {
1413             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
1414             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
1415             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
1416         },
1417         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1418     },
1419     [AV_PIX_FMT_YUV422P12LE] = {
1420         .name = "yuv422p12le",
1421         .nb_components = 3,
1422         .log2_chroma_w = 1,
1423         .log2_chroma_h = 0,
1424         .comp = {
1425             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
1426             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
1427             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
1428         },
1429         .flags = AV_PIX_FMT_FLAG_PLANAR,
1430     },
1431     [AV_PIX_FMT_YUV422P12BE] = {
1432         .name = "yuv422p12be",
1433         .nb_components = 3,
1434         .log2_chroma_w = 1,
1435         .log2_chroma_h = 0,
1436         .comp = {
1437             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
1438             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
1439             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
1440         },
1441         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1442     },
1443     [AV_PIX_FMT_YUV422P14LE] = {
1444         .name = "yuv422p14le",
1445         .nb_components = 3,
1446         .log2_chroma_w = 1,
1447         .log2_chroma_h = 0,
1448         .comp = {
1449             { 0, 2, 0, 0, 14, 1, 13, 1 },        /* Y */
1450             { 1, 2, 0, 0, 14, 1, 13, 1 },        /* U */
1451             { 2, 2, 0, 0, 14, 1, 13, 1 },        /* V */
1452         },
1453         .flags = AV_PIX_FMT_FLAG_PLANAR,
1454     },
1455     [AV_PIX_FMT_YUV422P14BE] = {
1456         .name = "yuv422p14be",
1457         .nb_components = 3,
1458         .log2_chroma_w = 1,
1459         .log2_chroma_h = 0,
1460         .comp = {
1461             { 0, 2, 0, 0, 14, 1, 13, 1 },        /* Y */
1462             { 1, 2, 0, 0, 14, 1, 13, 1 },        /* U */
1463             { 2, 2, 0, 0, 14, 1, 13, 1 },        /* V */
1464         },
1465         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1466     },
1467     [AV_PIX_FMT_YUV422P16LE] = {
1468         .name = "yuv422p16le",
1469         .nb_components = 3,
1470         .log2_chroma_w = 1,
1471         .log2_chroma_h = 0,
1472         .comp = {
1473             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
1474             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
1475             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
1476         },
1477         .flags = AV_PIX_FMT_FLAG_PLANAR,
1478     },
1479     [AV_PIX_FMT_YUV422P16BE] = {
1480         .name = "yuv422p16be",
1481         .nb_components = 3,
1482         .log2_chroma_w = 1,
1483         .log2_chroma_h = 0,
1484         .comp = {
1485             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
1486             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
1487             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
1488         },
1489         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1490     },
1491     [AV_PIX_FMT_YUV444P16LE] = {
1492         .name = "yuv444p16le",
1493         .nb_components = 3,
1494         .log2_chroma_w = 0,
1495         .log2_chroma_h = 0,
1496         .comp = {
1497             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
1498             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
1499             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
1500         },
1501         .flags = AV_PIX_FMT_FLAG_PLANAR,
1502     },
1503     [AV_PIX_FMT_YUV444P16BE] = {
1504         .name = "yuv444p16be",
1505         .nb_components = 3,
1506         .log2_chroma_w = 0,
1507         .log2_chroma_h = 0,
1508         .comp = {
1509             { 0, 2, 0, 0, 16, 1, 15, 1 },        /* Y */
1510             { 1, 2, 0, 0, 16, 1, 15, 1 },        /* U */
1511             { 2, 2, 0, 0, 16, 1, 15, 1 },        /* V */
1512         },
1513         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1514     },
1515     [AV_PIX_FMT_YUV444P10LE] = {
1516         .name = "yuv444p10le",
1517         .nb_components = 3,
1518         .log2_chroma_w = 0,
1519         .log2_chroma_h = 0,
1520         .comp = {
1521             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
1522             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
1523             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
1524         },
1525         .flags = AV_PIX_FMT_FLAG_PLANAR,
1526     },
1527     [AV_PIX_FMT_YUV444P10BE] = {
1528         .name = "yuv444p10be",
1529         .nb_components = 3,
1530         .log2_chroma_w = 0,
1531         .log2_chroma_h = 0,
1532         .comp = {
1533             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
1534             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* U */
1535             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* V */
1536         },
1537         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1538     },
1539     [AV_PIX_FMT_YUV444P9LE] = {
1540         .name = "yuv444p9le",
1541         .nb_components = 3,
1542         .log2_chroma_w = 0,
1543         .log2_chroma_h = 0,
1544         .comp = {
1545             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
1546             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
1547             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
1548         },
1549         .flags = AV_PIX_FMT_FLAG_PLANAR,
1550     },
1551     [AV_PIX_FMT_YUV444P9BE] = {
1552         .name = "yuv444p9be",
1553         .nb_components = 3,
1554         .log2_chroma_w = 0,
1555         .log2_chroma_h = 0,
1556         .comp = {
1557             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* Y */
1558             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* U */
1559             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* V */
1560         },
1561         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1562     },
1563     [AV_PIX_FMT_YUV444P12LE] = {
1564         .name = "yuv444p12le",
1565         .nb_components = 3,
1566         .log2_chroma_w = 0,
1567         .log2_chroma_h = 0,
1568         .comp = {
1569             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
1570             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
1571             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
1572         },
1573         .flags = AV_PIX_FMT_FLAG_PLANAR,
1574     },
1575     [AV_PIX_FMT_YUV444P12BE] = {
1576         .name = "yuv444p12be",
1577         .nb_components = 3,
1578         .log2_chroma_w = 0,
1579         .log2_chroma_h = 0,
1580         .comp = {
1581             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
1582             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
1583             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
1584         },
1585         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1586     },
1587     [AV_PIX_FMT_YUV444P14LE] = {
1588         .name = "yuv444p14le",
1589         .nb_components = 3,
1590         .log2_chroma_w = 0,
1591         .log2_chroma_h = 0,
1592         .comp = {
1593             { 0, 2, 0, 0, 14, 1, 13, 1 },        /* Y */
1594             { 1, 2, 0, 0, 14, 1, 13, 1 },        /* U */
1595             { 2, 2, 0, 0, 14, 1, 13, 1 },        /* V */
1596         },
1597         .flags = AV_PIX_FMT_FLAG_PLANAR,
1598     },
1599     [AV_PIX_FMT_YUV444P14BE] = {
1600         .name = "yuv444p14be",
1601         .nb_components = 3,
1602         .log2_chroma_w = 0,
1603         .log2_chroma_h = 0,
1604         .comp = {
1605             { 0, 2, 0, 0, 14, 1, 13, 1 },        /* Y */
1606             { 1, 2, 0, 0, 14, 1, 13, 1 },        /* U */
1607             { 2, 2, 0, 0, 14, 1, 13, 1 },        /* V */
1608         },
1609         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1610     },
1611     [AV_PIX_FMT_D3D11VA_VLD] = {
1612         .name = "d3d11va_vld",
1613         .log2_chroma_w = 1,
1614         .log2_chroma_h = 1,
1615         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1616     },
1617     [AV_PIX_FMT_DXVA2_VLD] = {
1618         .name = "dxva2_vld",
1619         .log2_chroma_w = 1,
1620         .log2_chroma_h = 1,
1621         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1622     },
1623     [AV_PIX_FMT_YA8] = {
1624         .name = "ya8",
1625         .nb_components = 2,
1626         .comp = {
1627             { 0, 2, 0, 0, 8, 1, 7, 1 },        /* Y */
1628             { 0, 2, 1, 0, 8, 1, 7, 2 },        /* A */
1629         },
1630         .flags = AV_PIX_FMT_FLAG_ALPHA,
1631         .alias = "gray8a",
1632     },
1633     [AV_PIX_FMT_YA16LE] = {
1634         .name = "ya16le",
1635         .nb_components = 2,
1636         .comp = {
1637             { 0, 4, 0, 0, 16, 3, 15, 1 },        /* Y */
1638             { 0, 4, 2, 0, 16, 3, 15, 3 },        /* A */
1639         },
1640         .flags = AV_PIX_FMT_FLAG_ALPHA,
1641     },
1642     [AV_PIX_FMT_YA16BE] = {
1643         .name = "ya16be",
1644         .nb_components = 2,
1645         .comp = {
1646             { 0, 4, 0, 0, 16, 3, 15, 1 },        /* Y */
1647             { 0, 4, 2, 0, 16, 3, 15, 3 },        /* A */
1648         },
1649         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_ALPHA,
1650     },
1651     [AV_PIX_FMT_VIDEOTOOLBOX] = {
1652         .name = "videotoolbox_vld",
1653         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1654     },
1655     [AV_PIX_FMT_GBRP] = {
1656         .name = "gbrp",
1657         .nb_components = 3,
1658         .log2_chroma_w = 0,
1659         .log2_chroma_h = 0,
1660         .comp = {
1661             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* R */
1662             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* G */
1663             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* B */
1664         },
1665         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1666     },
1667     [AV_PIX_FMT_GBRP9LE] = {
1668         .name = "gbrp9le",
1669         .nb_components = 3,
1670         .log2_chroma_w = 0,
1671         .log2_chroma_h = 0,
1672         .comp = {
1673             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* R */
1674             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* G */
1675             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* B */
1676         },
1677         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1678     },
1679     [AV_PIX_FMT_GBRP9BE] = {
1680         .name = "gbrp9be",
1681         .nb_components = 3,
1682         .log2_chroma_w = 0,
1683         .log2_chroma_h = 0,
1684         .comp = {
1685             { 2, 2, 0, 0, 9, 1, 8, 1 },        /* R */
1686             { 0, 2, 0, 0, 9, 1, 8, 1 },        /* G */
1687             { 1, 2, 0, 0, 9, 1, 8, 1 },        /* B */
1688         },
1689         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1690     },
1691     [AV_PIX_FMT_GBRP10LE] = {
1692         .name = "gbrp10le",
1693         .nb_components = 3,
1694         .log2_chroma_w = 0,
1695         .log2_chroma_h = 0,
1696         .comp = {
1697             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* R */
1698             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* G */
1699             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* B */
1700         },
1701         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1702     },
1703     [AV_PIX_FMT_GBRP10BE] = {
1704         .name = "gbrp10be",
1705         .nb_components = 3,
1706         .log2_chroma_w = 0,
1707         .log2_chroma_h = 0,
1708         .comp = {
1709             { 2, 2, 0, 0, 10, 1, 9, 1 },        /* R */
1710             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* G */
1711             { 1, 2, 0, 0, 10, 1, 9, 1 },        /* B */
1712         },
1713         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1714     },
1715     [AV_PIX_FMT_GBRP12LE] = {
1716         .name = "gbrp12le",
1717         .nb_components = 3,
1718         .log2_chroma_w = 0,
1719         .log2_chroma_h = 0,
1720         .comp = {
1721             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* R */
1722             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* G */
1723             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* B */
1724         },
1725         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1726     },
1727     [AV_PIX_FMT_GBRP12BE] = {
1728         .name = "gbrp12be",
1729         .nb_components = 3,
1730         .log2_chroma_w = 0,
1731         .log2_chroma_h = 0,
1732         .comp = {
1733             { 2, 2, 0, 0, 12, 1, 11, 1 },        /* R */
1734             { 0, 2, 0, 0, 12, 1, 11, 1 },        /* G */
1735             { 1, 2, 0, 0, 12, 1, 11, 1 },        /* B */
1736         },
1737         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1738     },
1739     [AV_PIX_FMT_GBRP14LE] = {
1740         .name = "gbrp14le",
1741         .nb_components = 3,
1742         .log2_chroma_w = 0,
1743         .log2_chroma_h = 0,
1744         .comp = {
1745             { 2, 2, 0, 0, 14, 1, 13, 1 },        /* R */
1746             { 0, 2, 0, 0, 14, 1, 13, 1 },        /* G */
1747             { 1, 2, 0, 0, 14, 1, 13, 1 },        /* B */
1748         },
1749         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1750     },
1751     [AV_PIX_FMT_GBRP14BE] = {
1752         .name = "gbrp14be",
1753         .nb_components = 3,
1754         .log2_chroma_w = 0,
1755         .log2_chroma_h = 0,
1756         .comp = {
1757             { 2, 2, 0, 0, 14, 1, 13, 1 },        /* R */
1758             { 0, 2, 0, 0, 14, 1, 13, 1 },        /* G */
1759             { 1, 2, 0, 0, 14, 1, 13, 1 },        /* B */
1760         },
1761         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1762     },
1763     [AV_PIX_FMT_GBRP16LE] = {
1764         .name = "gbrp16le",
1765         .nb_components = 3,
1766         .log2_chroma_w = 0,
1767         .log2_chroma_h = 0,
1768         .comp = {
1769             { 2, 2, 0, 0, 16, 1, 15, 1 },       /* R */
1770             { 0, 2, 0, 0, 16, 1, 15, 1 },       /* G */
1771             { 1, 2, 0, 0, 16, 1, 15, 1 },       /* B */
1772         },
1773         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1774     },
1775     [AV_PIX_FMT_GBRP16BE] = {
1776         .name = "gbrp16be",
1777         .nb_components = 3,
1778         .log2_chroma_w = 0,
1779         .log2_chroma_h = 0,
1780         .comp = {
1781             { 2, 2, 0, 0, 16, 1, 15, 1 },       /* R */
1782             { 0, 2, 0, 0, 16, 1, 15, 1 },       /* G */
1783             { 1, 2, 0, 0, 16, 1, 15, 1 },       /* B */
1784         },
1785         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1786     },
1787     [AV_PIX_FMT_GBRAP] = {
1788         .name = "gbrap",
1789         .nb_components = 4,
1790         .log2_chroma_w = 0,
1791         .log2_chroma_h = 0,
1792         .comp = {
1793             { 2, 1, 0, 0, 8, 0, 7, 1 },        /* R */
1794             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* G */
1795             { 1, 1, 0, 0, 8, 0, 7, 1 },        /* B */
1796             { 3, 1, 0, 0, 8, 0, 7, 1 },        /* A */
1797         },
1798         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
1799                  AV_PIX_FMT_FLAG_ALPHA,
1800     },
1801     [AV_PIX_FMT_GBRAP16LE] = {
1802         .name = "gbrap16le",
1803         .nb_components = 4,
1804         .log2_chroma_w = 0,
1805         .log2_chroma_h = 0,
1806         .comp = {
1807             { 2, 2, 0, 0, 16, 1, 15, 1 },       /* R */
1808             { 0, 2, 0, 0, 16, 1, 15, 1 },       /* G */
1809             { 1, 2, 0, 0, 16, 1, 15, 1 },       /* B */
1810             { 3, 2, 0, 0, 16, 1, 15, 1 },       /* A */
1811         },
1812         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
1813                  AV_PIX_FMT_FLAG_ALPHA,
1814     },
1815     [AV_PIX_FMT_GBRAP16BE] = {
1816         .name = "gbrap16be",
1817         .nb_components = 4,
1818         .log2_chroma_w = 0,
1819         .log2_chroma_h = 0,
1820         .comp = {
1821             { 2, 2, 0, 0, 16, 1, 15, 1 },       /* R */
1822             { 0, 2, 0, 0, 16, 1, 15, 1 },       /* G */
1823             { 1, 2, 0, 0, 16, 1, 15, 1 },       /* B */
1824             { 3, 2, 0, 0, 16, 1, 15, 1 },       /* A */
1825         },
1826         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
1827                  AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1828     },
1829     [AV_PIX_FMT_VDPAU] = {
1830         .name = "vdpau",
1831         .log2_chroma_w = 1,
1832         .log2_chroma_h = 1,
1833         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1834     },
1835     [AV_PIX_FMT_XYZ12LE] = {
1836         .name = "xyz12le",
1837         .nb_components = 3,
1838         .log2_chroma_w = 0,
1839         .log2_chroma_h = 0,
1840         .comp = {
1841             { 0, 6, 0, 4, 12, 5, 11, 1 },       /* X */
1842             { 0, 6, 2, 4, 12, 5, 11, 3 },       /* Y */
1843             { 0, 6, 4, 4, 12, 5, 11, 5 },       /* Z */
1844       },
1845       /*.flags = -- not used*/
1846     },
1847     [AV_PIX_FMT_XYZ12BE] = {
1848         .name = "xyz12be",
1849         .nb_components = 3,
1850         .log2_chroma_w = 0,
1851         .log2_chroma_h = 0,
1852         .comp = {
1853             { 0, 6, 0, 4, 12, 5, 11, 1 },       /* X */
1854             { 0, 6, 2, 4, 12, 5, 11, 3 },       /* Y */
1855             { 0, 6, 4, 4, 12, 5, 11, 5 },       /* Z */
1856        },
1857         .flags = AV_PIX_FMT_FLAG_BE,
1858     },
1859
1860 #define BAYER8_DESC_COMMON \
1861         .nb_components= 3, \
1862         .log2_chroma_w= 0, \
1863         .log2_chroma_h= 0, \
1864         .comp = {          \
1865             {0,1,0,0,2,0,1,1},\
1866             {0,1,0,0,4,0,3,1},\
1867             {0,1,0,0,2,0,1,1},\
1868         },                 \
1869
1870 #define BAYER16_DESC_COMMON \
1871         .nb_components= 3, \
1872         .log2_chroma_w= 0, \
1873         .log2_chroma_h= 0, \
1874         .comp = {          \
1875             {0,2,0,0,4,1,3,1},\
1876             {0,2,0,0,8,1,7,1},\
1877             {0,2,0,0,4,1,3,1},\
1878         },                 \
1879
1880     [AV_PIX_FMT_BAYER_BGGR8] = {
1881         .name = "bayer_bggr8",
1882         BAYER8_DESC_COMMON
1883         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1884     },
1885     [AV_PIX_FMT_BAYER_BGGR16LE] = {
1886         .name = "bayer_bggr16le",
1887         BAYER16_DESC_COMMON
1888         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1889     },
1890     [AV_PIX_FMT_BAYER_BGGR16BE] = {
1891         .name = "bayer_bggr16be",
1892         BAYER16_DESC_COMMON
1893         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1894     },
1895     [AV_PIX_FMT_BAYER_RGGB8] = {
1896         .name = "bayer_rggb8",
1897         BAYER8_DESC_COMMON
1898         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1899     },
1900     [AV_PIX_FMT_BAYER_RGGB16LE] = {
1901         .name = "bayer_rggb16le",
1902         BAYER16_DESC_COMMON
1903         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1904     },
1905     [AV_PIX_FMT_BAYER_RGGB16BE] = {
1906         .name = "bayer_rggb16be",
1907         BAYER16_DESC_COMMON
1908         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1909     },
1910     [AV_PIX_FMT_BAYER_GBRG8] = {
1911         .name = "bayer_gbrg8",
1912         BAYER8_DESC_COMMON
1913         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1914     },
1915     [AV_PIX_FMT_BAYER_GBRG16LE] = {
1916         .name = "bayer_gbrg16le",
1917         BAYER16_DESC_COMMON
1918         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1919     },
1920     [AV_PIX_FMT_BAYER_GBRG16BE] = {
1921         .name = "bayer_gbrg16be",
1922         BAYER16_DESC_COMMON
1923         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1924     },
1925     [AV_PIX_FMT_BAYER_GRBG8] = {
1926         .name = "bayer_grbg8",
1927         BAYER8_DESC_COMMON
1928         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1929     },
1930     [AV_PIX_FMT_BAYER_GRBG16LE] = {
1931         .name = "bayer_grbg16le",
1932         BAYER16_DESC_COMMON
1933         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1934     },
1935     [AV_PIX_FMT_BAYER_GRBG16BE] = {
1936         .name = "bayer_grbg16be",
1937         BAYER16_DESC_COMMON
1938         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
1939     },
1940     [AV_PIX_FMT_NV16] = {
1941         .name = "nv16",
1942         .nb_components = 3,
1943         .log2_chroma_w = 1,
1944         .log2_chroma_h = 0,
1945         .comp = {
1946             { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
1947             { 1, 2, 0, 0, 8, 1, 7, 1 },        /* U */
1948             { 1, 2, 1, 0, 8, 1, 7, 2 },        /* V */
1949         },
1950         .flags = AV_PIX_FMT_FLAG_PLANAR,
1951     },
1952     [AV_PIX_FMT_NV20LE] = {
1953         .name = "nv20le",
1954         .nb_components = 3,
1955         .log2_chroma_w = 1,
1956         .log2_chroma_h = 0,
1957         .comp = {
1958             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
1959             { 1, 4, 0, 0, 10, 3, 9, 1 },        /* U */
1960             { 1, 4, 2, 0, 10, 3, 9, 3 },        /* V */
1961         },
1962         .flags = AV_PIX_FMT_FLAG_PLANAR,
1963     },
1964     [AV_PIX_FMT_NV20BE] = {
1965         .name = "nv20be",
1966         .nb_components = 3,
1967         .log2_chroma_w = 1,
1968         .log2_chroma_h = 0,
1969         .comp = {
1970             { 0, 2, 0, 0, 10, 1, 9, 1 },        /* Y */
1971             { 1, 4, 0, 0, 10, 3, 9, 1 },        /* U */
1972             { 1, 4, 2, 0, 10, 3, 9, 3 },        /* V */
1973         },
1974         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
1975     },
1976     [AV_PIX_FMT_QSV] = {
1977         .name = "qsv",
1978         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1979     },
1980     [AV_PIX_FMT_MEDIACODEC] = {
1981         .name = "mediacodec",
1982         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1983     },
1984     [AV_PIX_FMT_MMAL] = {
1985         .name = "mmal",
1986         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1987     },
1988     [AV_PIX_FMT_CUDA] = {
1989         .name = "cuda",
1990         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1991     },
1992     [AV_PIX_FMT_AYUV64LE] = {
1993         .name = "ayuv64le",
1994         .nb_components = 4,
1995         .log2_chroma_w = 0,
1996         .log2_chroma_h = 0,
1997         .comp = {
1998             { 0, 8, 2, 0, 16, 7, 15, 3 },        /* Y */
1999             { 0, 8, 4, 0, 16, 7, 15, 5 },        /* U */
2000             { 0, 8, 6, 0, 16, 7, 15, 7 },        /* V */
2001             { 0, 8, 0, 0, 16, 7, 15, 1 },        /* A */
2002         },
2003         .flags = AV_PIX_FMT_FLAG_ALPHA,
2004     },
2005     [AV_PIX_FMT_AYUV64BE] = {
2006         .name = "ayuv64be",
2007         .nb_components = 4,
2008         .log2_chroma_w = 0,
2009         .log2_chroma_h = 0,
2010         .comp = {
2011             { 0, 8, 2, 0, 16, 7, 15, 3 },        /* Y */
2012             { 0, 8, 4, 0, 16, 7, 15, 5 },        /* U */
2013             { 0, 8, 6, 0, 16, 7, 15, 7 },        /* V */
2014             { 0, 8, 0, 0, 16, 7, 15, 1 },        /* A */
2015         },
2016         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_ALPHA,
2017     },
2018     [AV_PIX_FMT_P010LE] = {
2019         .name = "p010le",
2020         .nb_components = 3,
2021         .log2_chroma_w = 1,
2022         .log2_chroma_h = 1,
2023         .comp = {
2024             { 0, 2, 0, 6, 10, 1, 9, 1 },        /* Y */
2025             { 1, 4, 0, 6, 10, 3, 9, 1 },        /* U */
2026             { 1, 4, 2, 6, 10, 3, 9, 3 },        /* V */
2027         },
2028         .flags = AV_PIX_FMT_FLAG_PLANAR,
2029     },
2030     [AV_PIX_FMT_P010BE] = {
2031         .name = "p010be",
2032         .nb_components = 3,
2033         .log2_chroma_w = 1,
2034         .log2_chroma_h = 1,
2035         .comp = {
2036             { 0, 2, 0, 6, 10, 1, 9, 1 },        /* Y */
2037             { 1, 4, 0, 6, 10, 3, 9, 1 },        /* U */
2038             { 1, 4, 2, 6, 10, 3, 9, 3 },        /* V */
2039         },
2040         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2041     },
2042     [AV_PIX_FMT_P016LE] = {
2043         .name = "p016le",
2044         .nb_components = 3,
2045         .log2_chroma_w = 1,
2046         .log2_chroma_h = 1,
2047         .comp = {
2048             { 0, 2, 0, 0, 16, 1, 15, 1 },       /* Y */
2049             { 1, 4, 0, 0, 16, 3, 15, 1 },       /* U */
2050             { 1, 4, 2, 0, 16, 3, 15, 3 },       /* V */
2051         },
2052         .flags = AV_PIX_FMT_FLAG_PLANAR,
2053     },
2054     [AV_PIX_FMT_P016BE] = {
2055         .name = "p016be",
2056         .nb_components = 3,
2057         .log2_chroma_w = 1,
2058         .log2_chroma_h = 1,
2059         .comp = {
2060             { 0, 2, 0, 0, 16, 1, 15, 1 },       /* Y */
2061             { 1, 4, 0, 0, 16, 3, 15, 1 },       /* U */
2062             { 1, 4, 2, 0, 16, 3, 15, 3 },       /* V */
2063         },
2064         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2065     },
2066     [AV_PIX_FMT_GBRAP12LE] = {
2067         .name = "gbrap12le",
2068         .nb_components = 4,
2069         .log2_chroma_w = 0,
2070         .log2_chroma_h = 0,
2071         .comp = {
2072             { 2, 2, 0, 0, 12, 1, 11, 1 },       /* R */
2073             { 0, 2, 0, 0, 12, 1, 11, 1 },       /* G */
2074             { 1, 2, 0, 0, 12, 1, 11, 1 },       /* B */
2075             { 3, 2, 0, 0, 12, 1, 11, 1 },       /* A */
2076         },
2077         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
2078                  AV_PIX_FMT_FLAG_ALPHA,
2079     },
2080     [AV_PIX_FMT_GBRAP12BE] = {
2081         .name = "gbrap12be",
2082         .nb_components = 4,
2083         .log2_chroma_w = 0,
2084         .log2_chroma_h = 0,
2085         .comp = {
2086             { 2, 2, 0, 0, 12, 1, 11, 1 },       /* R */
2087             { 0, 2, 0, 0, 12, 1, 11, 1 },       /* G */
2088             { 1, 2, 0, 0, 12, 1, 11, 1 },       /* B */
2089             { 3, 2, 0, 0, 12, 1, 11, 1 },       /* A */
2090         },
2091         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2092                  AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
2093     },
2094     [AV_PIX_FMT_GBRAP10LE] = {
2095         .name = "gbrap10le",
2096         .nb_components = 4,
2097         .log2_chroma_w = 0,
2098         .log2_chroma_h = 0,
2099         .comp = {
2100             { 2, 2, 0, 0, 10, 1, 9, 1 },       /* R */
2101             { 0, 2, 0, 0, 10, 1, 9, 1 },       /* G */
2102             { 1, 2, 0, 0, 10, 1, 9, 1 },       /* B */
2103             { 3, 2, 0, 0, 10, 1, 9, 1 },       /* A */
2104         },
2105         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
2106                  AV_PIX_FMT_FLAG_ALPHA,
2107     },
2108     [AV_PIX_FMT_GBRAP10BE] = {
2109         .name = "gbrap10be",
2110         .nb_components = 4,
2111         .log2_chroma_w = 0,
2112         .log2_chroma_h = 0,
2113         .comp = {
2114             { 2, 2, 0, 0, 10, 1, 9, 1 },       /* R */
2115             { 0, 2, 0, 0, 10, 1, 9, 1 },       /* G */
2116             { 1, 2, 0, 0, 10, 1, 9, 1 },       /* B */
2117             { 3, 2, 0, 0, 10, 1, 9, 1 },       /* A */
2118         },
2119         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2120                  AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
2121     },
2122     [AV_PIX_FMT_D3D11] = {
2123         .name = "d3d11",
2124         .flags = AV_PIX_FMT_FLAG_HWACCEL,
2125     },
2126     [AV_PIX_FMT_GBRPF32BE] = {
2127         .name = "gbrpf32be",
2128         .nb_components = 3,
2129         .log2_chroma_w = 0,
2130         .log2_chroma_h = 0,
2131         .comp = {
2132             { 2, 4, 0, 0, 32, 3, 31, 1 },        /* R */
2133             { 0, 4, 0, 0, 32, 3, 31, 1 },        /* G */
2134             { 1, 4, 0, 0, 32, 3, 31, 1 },        /* B */
2135         },
2136         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2137                  AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_FLOAT,
2138     },
2139     [AV_PIX_FMT_GBRPF32LE] = {
2140         .name = "gbrpf32le",
2141         .nb_components = 3,
2142         .log2_chroma_w = 0,
2143         .log2_chroma_h = 0,
2144         .comp = {
2145             { 2, 4, 0, 0, 32, 3, 31, 1 },        /* R */
2146             { 0, 4, 0, 0, 32, 3, 31, 1 },        /* G */
2147             { 1, 4, 0, 0, 32, 3, 31, 1 },        /* B */
2148         },
2149         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_FLOAT | AV_PIX_FMT_FLAG_RGB,
2150     },
2151     [AV_PIX_FMT_GBRAPF32BE] = {
2152         .name = "gbrapf32be",
2153         .nb_components = 4,
2154         .log2_chroma_w = 0,
2155         .log2_chroma_h = 0,
2156         .comp = {
2157             { 2, 4, 0, 0, 32, 3, 31, 1 },        /* R */
2158             { 0, 4, 0, 0, 32, 3, 31, 1 },        /* G */
2159             { 1, 4, 0, 0, 32, 3, 31, 1 },        /* B */
2160             { 3, 4, 0, 0, 32, 3, 31, 1 },        /* A */
2161         },
2162         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2163                  AV_PIX_FMT_FLAG_ALPHA | AV_PIX_FMT_FLAG_RGB |
2164                  AV_PIX_FMT_FLAG_FLOAT,
2165     },
2166     [AV_PIX_FMT_GBRAPF32LE] = {
2167         .name = "gbrapf32le",
2168         .nb_components = 4,
2169         .log2_chroma_w = 0,
2170         .log2_chroma_h = 0,
2171         .comp = {
2172             { 2, 4, 0, 0, 32, 3, 31, 1 },        /* R */
2173             { 0, 4, 0, 0, 32, 3, 31, 1 },        /* G */
2174             { 1, 4, 0, 0, 32, 3, 31, 1 },        /* B */
2175             { 3, 4, 0, 0, 32, 3, 31, 1 },        /* A */
2176         },
2177         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA |
2178                  AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_FLOAT,
2179     },
2180     [AV_PIX_FMT_DRM_PRIME] = {
2181         .name = "drm_prime",
2182         .flags = AV_PIX_FMT_FLAG_HWACCEL,
2183     },
2184 };
2185 #if FF_API_PLUS1_MINUS1
2186 FF_ENABLE_DEPRECATION_WARNINGS
2187 #endif
2188
2189 static const char * const color_range_names[] = {
2190     [AVCOL_RANGE_UNSPECIFIED] = "unknown",
2191     [AVCOL_RANGE_MPEG] = "tv",
2192     [AVCOL_RANGE_JPEG] = "pc",
2193 };
2194
2195 static const char * const color_primaries_names[AVCOL_PRI_NB] = {
2196     [AVCOL_PRI_RESERVED0] = "reserved",
2197     [AVCOL_PRI_BT709] = "bt709",
2198     [AVCOL_PRI_UNSPECIFIED] = "unknown",
2199     [AVCOL_PRI_RESERVED] = "reserved",
2200     [AVCOL_PRI_BT470M] = "bt470m",
2201     [AVCOL_PRI_BT470BG] = "bt470bg",
2202     [AVCOL_PRI_SMPTE170M] = "smpte170m",
2203     [AVCOL_PRI_SMPTE240M] = "smpte240m",
2204     [AVCOL_PRI_FILM] = "film",
2205     [AVCOL_PRI_BT2020] = "bt2020",
2206     [AVCOL_PRI_SMPTE428] = "smpte428",
2207     [AVCOL_PRI_SMPTE431] = "smpte431",
2208     [AVCOL_PRI_SMPTE432] = "smpte432",
2209     [AVCOL_PRI_JEDEC_P22] = "jedec-p22",
2210 };
2211
2212 static const char * const color_transfer_names[] = {
2213     [AVCOL_TRC_RESERVED0] = "reserved",
2214     [AVCOL_TRC_BT709] = "bt709",
2215     [AVCOL_TRC_UNSPECIFIED] = "unknown",
2216     [AVCOL_TRC_RESERVED] = "reserved",
2217     [AVCOL_TRC_GAMMA22] = "bt470m",
2218     [AVCOL_TRC_GAMMA28] = "bt470bg",
2219     [AVCOL_TRC_SMPTE170M] = "smpte170m",
2220     [AVCOL_TRC_SMPTE240M] = "smpte240m",
2221     [AVCOL_TRC_LINEAR] = "linear",
2222     [AVCOL_TRC_LOG] = "log100",
2223     [AVCOL_TRC_LOG_SQRT] = "log316",
2224     [AVCOL_TRC_IEC61966_2_4] = "iec61966-2-4",
2225     [AVCOL_TRC_BT1361_ECG] = "bt1361e",
2226     [AVCOL_TRC_IEC61966_2_1] = "iec61966-2-1",
2227     [AVCOL_TRC_BT2020_10] = "bt2020-10",
2228     [AVCOL_TRC_BT2020_12] = "bt2020-12",
2229     [AVCOL_TRC_SMPTE2084] = "smpte2084",
2230     [AVCOL_TRC_SMPTE428] = "smpte428",
2231     [AVCOL_TRC_ARIB_STD_B67] = "arib-std-b67",
2232 };
2233
2234 static const char * const color_space_names[] = {
2235     [AVCOL_SPC_RGB] = "gbr",
2236     [AVCOL_SPC_BT709] = "bt709",
2237     [AVCOL_SPC_UNSPECIFIED] = "unknown",
2238     [AVCOL_SPC_RESERVED] = "reserved",
2239     [AVCOL_SPC_FCC] = "fcc",
2240     [AVCOL_SPC_BT470BG] = "bt470bg",
2241     [AVCOL_SPC_SMPTE170M] = "smpte170m",
2242     [AVCOL_SPC_SMPTE240M] = "smpte240m",
2243     [AVCOL_SPC_YCGCO] = "ycgco",
2244     [AVCOL_SPC_BT2020_NCL] = "bt2020nc",
2245     [AVCOL_SPC_BT2020_CL] = "bt2020c",
2246     [AVCOL_SPC_SMPTE2085] = "smpte2085",
2247     [AVCOL_SPC_CHROMA_DERIVED_NCL] = "chroma-derived-nc",
2248     [AVCOL_SPC_CHROMA_DERIVED_CL] = "chroma-derived-c",
2249     [AVCOL_SPC_ICTCP] = "ictcp",
2250 };
2251
2252 static const char * const chroma_location_names[] = {
2253     [AVCHROMA_LOC_UNSPECIFIED] = "unspecified",
2254     [AVCHROMA_LOC_LEFT] = "left",
2255     [AVCHROMA_LOC_CENTER] = "center",
2256     [AVCHROMA_LOC_TOPLEFT] = "topleft",
2257     [AVCHROMA_LOC_TOP] = "top",
2258     [AVCHROMA_LOC_BOTTOMLEFT] = "bottomleft",
2259     [AVCHROMA_LOC_BOTTOM] = "bottom",
2260 };
2261
2262 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
2263 {
2264     enum AVPixelFormat pix_fmt;
2265
2266     for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
2267         if (av_pix_fmt_descriptors[pix_fmt].name &&
2268             (!strcmp(av_pix_fmt_descriptors[pix_fmt].name, name) ||
2269              av_match_name(name, av_pix_fmt_descriptors[pix_fmt].alias)))
2270             return pix_fmt;
2271
2272     return AV_PIX_FMT_NONE;
2273 }
2274
2275 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
2276 {
2277     return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
2278         av_pix_fmt_descriptors[pix_fmt].name : NULL;
2279 }
2280
2281 #if HAVE_BIGENDIAN
2282 #   define X_NE(be, le) be
2283 #else
2284 #   define X_NE(be, le) le
2285 #endif
2286
2287 enum AVPixelFormat av_get_pix_fmt(const char *name)
2288 {
2289     enum AVPixelFormat pix_fmt;
2290
2291     if (!strcmp(name, "rgb32"))
2292         name = X_NE("argb", "bgra");
2293     else if (!strcmp(name, "bgr32"))
2294         name = X_NE("abgr", "rgba");
2295
2296     pix_fmt = get_pix_fmt_internal(name);
2297     if (pix_fmt == AV_PIX_FMT_NONE) {
2298         char name2[32];
2299
2300         snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
2301         pix_fmt = get_pix_fmt_internal(name2);
2302     }
2303
2304 #if FF_API_VAAPI
2305     if (pix_fmt == AV_PIX_FMT_NONE && !strcmp(name, "vaapi"))
2306         pix_fmt = AV_PIX_FMT_VAAPI;
2307 #endif
2308     return pix_fmt;
2309 }
2310
2311 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
2312 {
2313     int c, bits = 0;
2314     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
2315
2316     for (c = 0; c < pixdesc->nb_components; c++) {
2317         int s = c == 1 || c == 2 ? 0 : log2_pixels;
2318         bits += pixdesc->comp[c].depth << s;
2319     }
2320
2321     return bits >> log2_pixels;
2322 }
2323
2324 int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
2325 {
2326     int c, bits = 0;
2327     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
2328     int steps[4] = {0};
2329
2330     for (c = 0; c < pixdesc->nb_components; c++) {
2331         const AVComponentDescriptor *comp = &pixdesc->comp[c];
2332         int s = c == 1 || c == 2 ? 0 : log2_pixels;
2333         steps[comp->plane] = comp->step << s;
2334     }
2335     for (c = 0; c < 4; c++)
2336         bits += steps[c];
2337
2338     if(!(pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM))
2339         bits *= 8;
2340
2341     return bits >> log2_pixels;
2342 }
2343
2344 char *av_get_pix_fmt_string(char *buf, int buf_size,
2345                             enum AVPixelFormat pix_fmt)
2346 {
2347     /* print header */
2348     if (pix_fmt < 0) {
2349        snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
2350     } else {
2351         const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
2352         snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
2353                  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
2354     }
2355
2356     return buf;
2357 }
2358
2359 const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
2360 {
2361     if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
2362         return NULL;
2363     return &av_pix_fmt_descriptors[pix_fmt];
2364 }
2365
2366 const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
2367 {
2368     if (!prev)
2369         return &av_pix_fmt_descriptors[0];
2370     while (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1) {
2371         prev++;
2372         if (prev->name)
2373             return prev;
2374     }
2375     return NULL;
2376 }
2377
2378 enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
2379 {
2380     if (desc < av_pix_fmt_descriptors ||
2381         desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
2382         return AV_PIX_FMT_NONE;
2383
2384     return desc - av_pix_fmt_descriptors;
2385 }
2386
2387 int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
2388                                      int *h_shift, int *v_shift)
2389 {
2390     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2391     if (!desc)
2392         return AVERROR(ENOSYS);
2393     *h_shift = desc->log2_chroma_w;
2394     *v_shift = desc->log2_chroma_h;
2395
2396     return 0;
2397 }
2398
2399 int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
2400 {
2401     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2402     int i, planes[4] = { 0 }, ret = 0;
2403
2404     if (!desc)
2405         return AVERROR(EINVAL);
2406
2407     for (i = 0; i < desc->nb_components; i++)
2408         planes[desc->comp[i].plane] = 1;
2409     for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
2410         ret += planes[i];
2411     return ret;
2412 }
2413
2414 void ff_check_pixfmt_descriptors(void){
2415     int i, j;
2416
2417     for (i=0; i<FF_ARRAY_ELEMS(av_pix_fmt_descriptors); i++) {
2418         const AVPixFmtDescriptor *d = &av_pix_fmt_descriptors[i];
2419         uint8_t fill[4][8+6+3] = {{0}};
2420         uint8_t *data[4] = {fill[0], fill[1], fill[2], fill[3]};
2421         int linesize[4] = {0,0,0,0};
2422         uint16_t tmp[2];
2423
2424         if (!d->name && !d->nb_components && !d->log2_chroma_w && !d->log2_chroma_h && !d->flags)
2425             continue;
2426 //         av_log(NULL, AV_LOG_DEBUG, "Checking: %s\n", d->name);
2427         av_assert0(d->log2_chroma_w <= 3);
2428         av_assert0(d->log2_chroma_h <= 3);
2429         av_assert0(d->nb_components <= 4);
2430         av_assert0(d->name && d->name[0]);
2431         av_assert0((d->nb_components==4 || d->nb_components==2) == !!(d->flags & AV_PIX_FMT_FLAG_ALPHA));
2432         av_assert2(av_get_pix_fmt(d->name) == i);
2433
2434         for (j=0; j<FF_ARRAY_ELEMS(d->comp); j++) {
2435             const AVComponentDescriptor *c = &d->comp[j];
2436             if(j>=d->nb_components) {
2437                 av_assert0(!c->plane && !c->step && !c->offset && !c->shift && !c->depth);
2438                 continue;
2439             }
2440             if (d->flags & AV_PIX_FMT_FLAG_BITSTREAM) {
2441                 av_assert0(c->step >= c->depth);
2442             } else {
2443                 av_assert0(8*c->step >= c->depth);
2444             }
2445             if (d->flags & AV_PIX_FMT_FLAG_BAYER)
2446                 continue;
2447             av_read_image_line(tmp, (void*)data, linesize, d, 0, 0, j, 2, 0);
2448             av_assert0(tmp[0] == 0 && tmp[1] == 0);
2449             tmp[0] = tmp[1] = (1<<c->depth) - 1;
2450             av_write_image_line(tmp, data, linesize, d, 0, 0, j, 2);
2451         }
2452     }
2453 }
2454
2455
2456 enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
2457 {
2458     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2459     char name[16];
2460     int i;
2461
2462     if (!desc || strlen(desc->name) < 2)
2463         return AV_PIX_FMT_NONE;
2464     av_strlcpy(name, desc->name, sizeof(name));
2465     i = strlen(name) - 2;
2466     if (strcmp(name + i, "be") && strcmp(name + i, "le"))
2467         return AV_PIX_FMT_NONE;
2468
2469     name[i] ^= 'b' ^ 'l';
2470
2471     return get_pix_fmt_internal(name);
2472 }
2473
2474 #define FF_COLOR_NA      -1
2475 #define FF_COLOR_RGB      0 /**< RGB color space */
2476 #define FF_COLOR_GRAY     1 /**< gray color space */
2477 #define FF_COLOR_YUV      2 /**< YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */
2478 #define FF_COLOR_YUV_JPEG 3 /**< YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */
2479 #define FF_COLOR_XYZ      4
2480
2481 #define pixdesc_has_alpha(pixdesc) \
2482     ((pixdesc)->nb_components == 2 || (pixdesc)->nb_components == 4 || (pixdesc)->flags & AV_PIX_FMT_FLAG_PAL)
2483
2484
2485 static int get_color_type(const AVPixFmtDescriptor *desc) {
2486     if (desc->flags & AV_PIX_FMT_FLAG_PAL)
2487         return FF_COLOR_RGB;
2488
2489     if(desc->nb_components == 1 || desc->nb_components == 2)
2490         return FF_COLOR_GRAY;
2491
2492     if(desc->name && !strncmp(desc->name, "yuvj", 4))
2493         return FF_COLOR_YUV_JPEG;
2494
2495     if(desc->name && !strncmp(desc->name, "xyz", 3))
2496         return FF_COLOR_XYZ;
2497
2498     if(desc->flags & AV_PIX_FMT_FLAG_RGB)
2499         return  FF_COLOR_RGB;
2500
2501     if(desc->nb_components == 0)
2502         return FF_COLOR_NA;
2503
2504     return FF_COLOR_YUV;
2505 }
2506
2507 static int get_pix_fmt_depth(int *min, int *max, enum AVPixelFormat pix_fmt)
2508 {
2509     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2510     int i;
2511
2512     if (!desc || !desc->nb_components) {
2513         *min = *max = 0;
2514         return AVERROR(EINVAL);
2515     }
2516
2517     *min = INT_MAX, *max = -INT_MAX;
2518     for (i = 0; i < desc->nb_components; i++) {
2519         *min = FFMIN(desc->comp[i].depth, *min);
2520         *max = FFMAX(desc->comp[i].depth, *max);
2521     }
2522     return 0;
2523 }
2524
2525 static int get_pix_fmt_score(enum AVPixelFormat dst_pix_fmt,
2526                               enum AVPixelFormat src_pix_fmt,
2527                               unsigned *lossp, unsigned consider)
2528 {
2529     const AVPixFmtDescriptor *src_desc = av_pix_fmt_desc_get(src_pix_fmt);
2530     const AVPixFmtDescriptor *dst_desc = av_pix_fmt_desc_get(dst_pix_fmt);
2531     int src_color, dst_color;
2532     int src_min_depth, src_max_depth, dst_min_depth, dst_max_depth;
2533     int ret, loss, i, nb_components;
2534     int score = INT_MAX - 1;
2535
2536     if (!src_desc || !dst_desc)
2537         return -4;
2538
2539     if ((src_desc->flags & AV_PIX_FMT_FLAG_HWACCEL) ||
2540         (dst_desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
2541         if (dst_pix_fmt == src_pix_fmt)
2542             return -1;
2543         else
2544             return -2;
2545     }
2546
2547     /* compute loss */
2548     *lossp = loss = 0;
2549
2550     if (dst_pix_fmt == src_pix_fmt)
2551         return INT_MAX;
2552
2553     if ((ret = get_pix_fmt_depth(&src_min_depth, &src_max_depth, src_pix_fmt)) < 0)
2554         return -3;
2555     if ((ret = get_pix_fmt_depth(&dst_min_depth, &dst_max_depth, dst_pix_fmt)) < 0)
2556         return -3;
2557
2558     src_color = get_color_type(src_desc);
2559     dst_color = get_color_type(dst_desc);
2560     if (dst_pix_fmt == AV_PIX_FMT_PAL8)
2561         nb_components = FFMIN(src_desc->nb_components, 4);
2562     else
2563         nb_components = FFMIN(src_desc->nb_components, dst_desc->nb_components);
2564
2565     for (i = 0; i < nb_components; i++) {
2566         int depth_minus1 = (dst_pix_fmt == AV_PIX_FMT_PAL8) ? 7/nb_components : (dst_desc->comp[i].depth - 1);
2567         if (src_desc->comp[i].depth - 1 > depth_minus1 && (consider & FF_LOSS_DEPTH)) {
2568             loss |= FF_LOSS_DEPTH;
2569             score -= 65536 >> depth_minus1;
2570         }
2571     }
2572
2573     if (consider & FF_LOSS_RESOLUTION) {
2574         if (dst_desc->log2_chroma_w > src_desc->log2_chroma_w) {
2575             loss |= FF_LOSS_RESOLUTION;
2576             score -= 256 << dst_desc->log2_chroma_w;
2577         }
2578         if (dst_desc->log2_chroma_h > src_desc->log2_chroma_h) {
2579             loss |= FF_LOSS_RESOLUTION;
2580             score -= 256 << dst_desc->log2_chroma_h;
2581         }
2582         // don't favor 422 over 420 if downsampling is needed, because 420 has much better support on the decoder side
2583         if (dst_desc->log2_chroma_w == 1 && src_desc->log2_chroma_w == 0 &&
2584             dst_desc->log2_chroma_h == 1 && src_desc->log2_chroma_h == 0 ) {
2585             score += 512;
2586         }
2587     }
2588
2589     if(consider & FF_LOSS_COLORSPACE)
2590     switch(dst_color) {
2591     case FF_COLOR_RGB:
2592         if (src_color != FF_COLOR_RGB &&
2593             src_color != FF_COLOR_GRAY)
2594             loss |= FF_LOSS_COLORSPACE;
2595         break;
2596     case FF_COLOR_GRAY:
2597         if (src_color != FF_COLOR_GRAY)
2598             loss |= FF_LOSS_COLORSPACE;
2599         break;
2600     case FF_COLOR_YUV:
2601         if (src_color != FF_COLOR_YUV)
2602             loss |= FF_LOSS_COLORSPACE;
2603         break;
2604     case FF_COLOR_YUV_JPEG:
2605         if (src_color != FF_COLOR_YUV_JPEG &&
2606             src_color != FF_COLOR_YUV &&
2607             src_color != FF_COLOR_GRAY)
2608             loss |= FF_LOSS_COLORSPACE;
2609         break;
2610     default:
2611         /* fail safe test */
2612         if (src_color != dst_color)
2613             loss |= FF_LOSS_COLORSPACE;
2614         break;
2615     }
2616     if(loss & FF_LOSS_COLORSPACE)
2617         score -= (nb_components * 65536) >> FFMIN(dst_desc->comp[0].depth - 1, src_desc->comp[0].depth - 1);
2618
2619     if (dst_color == FF_COLOR_GRAY &&
2620         src_color != FF_COLOR_GRAY && (consider & FF_LOSS_CHROMA)) {
2621         loss |= FF_LOSS_CHROMA;
2622         score -= 2 * 65536;
2623     }
2624     if (!pixdesc_has_alpha(dst_desc) && (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))) {
2625         loss |= FF_LOSS_ALPHA;
2626         score -= 65536;
2627     }
2628     if (dst_pix_fmt == AV_PIX_FMT_PAL8 && (consider & FF_LOSS_COLORQUANT) &&
2629         (src_pix_fmt != AV_PIX_FMT_PAL8 && (src_color != FF_COLOR_GRAY || (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))))) {
2630         loss |= FF_LOSS_COLORQUANT;
2631         score -= 65536;
2632     }
2633
2634     *lossp = loss;
2635     return score;
2636 }
2637
2638 int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,
2639                             enum AVPixelFormat src_pix_fmt,
2640                             int has_alpha)
2641 {
2642     int loss;
2643     int ret = get_pix_fmt_score(dst_pix_fmt, src_pix_fmt, &loss, has_alpha ? ~0 : ~FF_LOSS_ALPHA);
2644     if (ret < 0)
2645         return ret;
2646     return loss;
2647 }
2648
2649 enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
2650                                              enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
2651 {
2652     enum AVPixelFormat dst_pix_fmt;
2653     int loss1, loss2, loss_mask;
2654     const AVPixFmtDescriptor *desc1 = av_pix_fmt_desc_get(dst_pix_fmt1);
2655     const AVPixFmtDescriptor *desc2 = av_pix_fmt_desc_get(dst_pix_fmt2);
2656     int score1, score2;
2657
2658     if (!desc1) {
2659         dst_pix_fmt = dst_pix_fmt2;
2660     } else if (!desc2) {
2661         dst_pix_fmt = dst_pix_fmt1;
2662     } else {
2663         loss_mask= loss_ptr?~*loss_ptr:~0; /* use loss mask if provided */
2664         if(!has_alpha)
2665             loss_mask &= ~FF_LOSS_ALPHA;
2666
2667         score1 = get_pix_fmt_score(dst_pix_fmt1, src_pix_fmt, &loss1, loss_mask);
2668         score2 = get_pix_fmt_score(dst_pix_fmt2, src_pix_fmt, &loss2, loss_mask);
2669
2670         if (score1 == score2) {
2671             if(av_get_padded_bits_per_pixel(desc2) != av_get_padded_bits_per_pixel(desc1)) {
2672                 dst_pix_fmt = av_get_padded_bits_per_pixel(desc2) < av_get_padded_bits_per_pixel(desc1) ? dst_pix_fmt2 : dst_pix_fmt1;
2673             } else {
2674                 dst_pix_fmt = desc2->nb_components < desc1->nb_components ? dst_pix_fmt2 : dst_pix_fmt1;
2675             }
2676         } else {
2677             dst_pix_fmt = score1 < score2 ? dst_pix_fmt2 : dst_pix_fmt1;
2678         }
2679     }
2680
2681     if (loss_ptr)
2682         *loss_ptr = av_get_pix_fmt_loss(dst_pix_fmt, src_pix_fmt, has_alpha);
2683     return dst_pix_fmt;
2684 }
2685
2686 const char *av_color_range_name(enum AVColorRange range)
2687 {
2688     return (unsigned) range < AVCOL_RANGE_NB ?
2689         color_range_names[range] : NULL;
2690 }
2691
2692 int av_color_range_from_name(const char *name)
2693 {
2694     int i;
2695
2696     for (i = 0; i < FF_ARRAY_ELEMS(color_range_names); i++) {
2697         size_t len = strlen(color_range_names[i]);
2698         if (!strncmp(color_range_names[i], name, len))
2699             return i;
2700     }
2701
2702     return AVERROR(EINVAL);
2703 }
2704
2705 const char *av_color_primaries_name(enum AVColorPrimaries primaries)
2706 {
2707     return (unsigned) primaries < AVCOL_PRI_NB ?
2708         color_primaries_names[primaries] : NULL;
2709 }
2710
2711 int av_color_primaries_from_name(const char *name)
2712 {
2713     int i;
2714
2715     for (i = 0; i < FF_ARRAY_ELEMS(color_primaries_names); i++) {
2716         size_t len = strlen(color_primaries_names[i]);
2717         if (!strncmp(color_primaries_names[i], name, len))
2718             return i;
2719     }
2720
2721     return AVERROR(EINVAL);
2722 }
2723
2724 const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
2725 {
2726     return (unsigned) transfer < AVCOL_TRC_NB ?
2727         color_transfer_names[transfer] : NULL;
2728 }
2729
2730 int av_color_transfer_from_name(const char *name)
2731 {
2732     int i;
2733
2734     for (i = 0; i < FF_ARRAY_ELEMS(color_transfer_names); i++) {
2735         size_t len = strlen(color_transfer_names[i]);
2736         if (!strncmp(color_transfer_names[i], name, len))
2737             return i;
2738     }
2739
2740     return AVERROR(EINVAL);
2741 }
2742
2743 const char *av_color_space_name(enum AVColorSpace space)
2744 {
2745     return (unsigned) space < AVCOL_SPC_NB ?
2746         color_space_names[space] : NULL;
2747 }
2748
2749 int av_color_space_from_name(const char *name)
2750 {
2751     int i;
2752
2753     for (i = 0; i < FF_ARRAY_ELEMS(color_space_names); i++) {
2754         size_t len = strlen(color_space_names[i]);
2755         if (!strncmp(color_space_names[i], name, len))
2756             return i;
2757     }
2758
2759     return AVERROR(EINVAL);
2760 }
2761
2762 const char *av_chroma_location_name(enum AVChromaLocation location)
2763 {
2764     return (unsigned) location < AVCHROMA_LOC_NB ?
2765         chroma_location_names[location] : NULL;
2766 }
2767
2768 int av_chroma_location_from_name(const char *name)
2769 {
2770     int i;
2771
2772     for (i = 0; i < FF_ARRAY_ELEMS(chroma_location_names); i++) {
2773         size_t len = strlen(chroma_location_names[i]);
2774         if (!strncmp(chroma_location_names[i], name, len))
2775             return i;
2776     }
2777
2778     return AVERROR(EINVAL);
2779 }