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