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