]> git.sesse.net Git - ffmpeg/blob - libavutil/pixdesc.c
Avoid overflows when reading pgm files with maxval != 255 and != 65535.
[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 "common.h"
27 #include "pixfmt.h"
28 #include "pixdesc.h"
29
30 #include "intreadwrite.h"
31 #include "avstring.h"
32
33 void av_read_image_line(uint16_t *dst,
34                         const uint8_t *data[4], const int linesize[4],
35                         const AVPixFmtDescriptor *desc,
36                         int x, int y, int c, int w,
37                         int read_pal_component)
38 {
39     AVComponentDescriptor comp = desc->comp[c];
40     int plane = comp.plane;
41     int depth = comp.depth_minus1 + 1;
42     int mask  = (1 << depth) - 1;
43     int shift = comp.shift;
44     int step  = comp.step_minus1 + 1;
45     int flags = desc->flags;
46
47     if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
48         int skip = x * step + comp.offset_plus1 - 1;
49         const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
50         int shift = 8 - depth - (skip & 7);
51
52         while (w--) {
53             int val = (*p >> shift) & mask;
54             if (read_pal_component)
55                 val = data[1][4*val + c];
56             shift -= step;
57             p -= shift >> 3;
58             shift &= 7;
59             *dst++ = val;
60         }
61     } else {
62         const uint8_t *p = data[plane] + y * linesize[plane] +
63                            x * step + comp.offset_plus1 - 1;
64         int is_8bit = shift + depth <= 8;
65
66         if (is_8bit)
67             p += !!(flags & AV_PIX_FMT_FLAG_BE);
68
69         while (w--) {
70             int val = is_8bit ? *p :
71                 flags & AV_PIX_FMT_FLAG_BE ? AV_RB16(p) : AV_RL16(p);
72             val = (val >> shift) & mask;
73             if (read_pal_component)
74                 val = data[1][4 * val + c];
75             p += step;
76             *dst++ = val;
77         }
78     }
79 }
80
81 void av_write_image_line(const uint16_t *src,
82                          uint8_t *data[4], const int linesize[4],
83                          const AVPixFmtDescriptor *desc,
84                          int x, int y, int c, int w)
85 {
86     AVComponentDescriptor comp = desc->comp[c];
87     int plane = comp.plane;
88     int depth = comp.depth_minus1 + 1;
89     int step  = comp.step_minus1 + 1;
90     int flags = desc->flags;
91
92     if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
93         int skip = x * step + comp.offset_plus1 - 1;
94         uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
95         int shift = 8 - depth - (skip & 7);
96
97         while (w--) {
98             *p |= *src++ << shift;
99             shift -= step;
100             p -= shift >> 3;
101             shift &= 7;
102         }
103     } else {
104         int shift = comp.shift;
105         uint8_t *p = data[plane] + y * linesize[plane] +
106                      x * step + comp.offset_plus1 - 1;
107
108         if (shift + depth <= 8) {
109             p += !!(flags & AV_PIX_FMT_FLAG_BE);
110             while (w--) {
111                 *p |= (*src++ << shift);
112                 p += step;
113             }
114         } else {
115             while (w--) {
116                 if (flags & AV_PIX_FMT_FLAG_BE) {
117                     uint16_t val = AV_RB16(p) | (*src++ << shift);
118                     AV_WB16(p, val);
119                 } else {
120                     uint16_t val = AV_RL16(p) | (*src++ << shift);
121                     AV_WL16(p, val);
122                 }
123                 p += step;
124             }
125         }
126     }
127 }
128
129 #if !FF_API_PIX_FMT_DESC
130 static
131 #endif
132 const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
133     [AV_PIX_FMT_YUV420P] = {
134         .name = "yuv420p",
135         .nb_components = 3,
136         .log2_chroma_w = 1,
137         .log2_chroma_h = 1,
138         .comp = {
139             { 0, 0, 1, 0, 7 },        /* Y */
140             { 1, 0, 1, 0, 7 },        /* U */
141             { 2, 0, 1, 0, 7 },        /* V */
142         },
143         .flags = AV_PIX_FMT_FLAG_PLANAR,
144     },
145     [AV_PIX_FMT_YUYV422] = {
146         .name = "yuyv422",
147         .nb_components = 3,
148         .log2_chroma_w = 1,
149         .log2_chroma_h = 0,
150         .comp = {
151             { 0, 1, 1, 0, 7 },        /* Y */
152             { 0, 3, 2, 0, 7 },        /* U */
153             { 0, 3, 4, 0, 7 },        /* V */
154         },
155     },
156     [AV_PIX_FMT_RGB24] = {
157         .name = "rgb24",
158         .nb_components = 3,
159         .log2_chroma_w = 0,
160         .log2_chroma_h = 0,
161         .comp = {
162             { 0, 2, 1, 0, 7 },        /* R */
163             { 0, 2, 2, 0, 7 },        /* G */
164             { 0, 2, 3, 0, 7 },        /* B */
165         },
166         .flags = AV_PIX_FMT_FLAG_RGB,
167     },
168     [AV_PIX_FMT_BGR24] = {
169         .name = "bgr24",
170         .nb_components = 3,
171         .log2_chroma_w = 0,
172         .log2_chroma_h = 0,
173         .comp = {
174             { 0, 2, 3, 0, 7 },        /* R */
175             { 0, 2, 2, 0, 7 },        /* G */
176             { 0, 2, 1, 0, 7 },        /* B */
177         },
178         .flags = AV_PIX_FMT_FLAG_RGB,
179     },
180     [AV_PIX_FMT_YUV422P] = {
181         .name = "yuv422p",
182         .nb_components = 3,
183         .log2_chroma_w = 1,
184         .log2_chroma_h = 0,
185         .comp = {
186             { 0, 0, 1, 0, 7 },        /* Y */
187             { 1, 0, 1, 0, 7 },        /* U */
188             { 2, 0, 1, 0, 7 },        /* V */
189         },
190         .flags = AV_PIX_FMT_FLAG_PLANAR,
191     },
192     [AV_PIX_FMT_YUV444P] = {
193         .name = "yuv444p",
194         .nb_components = 3,
195         .log2_chroma_w = 0,
196         .log2_chroma_h = 0,
197         .comp = {
198             { 0, 0, 1, 0, 7 },        /* Y */
199             { 1, 0, 1, 0, 7 },        /* U */
200             { 2, 0, 1, 0, 7 },        /* V */
201         },
202         .flags = AV_PIX_FMT_FLAG_PLANAR,
203     },
204     [AV_PIX_FMT_YUV410P] = {
205         .name = "yuv410p",
206         .nb_components = 3,
207         .log2_chroma_w = 2,
208         .log2_chroma_h = 2,
209         .comp = {
210             { 0, 0, 1, 0, 7 },        /* Y */
211             { 1, 0, 1, 0, 7 },        /* U */
212             { 2, 0, 1, 0, 7 },        /* V */
213         },
214         .flags = AV_PIX_FMT_FLAG_PLANAR,
215     },
216     [AV_PIX_FMT_YUV411P] = {
217         .name = "yuv411p",
218         .nb_components = 3,
219         .log2_chroma_w = 2,
220         .log2_chroma_h = 0,
221         .comp = {
222             { 0, 0, 1, 0, 7 },        /* Y */
223             { 1, 0, 1, 0, 7 },        /* U */
224             { 2, 0, 1, 0, 7 },        /* V */
225         },
226         .flags = AV_PIX_FMT_FLAG_PLANAR,
227     },
228     [AV_PIX_FMT_YUVJ411P] = {
229         .name = "yuvj411p",
230         .nb_components = 3,
231         .log2_chroma_w = 2,
232         .log2_chroma_h = 0,
233         .comp = {
234             { 0, 0, 1, 0, 7 },        /* Y */
235             { 1, 0, 1, 0, 7 },        /* U */
236             { 2, 0, 1, 0, 7 },        /* V */
237         },
238         .flags = AV_PIX_FMT_FLAG_PLANAR,
239     },
240     [AV_PIX_FMT_GRAY8] = {
241         .name = "gray",
242         .nb_components = 1,
243         .log2_chroma_w = 0,
244         .log2_chroma_h = 0,
245         .comp = {
246             { 0, 0, 1, 0, 7 },        /* Y */
247         },
248         .flags = AV_PIX_FMT_FLAG_PSEUDOPAL,
249     },
250     [AV_PIX_FMT_MONOWHITE] = {
251         .name = "monow",
252         .nb_components = 1,
253         .log2_chroma_w = 0,
254         .log2_chroma_h = 0,
255         .comp = {
256             { 0, 0, 1, 0, 0 },        /* Y */
257         },
258         .flags = AV_PIX_FMT_FLAG_BITSTREAM,
259     },
260     [AV_PIX_FMT_MONOBLACK] = {
261         .name = "monob",
262         .nb_components = 1,
263         .log2_chroma_w = 0,
264         .log2_chroma_h = 0,
265         .comp = {
266             { 0, 0, 1, 7, 0 },        /* Y */
267         },
268         .flags = AV_PIX_FMT_FLAG_BITSTREAM,
269     },
270     [AV_PIX_FMT_PAL8] = {
271         .name = "pal8",
272         .nb_components = 1,
273         .log2_chroma_w = 0,
274         .log2_chroma_h = 0,
275         .comp = {
276             { 0, 0, 1, 0, 7 },
277         },
278         .flags = AV_PIX_FMT_FLAG_PAL,
279     },
280     [AV_PIX_FMT_YUVJ420P] = {
281         .name = "yuvj420p",
282         .nb_components = 3,
283         .log2_chroma_w = 1,
284         .log2_chroma_h = 1,
285         .comp = {
286             { 0, 0, 1, 0, 7 },        /* Y */
287             { 1, 0, 1, 0, 7 },        /* U */
288             { 2, 0, 1, 0, 7 },        /* V */
289         },
290         .flags = AV_PIX_FMT_FLAG_PLANAR,
291     },
292     [AV_PIX_FMT_YUVJ422P] = {
293         .name = "yuvj422p",
294         .nb_components = 3,
295         .log2_chroma_w = 1,
296         .log2_chroma_h = 0,
297         .comp = {
298             { 0, 0, 1, 0, 7 },        /* Y */
299             { 1, 0, 1, 0, 7 },        /* U */
300             { 2, 0, 1, 0, 7 },        /* V */
301         },
302         .flags = AV_PIX_FMT_FLAG_PLANAR,
303     },
304     [AV_PIX_FMT_YUVJ444P] = {
305         .name = "yuvj444p",
306         .nb_components = 3,
307         .log2_chroma_w = 0,
308         .log2_chroma_h = 0,
309         .comp = {
310             { 0, 0, 1, 0, 7 },        /* Y */
311             { 1, 0, 1, 0, 7 },        /* U */
312             { 2, 0, 1, 0, 7 },        /* V */
313         },
314         .flags = AV_PIX_FMT_FLAG_PLANAR,
315     },
316     [AV_PIX_FMT_XVMC_MPEG2_MC] = {
317         .name = "xvmcmc",
318         .flags = AV_PIX_FMT_FLAG_HWACCEL,
319     },
320     [AV_PIX_FMT_XVMC_MPEG2_IDCT] = {
321         .name = "xvmcidct",
322         .flags = AV_PIX_FMT_FLAG_HWACCEL,
323     },
324     [AV_PIX_FMT_UYVY422] = {
325         .name = "uyvy422",
326         .nb_components = 3,
327         .log2_chroma_w = 1,
328         .log2_chroma_h = 0,
329         .comp = {
330             { 0, 1, 2, 0, 7 },        /* Y */
331             { 0, 3, 1, 0, 7 },        /* U */
332             { 0, 3, 3, 0, 7 },        /* V */
333         },
334     },
335     [AV_PIX_FMT_UYYVYY411] = {
336         .name = "uyyvyy411",
337         .nb_components = 3,
338         .log2_chroma_w = 2,
339         .log2_chroma_h = 0,
340         .comp = {
341             { 0, 3, 2, 0, 7 },        /* Y */
342             { 0, 5, 1, 0, 7 },        /* U */
343             { 0, 5, 4, 0, 7 },        /* V */
344         },
345     },
346     [AV_PIX_FMT_BGR8] = {
347         .name = "bgr8",
348         .nb_components = 3,
349         .log2_chroma_w = 0,
350         .log2_chroma_h = 0,
351         .comp = {
352             { 0, 0, 1, 0, 2 },        /* R */
353             { 0, 0, 1, 3, 2 },        /* G */
354             { 0, 0, 1, 6, 1 },        /* B */
355         },
356         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
357     },
358     [AV_PIX_FMT_BGR4] = {
359         .name = "bgr4",
360         .nb_components = 3,
361         .log2_chroma_w = 0,
362         .log2_chroma_h = 0,
363         .comp = {
364             { 0, 3, 4, 0, 0 },        /* R */
365             { 0, 3, 2, 0, 1 },        /* G */
366             { 0, 3, 1, 0, 0 },        /* B */
367         },
368         .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
369     },
370     [AV_PIX_FMT_BGR4_BYTE] = {
371         .name = "bgr4_byte",
372         .nb_components = 3,
373         .log2_chroma_w = 0,
374         .log2_chroma_h = 0,
375         .comp = {
376             { 0, 0, 1, 0, 0 },        /* R */
377             { 0, 0, 1, 1, 1 },        /* G */
378             { 0, 0, 1, 3, 0 },        /* B */
379         },
380         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
381     },
382     [AV_PIX_FMT_RGB8] = {
383         .name = "rgb8",
384         .nb_components = 3,
385         .log2_chroma_w = 0,
386         .log2_chroma_h = 0,
387         .comp = {
388             { 0, 0, 1, 6, 1 },        /* R */
389             { 0, 0, 1, 3, 2 },        /* G */
390             { 0, 0, 1, 0, 2 },        /* B */
391         },
392         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
393     },
394     [AV_PIX_FMT_RGB4] = {
395         .name = "rgb4",
396         .nb_components = 3,
397         .log2_chroma_w = 0,
398         .log2_chroma_h = 0,
399         .comp = {
400             { 0, 3, 1, 0, 0 },        /* R */
401             { 0, 3, 2, 0, 1 },        /* G */
402             { 0, 3, 4, 0, 0 },        /* B */
403         },
404         .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
405     },
406     [AV_PIX_FMT_RGB4_BYTE] = {
407         .name = "rgb4_byte",
408         .nb_components = 3,
409         .log2_chroma_w = 0,
410         .log2_chroma_h = 0,
411         .comp = {
412             { 0, 0, 1, 3, 0 },        /* R */
413             { 0, 0, 1, 1, 1 },        /* G */
414             { 0, 0, 1, 0, 0 },        /* B */
415         },
416         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
417     },
418     [AV_PIX_FMT_NV12] = {
419         .name = "nv12",
420         .nb_components = 3,
421         .log2_chroma_w = 1,
422         .log2_chroma_h = 1,
423         .comp = {
424             { 0, 0, 1, 0, 7 },        /* Y */
425             { 1, 1, 1, 0, 7 },        /* U */
426             { 1, 1, 2, 0, 7 },        /* V */
427         },
428         .flags = AV_PIX_FMT_FLAG_PLANAR,
429     },
430     [AV_PIX_FMT_NV21] = {
431         .name = "nv21",
432         .nb_components = 3,
433         .log2_chroma_w = 1,
434         .log2_chroma_h = 1,
435         .comp = {
436             { 0, 0, 1, 0, 7 },        /* Y */
437             { 1, 1, 2, 0, 7 },        /* U */
438             { 1, 1, 1, 0, 7 },        /* V */
439         },
440         .flags = AV_PIX_FMT_FLAG_PLANAR,
441     },
442     [AV_PIX_FMT_ARGB] = {
443         .name = "argb",
444         .nb_components = 4,
445         .log2_chroma_w = 0,
446         .log2_chroma_h = 0,
447         .comp = {
448             { 0, 3, 2, 0, 7 },        /* R */
449             { 0, 3, 3, 0, 7 },        /* G */
450             { 0, 3, 4, 0, 7 },        /* B */
451             { 0, 3, 1, 0, 7 },        /* A */
452         },
453         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
454     },
455     [AV_PIX_FMT_RGBA] = {
456         .name = "rgba",
457         .nb_components = 4,
458         .log2_chroma_w = 0,
459         .log2_chroma_h = 0,
460         .comp = {
461             { 0, 3, 1, 0, 7 },        /* R */
462             { 0, 3, 2, 0, 7 },        /* G */
463             { 0, 3, 3, 0, 7 },        /* B */
464             { 0, 3, 4, 0, 7 },        /* A */
465         },
466         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
467     },
468     [AV_PIX_FMT_ABGR] = {
469         .name = "abgr",
470         .nb_components = 4,
471         .log2_chroma_w = 0,
472         .log2_chroma_h = 0,
473         .comp = {
474             { 0, 3, 4, 0, 7 },        /* R */
475             { 0, 3, 3, 0, 7 },        /* G */
476             { 0, 3, 2, 0, 7 },        /* B */
477             { 0, 3, 1, 0, 7 },        /* A */
478         },
479         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
480     },
481     [AV_PIX_FMT_BGRA] = {
482         .name = "bgra",
483         .nb_components = 4,
484         .log2_chroma_w = 0,
485         .log2_chroma_h = 0,
486         .comp = {
487             { 0, 3, 3, 0, 7 },        /* R */
488             { 0, 3, 2, 0, 7 },        /* G */
489             { 0, 3, 1, 0, 7 },        /* B */
490             { 0, 3, 4, 0, 7 },        /* A */
491         },
492         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
493     },
494     [AV_PIX_FMT_0RGB] = {
495         .name = "0rgb",
496         .nb_components= 3,
497         .log2_chroma_w= 0,
498         .log2_chroma_h= 0,
499         .comp = {
500             { 0, 3, 2, 0, 7 },        /* R */
501             { 0, 3, 3, 0, 7 },        /* G */
502             { 0, 3, 4, 0, 7 },        /* B */
503         },
504         .flags = AV_PIX_FMT_FLAG_RGB,
505     },
506     [AV_PIX_FMT_RGB0] = {
507         .name = "rgb0",
508         .nb_components= 3,
509         .log2_chroma_w= 0,
510         .log2_chroma_h= 0,
511         .comp = {
512             { 0, 3, 1, 0, 7 },        /* R */
513             { 0, 3, 2, 0, 7 },        /* G */
514             { 0, 3, 3, 0, 7 },        /* B */
515         },
516         .flags = AV_PIX_FMT_FLAG_RGB,
517     },
518     [AV_PIX_FMT_0BGR] = {
519         .name = "0bgr",
520         .nb_components= 3,
521         .log2_chroma_w= 0,
522         .log2_chroma_h= 0,
523         .comp = {
524             { 0, 3, 4, 0, 7 },        /* R */
525             { 0, 3, 3, 0, 7 },        /* G */
526             { 0, 3, 2, 0, 7 },        /* B */
527         },
528         .flags = AV_PIX_FMT_FLAG_RGB,
529     },
530     [AV_PIX_FMT_BGR0] = {
531         .name = "bgr0",
532         .nb_components= 3,
533         .log2_chroma_w= 0,
534         .log2_chroma_h= 0,
535         .comp = {
536             { 0, 3, 3, 0, 7 },        /* R */
537             { 0, 3, 2, 0, 7 },        /* G */
538             { 0, 3, 1, 0, 7 },        /* B */
539         },
540         .flags = AV_PIX_FMT_FLAG_RGB,
541     },
542     [AV_PIX_FMT_GRAY16BE] = {
543         .name = "gray16be",
544         .nb_components = 1,
545         .log2_chroma_w = 0,
546         .log2_chroma_h = 0,
547         .comp = {
548             { 0, 1, 1, 0, 15 },       /* Y */
549         },
550         .flags = AV_PIX_FMT_FLAG_BE,
551     },
552     [AV_PIX_FMT_GRAY16LE] = {
553         .name = "gray16le",
554         .nb_components = 1,
555         .log2_chroma_w = 0,
556         .log2_chroma_h = 0,
557         .comp = {
558             { 0, 1, 1, 0, 15 },       /* Y */
559         },
560     },
561     [AV_PIX_FMT_YUV440P] = {
562         .name = "yuv440p",
563         .nb_components = 3,
564         .log2_chroma_w = 0,
565         .log2_chroma_h = 1,
566         .comp = {
567             { 0, 0, 1, 0, 7 },        /* Y */
568             { 1, 0, 1, 0, 7 },        /* U */
569             { 2, 0, 1, 0, 7 },        /* V */
570         },
571         .flags = AV_PIX_FMT_FLAG_PLANAR,
572     },
573     [AV_PIX_FMT_YUVJ440P] = {
574         .name = "yuvj440p",
575         .nb_components = 3,
576         .log2_chroma_w = 0,
577         .log2_chroma_h = 1,
578         .comp = {
579             { 0, 0, 1, 0, 7 },        /* Y */
580             { 1, 0, 1, 0, 7 },        /* U */
581             { 2, 0, 1, 0, 7 },        /* V */
582         },
583         .flags = AV_PIX_FMT_FLAG_PLANAR,
584     },
585     [AV_PIX_FMT_YUVA420P] = {
586         .name = "yuva420p",
587         .nb_components = 4,
588         .log2_chroma_w = 1,
589         .log2_chroma_h = 1,
590         .comp = {
591             { 0, 0, 1, 0, 7 },        /* Y */
592             { 1, 0, 1, 0, 7 },        /* U */
593             { 2, 0, 1, 0, 7 },        /* V */
594             { 3, 0, 1, 0, 7 },        /* A */
595         },
596         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
597     },
598     [AV_PIX_FMT_YUVA422P] = {
599         .name = "yuva422p",
600         .nb_components = 4,
601         .log2_chroma_w = 1,
602         .log2_chroma_h = 0,
603         .comp = {
604             { 0, 0, 1, 0, 7 },        /* Y */
605             { 1, 0, 1, 0, 7 },        /* U */
606             { 2, 0, 1, 0, 7 },        /* V */
607             { 3, 0, 1, 0, 7 },        /* A */
608         },
609         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
610     },
611     [AV_PIX_FMT_YUVA444P] = {
612         .name = "yuva444p",
613         .nb_components = 4,
614         .log2_chroma_w = 0,
615         .log2_chroma_h = 0,
616         .comp = {
617             { 0, 0, 1, 0, 7 },        /* Y */
618             { 1, 0, 1, 0, 7 },        /* U */
619             { 2, 0, 1, 0, 7 },        /* V */
620             { 3, 0, 1, 0, 7 },        /* A */
621         },
622         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
623     },
624     [AV_PIX_FMT_YUVA420P9BE] = {
625         .name = "yuva420p9be",
626         .nb_components = 4,
627         .log2_chroma_w = 1,
628         .log2_chroma_h = 1,
629         .comp = {
630             { 0, 1, 1, 0, 8 },        /* Y */
631             { 1, 1, 1, 0, 8 },        /* U */
632             { 2, 1, 1, 0, 8 },        /* V */
633             { 3, 1, 1, 0, 8 },        /* A */
634         },
635         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
636     },
637     [AV_PIX_FMT_YUVA420P9LE] = {
638         .name = "yuva420p9le",
639         .nb_components = 4,
640         .log2_chroma_w = 1,
641         .log2_chroma_h = 1,
642         .comp = {
643             { 0, 1, 1, 0, 8 },        /* Y */
644             { 1, 1, 1, 0, 8 },        /* U */
645             { 2, 1, 1, 0, 8 },        /* V */
646             { 3, 1, 1, 0, 8 },        /* A */
647         },
648         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
649     },
650     [AV_PIX_FMT_YUVA422P9BE] = {
651         .name = "yuva422p9be",
652         .nb_components = 4,
653         .log2_chroma_w = 1,
654         .log2_chroma_h = 0,
655         .comp = {
656             { 0, 1, 1, 0, 8 },        /* Y */
657             { 1, 1, 1, 0, 8 },        /* U */
658             { 2, 1, 1, 0, 8 },        /* V */
659             { 3, 1, 1, 0, 8 },        /* A */
660         },
661         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
662     },
663     [AV_PIX_FMT_YUVA422P9LE] = {
664         .name = "yuva422p9le",
665         .nb_components = 4,
666         .log2_chroma_w = 1,
667         .log2_chroma_h = 0,
668         .comp = {
669             { 0, 1, 1, 0, 8 },        /* Y */
670             { 1, 1, 1, 0, 8 },        /* U */
671             { 2, 1, 1, 0, 8 },        /* V */
672             { 3, 1, 1, 0, 8 },        /* A */
673         },
674         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
675     },
676     [AV_PIX_FMT_YUVA444P9BE] = {
677         .name = "yuva444p9be",
678         .nb_components = 4,
679         .log2_chroma_w = 0,
680         .log2_chroma_h = 0,
681         .comp = {
682             { 0, 1, 1, 0, 8 },        /* Y */
683             { 1, 1, 1, 0, 8 },        /* U */
684             { 2, 1, 1, 0, 8 },        /* V */
685             { 3, 1, 1, 0, 8 },        /* A */
686         },
687         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
688     },
689     [AV_PIX_FMT_YUVA444P9LE] = {
690         .name = "yuva444p9le",
691         .nb_components = 4,
692         .log2_chroma_w = 0,
693         .log2_chroma_h = 0,
694         .comp = {
695             { 0, 1, 1, 0, 8 },        /* Y */
696             { 1, 1, 1, 0, 8 },        /* U */
697             { 2, 1, 1, 0, 8 },        /* V */
698             { 3, 1, 1, 0, 8 },        /* A */
699         },
700         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
701     },
702     [AV_PIX_FMT_YUVA420P10BE] = {
703         .name = "yuva420p10be",
704         .nb_components = 4,
705         .log2_chroma_w = 1,
706         .log2_chroma_h = 1,
707         .comp = {
708             { 0, 1, 1, 0, 9 },        /* Y */
709             { 1, 1, 1, 0, 9 },        /* U */
710             { 2, 1, 1, 0, 9 },        /* V */
711             { 3, 1, 1, 0, 9 },        /* A */
712         },
713         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
714     },
715     [AV_PIX_FMT_YUVA420P10LE] = {
716         .name = "yuva420p10le",
717         .nb_components = 4,
718         .log2_chroma_w = 1,
719         .log2_chroma_h = 1,
720         .comp = {
721             { 0, 1, 1, 0, 9 },        /* Y */
722             { 1, 1, 1, 0, 9 },        /* U */
723             { 2, 1, 1, 0, 9 },        /* V */
724             { 3, 1, 1, 0, 9 },        /* A */
725         },
726         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
727     },
728     [AV_PIX_FMT_YUVA422P10BE] = {
729         .name = "yuva422p10be",
730         .nb_components = 4,
731         .log2_chroma_w = 1,
732         .log2_chroma_h = 0,
733         .comp = {
734             { 0, 1, 1, 0, 9 },        /* Y */
735             { 1, 1, 1, 0, 9 },        /* U */
736             { 2, 1, 1, 0, 9 },        /* V */
737             { 3, 1, 1, 0, 9 },        /* A */
738         },
739         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
740     },
741     [AV_PIX_FMT_YUVA422P10LE] = {
742         .name = "yuva422p10le",
743         .nb_components = 4,
744         .log2_chroma_w = 1,
745         .log2_chroma_h = 0,
746         .comp = {
747             { 0, 1, 1, 0, 9 },        /* Y */
748             { 1, 1, 1, 0, 9 },        /* U */
749             { 2, 1, 1, 0, 9 },        /* V */
750             { 3, 1, 1, 0, 9 },        /* A */
751         },
752         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
753     },
754     [AV_PIX_FMT_YUVA444P10BE] = {
755         .name = "yuva444p10be",
756         .nb_components = 4,
757         .log2_chroma_w = 0,
758         .log2_chroma_h = 0,
759         .comp = {
760             { 0, 1, 1, 0, 9 },        /* Y */
761             { 1, 1, 1, 0, 9 },        /* U */
762             { 2, 1, 1, 0, 9 },        /* V */
763             { 3, 1, 1, 0, 9 },        /* A */
764         },
765         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
766     },
767     [AV_PIX_FMT_YUVA444P10LE] = {
768         .name = "yuva444p10le",
769         .nb_components = 4,
770         .log2_chroma_w = 0,
771         .log2_chroma_h = 0,
772         .comp = {
773             { 0, 1, 1, 0, 9 },        /* Y */
774             { 1, 1, 1, 0, 9 },        /* U */
775             { 2, 1, 1, 0, 9 },        /* V */
776             { 3, 1, 1, 0, 9 },        /* A */
777         },
778         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
779     },
780     [AV_PIX_FMT_YUVA420P16BE] = {
781         .name = "yuva420p16be",
782         .nb_components = 4,
783         .log2_chroma_w = 1,
784         .log2_chroma_h = 1,
785         .comp = {
786             { 0, 1, 1, 0, 15 },        /* Y */
787             { 1, 1, 1, 0, 15 },        /* U */
788             { 2, 1, 1, 0, 15 },        /* V */
789             { 3, 1, 1, 0, 15 },        /* A */
790         },
791         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
792     },
793     [AV_PIX_FMT_YUVA420P16LE] = {
794         .name = "yuva420p16le",
795         .nb_components = 4,
796         .log2_chroma_w = 1,
797         .log2_chroma_h = 1,
798         .comp = {
799             { 0, 1, 1, 0, 15 },        /* Y */
800             { 1, 1, 1, 0, 15 },        /* U */
801             { 2, 1, 1, 0, 15 },        /* V */
802             { 3, 1, 1, 0, 15 },        /* A */
803         },
804         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
805     },
806     [AV_PIX_FMT_YUVA422P16BE] = {
807         .name = "yuva422p16be",
808         .nb_components = 4,
809         .log2_chroma_w = 1,
810         .log2_chroma_h = 0,
811         .comp = {
812             { 0, 1, 1, 0, 15 },        /* Y */
813             { 1, 1, 1, 0, 15 },        /* U */
814             { 2, 1, 1, 0, 15 },        /* V */
815             { 3, 1, 1, 0, 15 },        /* A */
816         },
817         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
818     },
819     [AV_PIX_FMT_YUVA422P16LE] = {
820         .name = "yuva422p16le",
821         .nb_components = 4,
822         .log2_chroma_w = 1,
823         .log2_chroma_h = 0,
824         .comp = {
825             { 0, 1, 1, 0, 15 },        /* Y */
826             { 1, 1, 1, 0, 15 },        /* U */
827             { 2, 1, 1, 0, 15 },        /* V */
828             { 3, 1, 1, 0, 15 },        /* A */
829         },
830         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
831     },
832     [AV_PIX_FMT_YUVA444P16BE] = {
833         .name = "yuva444p16be",
834         .nb_components = 4,
835         .log2_chroma_w = 0,
836         .log2_chroma_h = 0,
837         .comp = {
838             { 0, 1, 1, 0, 15 },        /* Y */
839             { 1, 1, 1, 0, 15 },        /* U */
840             { 2, 1, 1, 0, 15 },        /* V */
841             { 3, 1, 1, 0, 15 },        /* A */
842         },
843         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
844     },
845     [AV_PIX_FMT_YUVA444P16LE] = {
846         .name = "yuva444p16le",
847         .nb_components = 4,
848         .log2_chroma_w = 0,
849         .log2_chroma_h = 0,
850         .comp = {
851             { 0, 1, 1, 0, 15 },        /* Y */
852             { 1, 1, 1, 0, 15 },        /* U */
853             { 2, 1, 1, 0, 15 },        /* V */
854             { 3, 1, 1, 0, 15 },        /* A */
855         },
856         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
857     },
858     [AV_PIX_FMT_VDPAU_H264] = {
859         .name = "vdpau_h264",
860         .log2_chroma_w = 1,
861         .log2_chroma_h = 1,
862         .flags = AV_PIX_FMT_FLAG_HWACCEL,
863     },
864     [AV_PIX_FMT_VDPAU_MPEG1] = {
865         .name = "vdpau_mpeg1",
866         .log2_chroma_w = 1,
867         .log2_chroma_h = 1,
868         .flags = AV_PIX_FMT_FLAG_HWACCEL,
869     },
870     [AV_PIX_FMT_VDPAU_MPEG2] = {
871         .name = "vdpau_mpeg2",
872         .log2_chroma_w = 1,
873         .log2_chroma_h = 1,
874         .flags = AV_PIX_FMT_FLAG_HWACCEL,
875     },
876     [AV_PIX_FMT_VDPAU_WMV3] = {
877         .name = "vdpau_wmv3",
878         .log2_chroma_w = 1,
879         .log2_chroma_h = 1,
880         .flags = AV_PIX_FMT_FLAG_HWACCEL,
881     },
882     [AV_PIX_FMT_VDPAU_VC1] = {
883         .name = "vdpau_vc1",
884         .log2_chroma_w = 1,
885         .log2_chroma_h = 1,
886         .flags = AV_PIX_FMT_FLAG_HWACCEL,
887     },
888     [AV_PIX_FMT_VDPAU_MPEG4] = {
889         .name = "vdpau_mpeg4",
890         .log2_chroma_w = 1,
891         .log2_chroma_h = 1,
892         .flags = AV_PIX_FMT_FLAG_HWACCEL,
893     },
894     [AV_PIX_FMT_RGB48BE] = {
895         .name = "rgb48be",
896         .nb_components = 3,
897         .log2_chroma_w = 0,
898         .log2_chroma_h = 0,
899         .comp = {
900             { 0, 5, 1, 0, 15 },       /* R */
901             { 0, 5, 3, 0, 15 },       /* G */
902             { 0, 5, 5, 0, 15 },       /* B */
903         },
904         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
905     },
906     [AV_PIX_FMT_RGB48LE] = {
907         .name = "rgb48le",
908         .nb_components = 3,
909         .log2_chroma_w = 0,
910         .log2_chroma_h = 0,
911         .comp = {
912             { 0, 5, 1, 0, 15 },       /* R */
913             { 0, 5, 3, 0, 15 },       /* G */
914             { 0, 5, 5, 0, 15 },       /* B */
915         },
916         .flags = AV_PIX_FMT_FLAG_RGB,
917     },
918     [AV_PIX_FMT_RGBA64BE] = {
919         .name = "rgba64be",
920         .nb_components= 4,
921         .log2_chroma_w= 0,
922         .log2_chroma_h= 0,
923         .comp = {
924             { 0, 7, 1, 0, 15 },       /* R */
925             { 0, 7, 3, 0, 15 },       /* G */
926             { 0, 7, 5, 0, 15 },       /* B */
927             { 0, 7, 7, 0, 15 },       /* A */
928         },
929         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_ALPHA,
930     },
931     [AV_PIX_FMT_RGBA64LE] = {
932         .name = "rgba64le",
933         .nb_components= 4,
934         .log2_chroma_w= 0,
935         .log2_chroma_h= 0,
936         .comp = {
937             { 0, 7, 1, 0, 15 },       /* R */
938             { 0, 7, 3, 0, 15 },       /* G */
939             { 0, 7, 5, 0, 15 },       /* B */
940             { 0, 7, 7, 0, 15 },       /* A */
941         },
942         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
943     },
944     [AV_PIX_FMT_RGB565BE] = {
945         .name = "rgb565be",
946         .nb_components = 3,
947         .log2_chroma_w = 0,
948         .log2_chroma_h = 0,
949         .comp = {
950             { 0, 1, 0, 3, 4 },        /* R */
951             { 0, 1, 1, 5, 5 },        /* G */
952             { 0, 1, 1, 0, 4 },        /* B */
953         },
954         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
955     },
956     [AV_PIX_FMT_RGB565LE] = {
957         .name = "rgb565le",
958         .nb_components = 3,
959         .log2_chroma_w = 0,
960         .log2_chroma_h = 0,
961         .comp = {
962             { 0, 1, 2, 3, 4 },        /* R */
963             { 0, 1, 1, 5, 5 },        /* G */
964             { 0, 1, 1, 0, 4 },        /* B */
965         },
966         .flags = AV_PIX_FMT_FLAG_RGB,
967     },
968     [AV_PIX_FMT_RGB555BE] = {
969         .name = "rgb555be",
970         .nb_components = 3,
971         .log2_chroma_w = 0,
972         .log2_chroma_h = 0,
973         .comp = {
974             { 0, 1, 0, 2, 4 },        /* R */
975             { 0, 1, 1, 5, 4 },        /* G */
976             { 0, 1, 1, 0, 4 },        /* B */
977         },
978         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
979     },
980     [AV_PIX_FMT_RGB555LE] = {
981         .name = "rgb555le",
982         .nb_components = 3,
983         .log2_chroma_w = 0,
984         .log2_chroma_h = 0,
985         .comp = {
986             { 0, 1, 2, 2, 4 },        /* R */
987             { 0, 1, 1, 5, 4 },        /* G */
988             { 0, 1, 1, 0, 4 },        /* B */
989         },
990         .flags = AV_PIX_FMT_FLAG_RGB,
991     },
992     [AV_PIX_FMT_RGB444BE] = {
993         .name = "rgb444be",
994         .nb_components = 3,
995         .log2_chroma_w = 0,
996         .log2_chroma_h = 0,
997         .comp = {
998             { 0, 1, 0, 0, 3 },        /* R */
999             { 0, 1, 1, 4, 3 },        /* G */
1000             { 0, 1, 1, 0, 3 },        /* B */
1001         },
1002         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1003     },
1004     [AV_PIX_FMT_RGB444LE] = {
1005         .name = "rgb444le",
1006         .nb_components = 3,
1007         .log2_chroma_w = 0,
1008         .log2_chroma_h = 0,
1009         .comp = {
1010             { 0, 1, 2, 0, 3 },        /* R */
1011             { 0, 1, 1, 4, 3 },        /* G */
1012             { 0, 1, 1, 0, 3 },        /* B */
1013         },
1014         .flags = AV_PIX_FMT_FLAG_RGB,
1015     },
1016     [AV_PIX_FMT_BGR48BE] = {
1017         .name = "bgr48be",
1018         .nb_components = 3,
1019         .log2_chroma_w = 0,
1020         .log2_chroma_h = 0,
1021         .comp = {
1022             { 0, 5, 5, 0, 15 },       /* R */
1023             { 0, 5, 3, 0, 15 },       /* G */
1024             { 0, 5, 1, 0, 15 },       /* B */
1025         },
1026         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1027     },
1028     [AV_PIX_FMT_BGR48LE] = {
1029         .name = "bgr48le",
1030         .nb_components = 3,
1031         .log2_chroma_w = 0,
1032         .log2_chroma_h = 0,
1033         .comp = {
1034             { 0, 5, 5, 0, 15 },       /* R */
1035             { 0, 5, 3, 0, 15 },       /* G */
1036             { 0, 5, 1, 0, 15 },       /* B */
1037         },
1038         .flags = AV_PIX_FMT_FLAG_RGB,
1039     },
1040     [AV_PIX_FMT_BGRA64BE] = {
1041         .name = "bgra64be",
1042         .nb_components= 4,
1043         .log2_chroma_w= 0,
1044         .log2_chroma_h= 0,
1045         .comp = {
1046             { 0, 7, 5, 0, 15 },       /* R */
1047             { 0, 7, 3, 0, 15 },       /* G */
1048             { 0, 7, 1, 0, 15 },       /* B */
1049             { 0, 7, 7, 0, 15 },       /* A */
1050         },
1051         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1052     },
1053     [AV_PIX_FMT_BGRA64LE] = {
1054         .name = "bgra64le",
1055         .nb_components= 4,
1056         .log2_chroma_w= 0,
1057         .log2_chroma_h= 0,
1058         .comp = {
1059             { 0, 7, 5, 0, 15 },       /* R */
1060             { 0, 7, 3, 0, 15 },       /* G */
1061             { 0, 7, 1, 0, 15 },       /* B */
1062             { 0, 7, 7, 0, 15 },       /* A */
1063         },
1064         .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1065     },
1066     [AV_PIX_FMT_BGR565BE] = {
1067         .name = "bgr565be",
1068         .nb_components = 3,
1069         .log2_chroma_w = 0,
1070         .log2_chroma_h = 0,
1071         .comp = {
1072             { 0, 1, 1, 0, 4 },        /* R */
1073             { 0, 1, 1, 5, 5 },        /* G */
1074             { 0, 1, 0, 3, 4 },        /* B */
1075         },
1076         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1077     },
1078     [AV_PIX_FMT_BGR565LE] = {
1079         .name = "bgr565le",
1080         .nb_components = 3,
1081         .log2_chroma_w = 0,
1082         .log2_chroma_h = 0,
1083         .comp = {
1084             { 0, 1, 1, 0, 4 },        /* R */
1085             { 0, 1, 1, 5, 5 },        /* G */
1086             { 0, 1, 2, 3, 4 },        /* B */
1087         },
1088         .flags = AV_PIX_FMT_FLAG_RGB,
1089     },
1090     [AV_PIX_FMT_BGR555BE] = {
1091         .name = "bgr555be",
1092         .nb_components = 3,
1093         .log2_chroma_w = 0,
1094         .log2_chroma_h = 0,
1095         .comp = {
1096             { 0, 1, 1, 0, 4 },       /* R */
1097             { 0, 1, 1, 5, 4 },       /* G */
1098             { 0, 1, 0, 2, 4 },       /* B */
1099         },
1100         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1101      },
1102     [AV_PIX_FMT_BGR555LE] = {
1103         .name = "bgr555le",
1104         .nb_components = 3,
1105         .log2_chroma_w = 0,
1106         .log2_chroma_h = 0,
1107         .comp = {
1108             { 0, 1, 1, 0, 4 },        /* R */
1109             { 0, 1, 1, 5, 4 },        /* G */
1110             { 0, 1, 2, 2, 4 },        /* B */
1111         },
1112         .flags = AV_PIX_FMT_FLAG_RGB,
1113     },
1114     [AV_PIX_FMT_BGR444BE] = {
1115         .name = "bgr444be",
1116         .nb_components = 3,
1117         .log2_chroma_w = 0,
1118         .log2_chroma_h = 0,
1119         .comp = {
1120             { 0, 1, 1, 0, 3 },       /* R */
1121             { 0, 1, 1, 4, 3 },       /* G */
1122             { 0, 1, 0, 0, 3 },       /* B */
1123         },
1124         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1125      },
1126     [AV_PIX_FMT_BGR444LE] = {
1127         .name = "bgr444le",
1128         .nb_components = 3,
1129         .log2_chroma_w = 0,
1130         .log2_chroma_h = 0,
1131         .comp = {
1132             { 0, 1, 1, 0, 3 },        /* R */
1133             { 0, 1, 1, 4, 3 },        /* G */
1134             { 0, 1, 2, 0, 3 },        /* B */
1135         },
1136         .flags = AV_PIX_FMT_FLAG_RGB,
1137     },
1138     [AV_PIX_FMT_VAAPI_MOCO] = {
1139         .name = "vaapi_moco",
1140         .log2_chroma_w = 1,
1141         .log2_chroma_h = 1,
1142         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1143     },
1144     [AV_PIX_FMT_VAAPI_IDCT] = {
1145         .name = "vaapi_idct",
1146         .log2_chroma_w = 1,
1147         .log2_chroma_h = 1,
1148         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1149     },
1150     [AV_PIX_FMT_VAAPI_VLD] = {
1151         .name = "vaapi_vld",
1152         .log2_chroma_w = 1,
1153         .log2_chroma_h = 1,
1154         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1155     },
1156     [AV_PIX_FMT_YUV420P9LE] = {
1157         .name = "yuv420p9le",
1158         .nb_components = 3,
1159         .log2_chroma_w = 1,
1160         .log2_chroma_h = 1,
1161         .comp = {
1162             { 0, 1, 1, 0, 8 },        /* Y */
1163             { 1, 1, 1, 0, 8 },        /* U */
1164             { 2, 1, 1, 0, 8 },        /* V */
1165         },
1166         .flags = AV_PIX_FMT_FLAG_PLANAR,
1167     },
1168     [AV_PIX_FMT_YUV420P9BE] = {
1169         .name = "yuv420p9be",
1170         .nb_components = 3,
1171         .log2_chroma_w = 1,
1172         .log2_chroma_h = 1,
1173         .comp = {
1174             { 0, 1, 1, 0, 8 },        /* Y */
1175             { 1, 1, 1, 0, 8 },        /* U */
1176             { 2, 1, 1, 0, 8 },        /* V */
1177         },
1178         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1179     },
1180     [AV_PIX_FMT_YUV420P10LE] = {
1181         .name = "yuv420p10le",
1182         .nb_components = 3,
1183         .log2_chroma_w = 1,
1184         .log2_chroma_h = 1,
1185         .comp = {
1186             { 0, 1, 1, 0, 9 },        /* Y */
1187             { 1, 1, 1, 0, 9 },        /* U */
1188             { 2, 1, 1, 0, 9 },        /* V */
1189         },
1190         .flags = AV_PIX_FMT_FLAG_PLANAR,
1191     },
1192     [AV_PIX_FMT_YUV420P10BE] = {
1193         .name = "yuv420p10be",
1194         .nb_components = 3,
1195         .log2_chroma_w = 1,
1196         .log2_chroma_h = 1,
1197         .comp = {
1198             { 0, 1, 1, 0, 9 },        /* Y */
1199             { 1, 1, 1, 0, 9 },        /* U */
1200             { 2, 1, 1, 0, 9 },        /* V */
1201         },
1202         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1203     },
1204     [AV_PIX_FMT_YUV420P12LE] = {
1205         .name = "yuv420p12le",
1206         .nb_components = 3,
1207         .log2_chroma_w = 1,
1208         .log2_chroma_h = 1,
1209         .comp = {
1210             { 0, 1, 1, 0, 11 },        /* Y */
1211             { 1, 1, 1, 0, 11 },        /* U */
1212             { 2, 1, 1, 0, 11 },        /* V */
1213         },
1214         .flags = AV_PIX_FMT_FLAG_PLANAR,
1215     },
1216     [AV_PIX_FMT_YUV420P12BE] = {
1217         .name = "yuv420p12be",
1218         .nb_components = 3,
1219         .log2_chroma_w = 1,
1220         .log2_chroma_h = 1,
1221         .comp = {
1222             { 0, 1, 1, 0, 11 },        /* Y */
1223             { 1, 1, 1, 0, 11 },        /* U */
1224             { 2, 1, 1, 0, 11 },        /* V */
1225         },
1226         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1227     },
1228     [AV_PIX_FMT_YUV420P14LE] = {
1229         .name = "yuv420p14le",
1230         .nb_components = 3,
1231         .log2_chroma_w = 1,
1232         .log2_chroma_h = 1,
1233         .comp = {
1234             { 0, 1, 1, 0, 13 },        /* Y */
1235             { 1, 1, 1, 0, 13 },        /* U */
1236             { 2, 1, 1, 0, 13 },        /* V */
1237         },
1238         .flags = AV_PIX_FMT_FLAG_PLANAR,
1239     },
1240     [AV_PIX_FMT_YUV420P14BE] = {
1241         .name = "yuv420p14be",
1242         .nb_components = 3,
1243         .log2_chroma_w = 1,
1244         .log2_chroma_h = 1,
1245         .comp = {
1246             { 0, 1, 1, 0, 13 },        /* Y */
1247             { 1, 1, 1, 0, 13 },        /* U */
1248             { 2, 1, 1, 0, 13 },        /* V */
1249         },
1250         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1251     },
1252     [AV_PIX_FMT_YUV420P16LE] = {
1253         .name = "yuv420p16le",
1254         .nb_components = 3,
1255         .log2_chroma_w = 1,
1256         .log2_chroma_h = 1,
1257         .comp = {
1258             { 0, 1, 1, 0, 15 },        /* Y */
1259             { 1, 1, 1, 0, 15 },        /* U */
1260             { 2, 1, 1, 0, 15 },        /* V */
1261         },
1262         .flags = AV_PIX_FMT_FLAG_PLANAR,
1263     },
1264     [AV_PIX_FMT_YUV420P16BE] = {
1265         .name = "yuv420p16be",
1266         .nb_components = 3,
1267         .log2_chroma_w = 1,
1268         .log2_chroma_h = 1,
1269         .comp = {
1270             { 0, 1, 1, 0, 15 },        /* Y */
1271             { 1, 1, 1, 0, 15 },        /* U */
1272             { 2, 1, 1, 0, 15 },        /* V */
1273         },
1274         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1275     },
1276     [AV_PIX_FMT_YUV422P9LE] = {
1277         .name = "yuv422p9le",
1278         .nb_components = 3,
1279         .log2_chroma_w = 1,
1280         .log2_chroma_h = 0,
1281         .comp = {
1282             { 0, 1, 1, 0, 8 },        /* Y */
1283             { 1, 1, 1, 0, 8 },        /* U */
1284             { 2, 1, 1, 0, 8 },        /* V */
1285         },
1286         .flags = AV_PIX_FMT_FLAG_PLANAR,
1287     },
1288     [AV_PIX_FMT_YUV422P9BE] = {
1289         .name = "yuv422p9be",
1290         .nb_components = 3,
1291         .log2_chroma_w = 1,
1292         .log2_chroma_h = 0,
1293         .comp = {
1294             { 0, 1, 1, 0, 8 },        /* Y */
1295             { 1, 1, 1, 0, 8 },        /* U */
1296             { 2, 1, 1, 0, 8 },        /* V */
1297         },
1298         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1299     },
1300     [AV_PIX_FMT_YUV422P10LE] = {
1301         .name = "yuv422p10le",
1302         .nb_components = 3,
1303         .log2_chroma_w = 1,
1304         .log2_chroma_h = 0,
1305         .comp = {
1306             { 0, 1, 1, 0, 9 },        /* Y */
1307             { 1, 1, 1, 0, 9 },        /* U */
1308             { 2, 1, 1, 0, 9 },        /* V */
1309         },
1310         .flags = AV_PIX_FMT_FLAG_PLANAR,
1311     },
1312     [AV_PIX_FMT_YUV422P10BE] = {
1313         .name = "yuv422p10be",
1314         .nb_components = 3,
1315         .log2_chroma_w = 1,
1316         .log2_chroma_h = 0,
1317         .comp = {
1318             { 0, 1, 1, 0, 9 },        /* Y */
1319             { 1, 1, 1, 0, 9 },        /* U */
1320             { 2, 1, 1, 0, 9 },        /* V */
1321         },
1322         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1323     },
1324     [AV_PIX_FMT_YUV422P12LE] = {
1325         .name = "yuv422p12le",
1326         .nb_components = 3,
1327         .log2_chroma_w = 1,
1328         .log2_chroma_h = 0,
1329         .comp = {
1330             { 0, 1, 1, 0, 11 },        /* Y */
1331             { 1, 1, 1, 0, 11 },        /* U */
1332             { 2, 1, 1, 0, 11 },        /* V */
1333         },
1334         .flags = AV_PIX_FMT_FLAG_PLANAR,
1335     },
1336     [AV_PIX_FMT_YUV422P12BE] = {
1337         .name = "yuv422p12be",
1338         .nb_components = 3,
1339         .log2_chroma_w = 1,
1340         .log2_chroma_h = 0,
1341         .comp = {
1342             { 0, 1, 1, 0, 11 },        /* Y */
1343             { 1, 1, 1, 0, 11 },        /* U */
1344             { 2, 1, 1, 0, 11 },        /* V */
1345         },
1346         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1347     },
1348     [AV_PIX_FMT_YUV422P14LE] = {
1349         .name = "yuv422p14le",
1350         .nb_components = 3,
1351         .log2_chroma_w = 1,
1352         .log2_chroma_h = 0,
1353         .comp = {
1354             { 0, 1, 1, 0, 13 },        /* Y */
1355             { 1, 1, 1, 0, 13 },        /* U */
1356             { 2, 1, 1, 0, 13 },        /* V */
1357         },
1358         .flags = AV_PIX_FMT_FLAG_PLANAR,
1359     },
1360     [AV_PIX_FMT_YUV422P14BE] = {
1361         .name = "yuv422p14be",
1362         .nb_components = 3,
1363         .log2_chroma_w = 1,
1364         .log2_chroma_h = 0,
1365         .comp = {
1366             { 0, 1, 1, 0, 13 },        /* Y */
1367             { 1, 1, 1, 0, 13 },        /* U */
1368             { 2, 1, 1, 0, 13 },        /* V */
1369         },
1370         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1371     },
1372     [AV_PIX_FMT_YUV422P16LE] = {
1373         .name = "yuv422p16le",
1374         .nb_components = 3,
1375         .log2_chroma_w = 1,
1376         .log2_chroma_h = 0,
1377         .comp = {
1378             { 0, 1, 1, 0, 15 },        /* Y */
1379             { 1, 1, 1, 0, 15 },        /* U */
1380             { 2, 1, 1, 0, 15 },        /* V */
1381         },
1382         .flags = AV_PIX_FMT_FLAG_PLANAR,
1383     },
1384     [AV_PIX_FMT_YUV422P16BE] = {
1385         .name = "yuv422p16be",
1386         .nb_components = 3,
1387         .log2_chroma_w = 1,
1388         .log2_chroma_h = 0,
1389         .comp = {
1390             { 0, 1, 1, 0, 15 },        /* Y */
1391             { 1, 1, 1, 0, 15 },        /* U */
1392             { 2, 1, 1, 0, 15 },        /* V */
1393         },
1394         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1395     },
1396     [AV_PIX_FMT_YUV444P16LE] = {
1397         .name = "yuv444p16le",
1398         .nb_components = 3,
1399         .log2_chroma_w = 0,
1400         .log2_chroma_h = 0,
1401         .comp = {
1402             { 0, 1, 1, 0, 15 },        /* Y */
1403             { 1, 1, 1, 0, 15 },        /* U */
1404             { 2, 1, 1, 0, 15 },        /* V */
1405         },
1406         .flags = AV_PIX_FMT_FLAG_PLANAR,
1407     },
1408     [AV_PIX_FMT_YUV444P16BE] = {
1409         .name = "yuv444p16be",
1410         .nb_components = 3,
1411         .log2_chroma_w = 0,
1412         .log2_chroma_h = 0,
1413         .comp = {
1414             { 0, 1, 1, 0, 15 },        /* Y */
1415             { 1, 1, 1, 0, 15 },        /* U */
1416             { 2, 1, 1, 0, 15 },        /* V */
1417         },
1418         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1419     },
1420     [AV_PIX_FMT_YUV444P10LE] = {
1421         .name = "yuv444p10le",
1422         .nb_components = 3,
1423         .log2_chroma_w = 0,
1424         .log2_chroma_h = 0,
1425         .comp = {
1426             { 0, 1, 1, 0, 9 },        /* Y */
1427             { 1, 1, 1, 0, 9 },        /* U */
1428             { 2, 1, 1, 0, 9 },        /* V */
1429         },
1430         .flags = AV_PIX_FMT_FLAG_PLANAR,
1431     },
1432     [AV_PIX_FMT_YUV444P10BE] = {
1433         .name = "yuv444p10be",
1434         .nb_components = 3,
1435         .log2_chroma_w = 0,
1436         .log2_chroma_h = 0,
1437         .comp = {
1438             { 0, 1, 1, 0, 9 },        /* Y */
1439             { 1, 1, 1, 0, 9 },        /* U */
1440             { 2, 1, 1, 0, 9 },        /* V */
1441         },
1442         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1443     },
1444     [AV_PIX_FMT_YUV444P9LE] = {
1445         .name = "yuv444p9le",
1446         .nb_components = 3,
1447         .log2_chroma_w = 0,
1448         .log2_chroma_h = 0,
1449         .comp = {
1450             { 0, 1, 1, 0, 8 },        /* Y */
1451             { 1, 1, 1, 0, 8 },        /* U */
1452             { 2, 1, 1, 0, 8 },        /* V */
1453         },
1454         .flags = AV_PIX_FMT_FLAG_PLANAR,
1455     },
1456     [AV_PIX_FMT_YUV444P9BE] = {
1457         .name = "yuv444p9be",
1458         .nb_components = 3,
1459         .log2_chroma_w = 0,
1460         .log2_chroma_h = 0,
1461         .comp = {
1462             { 0, 1, 1, 0, 8 },        /* Y */
1463             { 1, 1, 1, 0, 8 },        /* U */
1464             { 2, 1, 1, 0, 8 },        /* V */
1465         },
1466         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1467     },
1468     [AV_PIX_FMT_YUV444P12LE] = {
1469         .name = "yuv444p12le",
1470         .nb_components = 3,
1471         .log2_chroma_w = 0,
1472         .log2_chroma_h = 0,
1473         .comp = {
1474             { 0, 1, 1, 0, 11 },        /* Y */
1475             { 1, 1, 1, 0, 11 },        /* U */
1476             { 2, 1, 1, 0, 11 },        /* V */
1477         },
1478         .flags = AV_PIX_FMT_FLAG_PLANAR,
1479     },
1480     [AV_PIX_FMT_YUV444P12BE] = {
1481         .name = "yuv444p12be",
1482         .nb_components = 3,
1483         .log2_chroma_w = 0,
1484         .log2_chroma_h = 0,
1485         .comp = {
1486             { 0, 1, 1, 0, 11 },        /* Y */
1487             { 1, 1, 1, 0, 11 },        /* U */
1488             { 2, 1, 1, 0, 11 },        /* V */
1489         },
1490         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1491     },
1492     [AV_PIX_FMT_YUV444P14LE] = {
1493         .name = "yuv444p14le",
1494         .nb_components = 3,
1495         .log2_chroma_w = 0,
1496         .log2_chroma_h = 0,
1497         .comp = {
1498             { 0, 1, 1, 0, 13 },        /* Y */
1499             { 1, 1, 1, 0, 13 },        /* U */
1500             { 2, 1, 1, 0, 13 },        /* V */
1501         },
1502         .flags = AV_PIX_FMT_FLAG_PLANAR,
1503     },
1504     [AV_PIX_FMT_YUV444P14BE] = {
1505         .name = "yuv444p14be",
1506         .nb_components = 3,
1507         .log2_chroma_w = 0,
1508         .log2_chroma_h = 0,
1509         .comp = {
1510             { 0, 1, 1, 0, 13 },        /* Y */
1511             { 1, 1, 1, 0, 13 },        /* U */
1512             { 2, 1, 1, 0, 13 },        /* V */
1513         },
1514         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1515     },
1516     [AV_PIX_FMT_DXVA2_VLD] = {
1517         .name = "dxva2_vld",
1518         .log2_chroma_w = 1,
1519         .log2_chroma_h = 1,
1520         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1521     },
1522     [AV_PIX_FMT_VDA_VLD] = {
1523         .name = "vda_vld",
1524         .log2_chroma_w = 1,
1525         .log2_chroma_h = 1,
1526         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1527     },
1528     [AV_PIX_FMT_GRAY8A] = {
1529         .name = "gray8a",
1530         .nb_components = 2,
1531         .comp = {
1532             { 0, 1, 1, 0, 7 },        /* Y */
1533             { 0, 1, 2, 0, 7 },        /* A */
1534         },
1535         .flags = AV_PIX_FMT_FLAG_ALPHA,
1536     },
1537     [AV_PIX_FMT_GBRP] = {
1538         .name = "gbrp",
1539         .nb_components = 3,
1540         .log2_chroma_w = 0,
1541         .log2_chroma_h = 0,
1542         .comp = {
1543             { 2, 0, 1, 0, 7 },        /* R */
1544             { 0, 0, 1, 0, 7 },        /* G */
1545             { 1, 0, 1, 0, 7 },        /* B */
1546         },
1547         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1548     },
1549     [AV_PIX_FMT_GBRP9LE] = {
1550         .name = "gbrp9le",
1551         .nb_components = 3,
1552         .log2_chroma_w = 0,
1553         .log2_chroma_h = 0,
1554         .comp = {
1555             { 2, 1, 1, 0, 8 },        /* R */
1556             { 0, 1, 1, 0, 8 },        /* G */
1557             { 1, 1, 1, 0, 8 },        /* B */
1558         },
1559         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1560     },
1561     [AV_PIX_FMT_GBRP9BE] = {
1562         .name = "gbrp9be",
1563         .nb_components = 3,
1564         .log2_chroma_w = 0,
1565         .log2_chroma_h = 0,
1566         .comp = {
1567             { 2, 1, 1, 0, 8 },        /* R */
1568             { 0, 1, 1, 0, 8 },        /* G */
1569             { 1, 1, 1, 0, 8 },        /* B */
1570         },
1571         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1572     },
1573     [AV_PIX_FMT_GBRP10LE] = {
1574         .name = "gbrp10le",
1575         .nb_components = 3,
1576         .log2_chroma_w = 0,
1577         .log2_chroma_h = 0,
1578         .comp = {
1579             { 2, 1, 1, 0, 9 },        /* R */
1580             { 0, 1, 1, 0, 9 },        /* G */
1581             { 1, 1, 1, 0, 9 },        /* B */
1582         },
1583         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1584     },
1585     [AV_PIX_FMT_GBRP10BE] = {
1586         .name = "gbrp10be",
1587         .nb_components = 3,
1588         .log2_chroma_w = 0,
1589         .log2_chroma_h = 0,
1590         .comp = {
1591             { 2, 1, 1, 0, 9 },        /* R */
1592             { 0, 1, 1, 0, 9 },        /* G */
1593             { 1, 1, 1, 0, 9 },        /* B */
1594         },
1595         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1596     },
1597     [AV_PIX_FMT_GBRP12LE] = {
1598         .name = "gbrp12le",
1599         .nb_components = 3,
1600         .log2_chroma_w = 0,
1601         .log2_chroma_h = 0,
1602         .comp = {
1603             { 2, 1, 1, 0, 11 },        /* R */
1604             { 0, 1, 1, 0, 11 },        /* G */
1605             { 1, 1, 1, 0, 11 },        /* B */
1606         },
1607         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1608     },
1609     [AV_PIX_FMT_GBRP12BE] = {
1610         .name = "gbrp12be",
1611         .nb_components = 3,
1612         .log2_chroma_w = 0,
1613         .log2_chroma_h = 0,
1614         .comp = {
1615             { 2, 1, 1, 0, 11 },        /* R */
1616             { 0, 1, 1, 0, 11 },        /* G */
1617             { 1, 1, 1, 0, 11 },        /* B */
1618         },
1619         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1620     },
1621     [AV_PIX_FMT_GBRP14LE] = {
1622         .name = "gbrp14le",
1623         .nb_components = 3,
1624         .log2_chroma_w = 0,
1625         .log2_chroma_h = 0,
1626         .comp = {
1627             { 2, 1, 1, 0, 13 },        /* R */
1628             { 0, 1, 1, 0, 13 },        /* G */
1629             { 1, 1, 1, 0, 13 },        /* B */
1630         },
1631         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1632     },
1633     [AV_PIX_FMT_GBRP14BE] = {
1634         .name = "gbrp14be",
1635         .nb_components = 3,
1636         .log2_chroma_w = 0,
1637         .log2_chroma_h = 0,
1638         .comp = {
1639             { 2, 1, 1, 0, 13 },        /* R */
1640             { 0, 1, 1, 0, 13 },        /* G */
1641             { 1, 1, 1, 0, 13 },        /* B */
1642         },
1643         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1644     },
1645     [AV_PIX_FMT_GBRP16LE] = {
1646         .name = "gbrp16le",
1647         .nb_components = 3,
1648         .log2_chroma_w = 0,
1649         .log2_chroma_h = 0,
1650         .comp = {
1651             { 2, 1, 1, 0, 15 },       /* R */
1652             { 0, 1, 1, 0, 15 },       /* G */
1653             { 1, 1, 1, 0, 15 },       /* B */
1654         },
1655         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1656     },
1657     [AV_PIX_FMT_GBRP16BE] = {
1658         .name = "gbrp16be",
1659         .nb_components = 3,
1660         .log2_chroma_w = 0,
1661         .log2_chroma_h = 0,
1662         .comp = {
1663             { 2, 1, 1, 0, 15 },       /* R */
1664             { 0, 1, 1, 0, 15 },       /* G */
1665             { 1, 1, 1, 0, 15 },       /* B */
1666         },
1667         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1668     },
1669     [AV_PIX_FMT_GBRAP] = {
1670         .name = "gbrap",
1671         .nb_components = 4,
1672         .log2_chroma_w = 0,
1673         .log2_chroma_h = 0,
1674         .comp = {
1675             { 2, 0, 1, 0, 7 },        /* R */
1676             { 0, 0, 1, 0, 7 },        /* G */
1677             { 1, 0, 1, 0, 7 },        /* B */
1678             { 3, 0, 1, 0, 7 },        /* A */
1679         },
1680         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1681     },
1682     [AV_PIX_FMT_GBRAP16LE] = {
1683         .name = "gbrap16le",
1684         .nb_components = 4,
1685         .log2_chroma_w = 0,
1686         .log2_chroma_h = 0,
1687         .comp = {
1688             { 2, 1, 1, 0, 15 },       /* R */
1689             { 0, 1, 1, 0, 15 },       /* G */
1690             { 1, 1, 1, 0, 15 },       /* B */
1691             { 3, 1, 1, 0, 15 },       /* A */
1692         },
1693         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1694     },
1695     [AV_PIX_FMT_GBRAP16BE] = {
1696         .name = "gbrap16be",
1697         .nb_components = 4,
1698         .log2_chroma_w = 0,
1699         .log2_chroma_h = 0,
1700         .comp = {
1701             { 2, 1, 1, 0, 15 },       /* R */
1702             { 0, 1, 1, 0, 15 },       /* G */
1703             { 1, 1, 1, 0, 15 },       /* B */
1704             { 3, 1, 1, 0, 15 },       /* A */
1705         },
1706         .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1707     },
1708     [AV_PIX_FMT_VDPAU] = {
1709         .name = "vdpau",
1710         .log2_chroma_w = 1,
1711         .log2_chroma_h = 1,
1712         .flags = AV_PIX_FMT_FLAG_HWACCEL,
1713     },
1714     [AV_PIX_FMT_XYZ12LE] = {
1715         .name = "xyz12le",
1716         .nb_components = 3,
1717         .log2_chroma_w = 0,
1718         .log2_chroma_h = 0,
1719         .comp = {
1720             { 0, 5, 1, 4, 11 },       /* X */
1721             { 0, 5, 3, 4, 11 },       /* Y */
1722             { 0, 5, 5, 4, 11 },       /* Z */
1723       },
1724       /*.flags = -- not used*/
1725     },
1726     [AV_PIX_FMT_XYZ12BE] = {
1727         .name = "xyz12be",
1728         .nb_components = 3,
1729         .log2_chroma_w = 0,
1730         .log2_chroma_h = 0,
1731         .comp = {
1732             { 0, 5, 1, 4, 11 },       /* X */
1733             { 0, 5, 3, 4, 11 },       /* Y */
1734             { 0, 5, 5, 4, 11 },       /* Z */
1735        },
1736         .flags = AV_PIX_FMT_FLAG_BE,
1737     },
1738 };
1739
1740 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1741 {
1742     enum AVPixelFormat pix_fmt;
1743
1744     for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1745         if (av_pix_fmt_descriptors[pix_fmt].name &&
1746             !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1747             return pix_fmt;
1748
1749     return AV_PIX_FMT_NONE;
1750 }
1751
1752 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
1753 {
1754     return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1755         av_pix_fmt_descriptors[pix_fmt].name : NULL;
1756 }
1757
1758 #if HAVE_BIGENDIAN
1759 #   define X_NE(be, le) be
1760 #else
1761 #   define X_NE(be, le) le
1762 #endif
1763
1764 enum AVPixelFormat av_get_pix_fmt(const char *name)
1765 {
1766     enum AVPixelFormat pix_fmt;
1767
1768     if (!strcmp(name, "rgb32"))
1769         name = X_NE("argb", "bgra");
1770     else if (!strcmp(name, "bgr32"))
1771         name = X_NE("abgr", "rgba");
1772
1773     pix_fmt = get_pix_fmt_internal(name);
1774     if (pix_fmt == AV_PIX_FMT_NONE) {
1775         char name2[32];
1776
1777         snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1778         pix_fmt = get_pix_fmt_internal(name2);
1779     }
1780     return pix_fmt;
1781 }
1782
1783 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1784 {
1785     int c, bits = 0;
1786     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1787
1788     for (c = 0; c < pixdesc->nb_components; c++) {
1789         int s = c == 1 || c == 2 ? 0 : log2_pixels;
1790         bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1791     }
1792
1793     return bits >> log2_pixels;
1794 }
1795
1796 int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1797 {
1798     int c, bits = 0;
1799     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1800     int steps[4] = {0};
1801
1802     for (c = 0; c < pixdesc->nb_components; c++) {
1803         const AVComponentDescriptor *comp = &pixdesc->comp[c];
1804         int s = c == 1 || c == 2 ? 0 : log2_pixels;
1805         steps[comp->plane] = (comp->step_minus1 + 1) << s;
1806     }
1807     for (c = 0; c < 4; c++)
1808         bits += steps[c];
1809
1810     if(!(pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM))
1811         bits *= 8;
1812
1813     return bits >> log2_pixels;
1814 }
1815
1816 char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt)
1817 {
1818     /* print header */
1819     if (pix_fmt < 0) {
1820        snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1821     } else {
1822         const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1823         snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1824                  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1825     }
1826
1827     return buf;
1828 }
1829
1830 const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
1831 {
1832     if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
1833         return NULL;
1834     return &av_pix_fmt_descriptors[pix_fmt];
1835 }
1836
1837 const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
1838 {
1839     if (!prev)
1840         return &av_pix_fmt_descriptors[0];
1841     while (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1) {
1842         prev++;
1843         if (prev->name)
1844             return prev;
1845     }
1846     return NULL;
1847 }
1848
1849 enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
1850 {
1851     if (desc < av_pix_fmt_descriptors ||
1852         desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
1853         return AV_PIX_FMT_NONE;
1854
1855     return desc - av_pix_fmt_descriptors;
1856 }
1857
1858 int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
1859                                      int *h_shift, int *v_shift)
1860 {
1861     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1862     if (!desc)
1863         return AVERROR(ENOSYS);
1864     *h_shift = desc->log2_chroma_w;
1865     *v_shift = desc->log2_chroma_h;
1866
1867     return 0;
1868 }
1869
1870 int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
1871 {
1872     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1873     int i, planes[4] = { 0 }, ret = 0;
1874
1875     if (!desc)
1876         return AVERROR(EINVAL);
1877
1878     for (i = 0; i < desc->nb_components; i++)
1879         planes[desc->comp[i].plane] = 1;
1880     for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
1881         ret += planes[i];
1882     return ret;
1883 }
1884
1885 void ff_check_pixfmt_descriptors(void){
1886     int i, j;
1887
1888     for (i=0; i<FF_ARRAY_ELEMS(av_pix_fmt_descriptors); i++) {
1889         const AVPixFmtDescriptor *d = &av_pix_fmt_descriptors[i];
1890         uint8_t fill[4][8+6+3] = {{0}};
1891         uint8_t *data[4] = {fill[0], fill[1], fill[2], fill[3]};
1892         int linesize[4] = {0,0,0,0};
1893         uint16_t tmp[2];
1894
1895         if (!d->name && !d->nb_components && !d->log2_chroma_w && !d->log2_chroma_h && !d->flags)
1896             continue;
1897 //         av_log(NULL, AV_LOG_DEBUG, "Checking: %s\n", d->name);
1898         av_assert0(d->log2_chroma_w <= 3);
1899         av_assert0(d->log2_chroma_h <= 3);
1900         av_assert0(d->nb_components <= 4);
1901         av_assert0(d->name && d->name[0]);
1902         av_assert0((d->nb_components==4 || d->nb_components==2) == !!(d->flags & AV_PIX_FMT_FLAG_ALPHA));
1903         av_assert2(av_get_pix_fmt(d->name) == i);
1904
1905         for (j=0; j<FF_ARRAY_ELEMS(d->comp); j++) {
1906             const AVComponentDescriptor *c = &d->comp[j];
1907             if(j>=d->nb_components) {
1908                 av_assert0(!c->plane && !c->step_minus1 && !c->offset_plus1 && !c->shift && !c->depth_minus1);
1909                 continue;
1910             }
1911             if (d->flags & AV_PIX_FMT_FLAG_BITSTREAM) {
1912                 av_assert0(c->step_minus1 >= c->depth_minus1);
1913             } else {
1914                 av_assert0(8*(c->step_minus1+1) >= c->depth_minus1+1);
1915             }
1916             av_read_image_line(tmp, (void*)data, linesize, d, 0, 0, j, 2, 0);
1917             av_assert0(tmp[0] == 0 && tmp[1] == 0);
1918             tmp[0] = tmp[1] = (1<<(c->depth_minus1 + 1)) - 1;
1919             av_write_image_line(tmp, data, linesize, d, 0, 0, j, 2);
1920         }
1921     }
1922 }
1923
1924
1925 enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
1926 {
1927     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1928     char name[16];
1929     int i;
1930
1931     if (!desc || strlen(desc->name) < 2)
1932         return AV_PIX_FMT_NONE;
1933     av_strlcpy(name, desc->name, sizeof(name));
1934     i = strlen(name) - 2;
1935     if (strcmp(name + i, "be") && strcmp(name + i, "le"))
1936         return AV_PIX_FMT_NONE;
1937
1938     name[i] ^= 'b' ^ 'l';
1939
1940     return get_pix_fmt_internal(name);
1941 }