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