]> git.sesse.net Git - ffmpeg/blob - libavutil/pixdesc.c
Merge commit '78071a1420b425dfb787ac739048f523007b8139'
[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 #include "pixfmt.h"
25 #include "pixdesc.h"
26
27 #include "intreadwrite.h"
28
29 void av_read_image_line(uint16_t *dst,
30                         const uint8_t *data[4], const int linesize[4],
31                         const AVPixFmtDescriptor *desc,
32                         int x, int y, int c, int w,
33                         int read_pal_component)
34 {
35     AVComponentDescriptor comp = desc->comp[c];
36     int plane = comp.plane;
37     int depth = comp.depth_minus1 + 1;
38     int mask  = (1 << depth) - 1;
39     int shift = comp.shift;
40     int step  = comp.step_minus1 + 1;
41     int flags = desc->flags;
42
43     if (flags & PIX_FMT_BITSTREAM) {
44         int skip = x * step + comp.offset_plus1 - 1;
45         const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
46         int shift = 8 - depth - (skip & 7);
47
48         while (w--) {
49             int val = (*p >> shift) & mask;
50             if (read_pal_component)
51                 val = data[1][4*val + c];
52             shift -= step;
53             p -= shift >> 3;
54             shift &= 7;
55             *dst++ = val;
56         }
57     } else {
58         const uint8_t *p = data[plane] + y * linesize[plane] +
59                            x * step + comp.offset_plus1 - 1;
60         int is_8bit = shift + depth <= 8;
61
62         if (is_8bit)
63             p += !!(flags & PIX_FMT_BE);
64
65         while (w--) {
66             int val = is_8bit ? *p :
67                 flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
68             val = (val >> shift) & mask;
69             if (read_pal_component)
70                 val = data[1][4 * val + c];
71             p += step;
72             *dst++ = val;
73         }
74     }
75 }
76
77 void av_write_image_line(const uint16_t *src,
78                          uint8_t *data[4], const int linesize[4],
79                          const AVPixFmtDescriptor *desc,
80                          int x, int y, int c, int w)
81 {
82     AVComponentDescriptor comp = desc->comp[c];
83     int plane = comp.plane;
84     int depth = comp.depth_minus1 + 1;
85     int step  = comp.step_minus1 + 1;
86     int flags = desc->flags;
87
88     if (flags & PIX_FMT_BITSTREAM) {
89         int skip = x * step + comp.offset_plus1 - 1;
90         uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
91         int shift = 8 - depth - (skip & 7);
92
93         while (w--) {
94             *p |= *src++ << shift;
95             shift -= step;
96             p -= shift >> 3;
97             shift &= 7;
98         }
99     } else {
100         int shift = comp.shift;
101         uint8_t *p = data[plane] + y * linesize[plane] +
102                      x * step + comp.offset_plus1 - 1;
103
104         if (shift + depth <= 8) {
105             p += !!(flags & PIX_FMT_BE);
106             while (w--) {
107                 *p |= (*src++ << shift);
108                 p += step;
109             }
110         } else {
111             while (w--) {
112                 if (flags & PIX_FMT_BE) {
113                     uint16_t val = AV_RB16(p) | (*src++ << shift);
114                     AV_WB16(p, val);
115                 } else {
116                     uint16_t val = AV_RL16(p) | (*src++ << shift);
117                     AV_WL16(p, val);
118                 }
119                 p += step;
120             }
121         }
122     }
123 }
124
125 const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = {
126     [PIX_FMT_YUV420P] = {
127         .name = "yuv420p",
128         .nb_components = 3,
129         .log2_chroma_w = 1,
130         .log2_chroma_h = 1,
131         .comp = {
132             { 0, 0, 1, 0, 7 },        /* Y */
133             { 1, 0, 1, 0, 7 },        /* U */
134             { 2, 0, 1, 0, 7 },        /* V */
135         },
136         .flags = PIX_FMT_PLANAR,
137     },
138     [PIX_FMT_YUYV422] = {
139         .name = "yuyv422",
140         .nb_components = 3,
141         .log2_chroma_w = 1,
142         .log2_chroma_h = 0,
143         .comp = {
144             { 0, 1, 1, 0, 7 },        /* Y */
145             { 0, 3, 2, 0, 7 },        /* U */
146             { 0, 3, 4, 0, 7 },        /* V */
147         },
148     },
149     [PIX_FMT_RGB24] = {
150         .name = "rgb24",
151         .nb_components = 3,
152         .log2_chroma_w = 0,
153         .log2_chroma_h = 0,
154         .comp = {
155             { 0, 2, 1, 0, 7 },        /* R */
156             { 0, 2, 2, 0, 7 },        /* G */
157             { 0, 2, 3, 0, 7 },        /* B */
158         },
159         .flags = PIX_FMT_RGB,
160     },
161     [PIX_FMT_BGR24] = {
162         .name = "bgr24",
163         .nb_components = 3,
164         .log2_chroma_w = 0,
165         .log2_chroma_h = 0,
166         .comp = {
167             { 0, 2, 3, 0, 7 },        /* R */
168             { 0, 2, 2, 0, 7 },        /* G */
169             { 0, 2, 1, 0, 7 },        /* B */
170         },
171         .flags = PIX_FMT_RGB,
172     },
173     [PIX_FMT_YUV422P] = {
174         .name = "yuv422p",
175         .nb_components = 3,
176         .log2_chroma_w = 1,
177         .log2_chroma_h = 0,
178         .comp = {
179             { 0, 0, 1, 0, 7 },        /* Y */
180             { 1, 0, 1, 0, 7 },        /* U */
181             { 2, 0, 1, 0, 7 },        /* V */
182         },
183         .flags = PIX_FMT_PLANAR,
184     },
185     [PIX_FMT_YUV444P] = {
186         .name = "yuv444p",
187         .nb_components = 3,
188         .log2_chroma_w = 0,
189         .log2_chroma_h = 0,
190         .comp = {
191             { 0, 0, 1, 0, 7 },        /* Y */
192             { 1, 0, 1, 0, 7 },        /* U */
193             { 2, 0, 1, 0, 7 },        /* V */
194         },
195         .flags = PIX_FMT_PLANAR,
196     },
197     [PIX_FMT_YUV410P] = {
198         .name = "yuv410p",
199         .nb_components = 3,
200         .log2_chroma_w = 2,
201         .log2_chroma_h = 2,
202         .comp = {
203             { 0, 0, 1, 0, 7 },        /* Y */
204             { 1, 0, 1, 0, 7 },        /* U */
205             { 2, 0, 1, 0, 7 },        /* V */
206         },
207         .flags = PIX_FMT_PLANAR,
208     },
209     [PIX_FMT_YUV411P] = {
210         .name = "yuv411p",
211         .nb_components = 3,
212         .log2_chroma_w = 2,
213         .log2_chroma_h = 0,
214         .comp = {
215             { 0, 0, 1, 0, 7 },        /* Y */
216             { 1, 0, 1, 0, 7 },        /* U */
217             { 2, 0, 1, 0, 7 },        /* V */
218         },
219         .flags = PIX_FMT_PLANAR,
220     },
221     [PIX_FMT_GRAY8] = {
222         .name = "gray",
223         .nb_components = 1,
224         .log2_chroma_w = 0,
225         .log2_chroma_h = 0,
226         .comp = {
227             { 0, 0, 1, 0, 7 },        /* Y */
228         },
229         .flags = PIX_FMT_PSEUDOPAL,
230     },
231     [PIX_FMT_MONOWHITE] = {
232         .name = "monow",
233         .nb_components = 1,
234         .log2_chroma_w = 0,
235         .log2_chroma_h = 0,
236         .comp = {
237             { 0, 0, 1, 0, 0 },        /* Y */
238         },
239         .flags = PIX_FMT_BITSTREAM,
240     },
241     [PIX_FMT_MONOBLACK] = {
242         .name = "monob",
243         .nb_components = 1,
244         .log2_chroma_w = 0,
245         .log2_chroma_h = 0,
246         .comp = {
247             { 0, 0, 1, 7, 0 },        /* Y */
248         },
249         .flags = PIX_FMT_BITSTREAM,
250     },
251     [PIX_FMT_PAL8] = {
252         .name = "pal8",
253         .nb_components = 1,
254         .log2_chroma_w = 0,
255         .log2_chroma_h = 0,
256         .comp = {
257             { 0, 0, 1, 0, 7 },
258         },
259         .flags = PIX_FMT_PAL,
260     },
261     [PIX_FMT_YUVJ420P] = {
262         .name = "yuvj420p",
263         .nb_components = 3,
264         .log2_chroma_w = 1,
265         .log2_chroma_h = 1,
266         .comp = {
267             { 0, 0, 1, 0, 7 },        /* Y */
268             { 1, 0, 1, 0, 7 },        /* U */
269             { 2, 0, 1, 0, 7 },        /* V */
270         },
271         .flags = PIX_FMT_PLANAR,
272     },
273     [PIX_FMT_YUVJ422P] = {
274         .name = "yuvj422p",
275         .nb_components = 3,
276         .log2_chroma_w = 1,
277         .log2_chroma_h = 0,
278         .comp = {
279             { 0, 0, 1, 0, 7 },        /* Y */
280             { 1, 0, 1, 0, 7 },        /* U */
281             { 2, 0, 1, 0, 7 },        /* V */
282         },
283         .flags = PIX_FMT_PLANAR,
284     },
285     [PIX_FMT_YUVJ444P] = {
286         .name = "yuvj444p",
287         .nb_components = 3,
288         .log2_chroma_w = 0,
289         .log2_chroma_h = 0,
290         .comp = {
291             { 0, 0, 1, 0, 7 },        /* Y */
292             { 1, 0, 1, 0, 7 },        /* U */
293             { 2, 0, 1, 0, 7 },        /* V */
294         },
295         .flags = PIX_FMT_PLANAR,
296     },
297     [PIX_FMT_XVMC_MPEG2_MC] = {
298         .name = "xvmcmc",
299         .flags = PIX_FMT_HWACCEL,
300     },
301     [PIX_FMT_XVMC_MPEG2_IDCT] = {
302         .name = "xvmcidct",
303         .flags = PIX_FMT_HWACCEL,
304     },
305     [PIX_FMT_UYVY422] = {
306         .name = "uyvy422",
307         .nb_components = 3,
308         .log2_chroma_w = 1,
309         .log2_chroma_h = 0,
310         .comp = {
311             { 0, 1, 2, 0, 7 },        /* Y */
312             { 0, 3, 1, 0, 7 },        /* U */
313             { 0, 3, 3, 0, 7 },        /* V */
314         },
315     },
316     [PIX_FMT_UYYVYY411] = {
317         .name = "uyyvyy411",
318         .nb_components = 3,
319         .log2_chroma_w = 2,
320         .log2_chroma_h = 0,
321         .comp = {
322             { 0, 3, 2, 0, 7 },        /* Y */
323             { 0, 5, 1, 0, 7 },        /* U */
324             { 0, 5, 4, 0, 7 },        /* V */
325         },
326     },
327     [PIX_FMT_BGR8] = {
328         .name = "bgr8",
329         .nb_components = 3,
330         .log2_chroma_w = 0,
331         .log2_chroma_h = 0,
332         .comp = {
333             { 0, 0, 1, 0, 2 },        /* R */
334             { 0, 0, 1, 3, 2 },        /* G */
335             { 0, 0, 1, 6, 1 },        /* B */
336         },
337         .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
338     },
339     [PIX_FMT_BGR4] = {
340         .name = "bgr4",
341         .nb_components = 3,
342         .log2_chroma_w = 0,
343         .log2_chroma_h = 0,
344         .comp = {
345             { 0, 3, 4, 0, 0 },        /* R */
346             { 0, 3, 2, 0, 1 },        /* G */
347             { 0, 3, 1, 0, 0 },        /* B */
348         },
349         .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
350     },
351     [PIX_FMT_BGR4_BYTE] = {
352         .name = "bgr4_byte",
353         .nb_components = 3,
354         .log2_chroma_w = 0,
355         .log2_chroma_h = 0,
356         .comp = {
357             { 0, 0, 1, 0, 0 },        /* R */
358             { 0, 0, 1, 1, 1 },        /* G */
359             { 0, 0, 1, 3, 0 },        /* B */
360         },
361         .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
362     },
363     [PIX_FMT_RGB8] = {
364         .name = "rgb8",
365         .nb_components = 3,
366         .log2_chroma_w = 0,
367         .log2_chroma_h = 0,
368         .comp = {
369             { 0, 0, 1, 6, 1 },        /* R */
370             { 0, 0, 1, 3, 2 },        /* G */
371             { 0, 0, 1, 0, 2 },        /* B */
372         },
373         .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
374     },
375     [PIX_FMT_RGB4] = {
376         .name = "rgb4",
377         .nb_components = 3,
378         .log2_chroma_w = 0,
379         .log2_chroma_h = 0,
380         .comp = {
381             { 0, 3, 1, 0, 0 },        /* R */
382             { 0, 3, 2, 0, 1 },        /* G */
383             { 0, 3, 4, 0, 0 },        /* B */
384         },
385         .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
386     },
387     [PIX_FMT_RGB4_BYTE] = {
388         .name = "rgb4_byte",
389         .nb_components = 3,
390         .log2_chroma_w = 0,
391         .log2_chroma_h = 0,
392         .comp = {
393             { 0, 0, 1, 3, 0 },        /* R */
394             { 0, 0, 1, 1, 1 },        /* G */
395             { 0, 0, 1, 0, 0 },        /* B */
396         },
397         .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
398     },
399     [PIX_FMT_NV12] = {
400         .name = "nv12",
401         .nb_components = 3,
402         .log2_chroma_w = 1,
403         .log2_chroma_h = 1,
404         .comp = {
405             { 0, 0, 1, 0, 7 },        /* Y */
406             { 1, 1, 1, 0, 7 },        /* U */
407             { 1, 1, 2, 0, 7 },        /* V */
408         },
409         .flags = PIX_FMT_PLANAR,
410     },
411     [PIX_FMT_NV21] = {
412         .name = "nv21",
413         .nb_components = 3,
414         .log2_chroma_w = 1,
415         .log2_chroma_h = 1,
416         .comp = {
417             { 0, 0, 1, 0, 7 },        /* Y */
418             { 1, 1, 2, 0, 7 },        /* U */
419             { 1, 1, 1, 0, 7 },        /* V */
420         },
421         .flags = PIX_FMT_PLANAR,
422     },
423     [PIX_FMT_ARGB] = {
424         .name = "argb",
425         .nb_components = 4,
426         .log2_chroma_w = 0,
427         .log2_chroma_h = 0,
428         .comp = {
429             { 0, 3, 2, 0, 7 },        /* R */
430             { 0, 3, 3, 0, 7 },        /* G */
431             { 0, 3, 4, 0, 7 },        /* B */
432             { 0, 3, 1, 0, 7 },        /* A */
433         },
434         .flags = PIX_FMT_RGB,
435     },
436     [PIX_FMT_RGBA] = {
437         .name = "rgba",
438         .nb_components = 4,
439         .log2_chroma_w = 0,
440         .log2_chroma_h = 0,
441         .comp = {
442             { 0, 3, 1, 0, 7 },        /* R */
443             { 0, 3, 2, 0, 7 },        /* G */
444             { 0, 3, 3, 0, 7 },        /* B */
445             { 0, 3, 4, 0, 7 },        /* A */
446         },
447         .flags = PIX_FMT_RGB,
448     },
449     [PIX_FMT_ABGR] = {
450         .name = "abgr",
451         .nb_components = 4,
452         .log2_chroma_w = 0,
453         .log2_chroma_h = 0,
454         .comp = {
455             { 0, 3, 4, 0, 7 },        /* R */
456             { 0, 3, 3, 0, 7 },        /* G */
457             { 0, 3, 2, 0, 7 },        /* B */
458             { 0, 3, 1, 0, 7 },        /* A */
459         },
460         .flags = PIX_FMT_RGB,
461     },
462     [PIX_FMT_BGRA] = {
463         .name = "bgra",
464         .nb_components = 4,
465         .log2_chroma_w = 0,
466         .log2_chroma_h = 0,
467         .comp = {
468             { 0, 3, 3, 0, 7 },        /* R */
469             { 0, 3, 2, 0, 7 },        /* G */
470             { 0, 3, 1, 0, 7 },        /* B */
471             { 0, 3, 4, 0, 7 },        /* A */
472         },
473         .flags = PIX_FMT_RGB,
474     },
475     [PIX_FMT_0RGB] = {
476         .name = "0rgb",
477         .nb_components= 3,
478         .log2_chroma_w= 0,
479         .log2_chroma_h= 0,
480         .comp = {
481             { 0, 3, 2, 0, 7 },        /* R */
482             { 0, 3, 3, 0, 7 },        /* G */
483             { 0, 3, 4, 0, 7 },        /* B */
484         },
485         .flags = PIX_FMT_RGB,
486     },
487     [PIX_FMT_RGB0] = {
488         .name = "rgb0",
489         .nb_components= 3,
490         .log2_chroma_w= 0,
491         .log2_chroma_h= 0,
492         .comp = {
493             { 0, 3, 1, 0, 7 },        /* R */
494             { 0, 3, 2, 0, 7 },        /* G */
495             { 0, 3, 3, 0, 7 },        /* B */
496             { 0, 3, 4, 0, 7 },        /* A */
497         },
498         .flags = PIX_FMT_RGB,
499     },
500     [PIX_FMT_0BGR] = {
501         .name = "0bgr",
502         .nb_components= 3,
503         .log2_chroma_w= 0,
504         .log2_chroma_h= 0,
505         .comp = {
506             { 0, 3, 4, 0, 7 },        /* R */
507             { 0, 3, 3, 0, 7 },        /* G */
508             { 0, 3, 2, 0, 7 },        /* B */
509         },
510         .flags = PIX_FMT_RGB,
511     },
512     [PIX_FMT_BGR0] = {
513         .name = "bgr0",
514         .nb_components= 3,
515         .log2_chroma_w= 0,
516         .log2_chroma_h= 0,
517         .comp = {
518             { 0, 3, 3, 0, 7 },        /* R */
519             { 0, 3, 2, 0, 7 },        /* G */
520             { 0, 3, 1, 0, 7 },        /* B */
521             { 0, 3, 4, 0, 7 },        /* A */
522         },
523         .flags = PIX_FMT_RGB,
524     },
525     [PIX_FMT_GRAY16BE] = {
526         .name = "gray16be",
527         .nb_components = 1,
528         .log2_chroma_w = 0,
529         .log2_chroma_h = 0,
530         .comp = {
531             { 0, 1, 1, 0, 15 },       /* Y */
532         },
533         .flags = PIX_FMT_BE,
534     },
535     [PIX_FMT_GRAY16LE] = {
536         .name = "gray16le",
537         .nb_components = 1,
538         .log2_chroma_w = 0,
539         .log2_chroma_h = 0,
540         .comp = {
541             { 0, 1, 1, 0, 15 },       /* Y */
542         },
543     },
544     [PIX_FMT_YUV440P] = {
545         .name = "yuv440p",
546         .nb_components = 3,
547         .log2_chroma_w = 0,
548         .log2_chroma_h = 1,
549         .comp = {
550             { 0, 0, 1, 0, 7 },        /* Y */
551             { 1, 0, 1, 0, 7 },        /* U */
552             { 2, 0, 1, 0, 7 },        /* V */
553         },
554         .flags = PIX_FMT_PLANAR,
555     },
556     [PIX_FMT_YUVJ440P] = {
557         .name = "yuvj440p",
558         .nb_components = 3,
559         .log2_chroma_w = 0,
560         .log2_chroma_h = 1,
561         .comp = {
562             { 0, 0, 1, 0, 7 },        /* Y */
563             { 1, 0, 1, 0, 7 },        /* U */
564             { 2, 0, 1, 0, 7 },        /* V */
565         },
566         .flags = PIX_FMT_PLANAR,
567     },
568     [PIX_FMT_YUVA420P] = {
569         .name = "yuva420p",
570         .nb_components = 4,
571         .log2_chroma_w = 1,
572         .log2_chroma_h = 1,
573         .comp = {
574             { 0, 0, 1, 0, 7 },        /* Y */
575             { 1, 0, 1, 0, 7 },        /* U */
576             { 2, 0, 1, 0, 7 },        /* V */
577             { 3, 0, 1, 0, 7 },        /* A */
578         },
579         .flags = PIX_FMT_PLANAR,
580     },
581     [PIX_FMT_YUVA422P] = {
582         .name = "yuva422p",
583         .nb_components = 4,
584         .log2_chroma_w = 1,
585         .log2_chroma_h = 0,
586         .comp = {
587             { 0, 0, 1, 0, 7 },        /* Y */
588             { 1, 0, 1, 0, 7 },        /* U */
589             { 2, 0, 1, 0, 7 },        /* V */
590             { 3, 0, 1, 0, 7 },        /* A */
591         },
592         .flags = PIX_FMT_PLANAR,
593     },
594     [PIX_FMT_YUVA444P] = {
595         .name = "yuva444p",
596         .nb_components = 4,
597         .log2_chroma_w = 0,
598         .log2_chroma_h = 0,
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 = PIX_FMT_PLANAR,
606     },
607     [PIX_FMT_VDPAU_H264] = {
608         .name = "vdpau_h264",
609         .log2_chroma_w = 1,
610         .log2_chroma_h = 1,
611         .flags = PIX_FMT_HWACCEL,
612     },
613     [PIX_FMT_VDPAU_MPEG1] = {
614         .name = "vdpau_mpeg1",
615         .log2_chroma_w = 1,
616         .log2_chroma_h = 1,
617         .flags = PIX_FMT_HWACCEL,
618     },
619     [PIX_FMT_VDPAU_MPEG2] = {
620         .name = "vdpau_mpeg2",
621         .log2_chroma_w = 1,
622         .log2_chroma_h = 1,
623         .flags = PIX_FMT_HWACCEL,
624     },
625     [PIX_FMT_VDPAU_WMV3] = {
626         .name = "vdpau_wmv3",
627         .log2_chroma_w = 1,
628         .log2_chroma_h = 1,
629         .flags = PIX_FMT_HWACCEL,
630     },
631     [PIX_FMT_VDPAU_VC1] = {
632         .name = "vdpau_vc1",
633         .log2_chroma_w = 1,
634         .log2_chroma_h = 1,
635         .flags = PIX_FMT_HWACCEL,
636     },
637     [PIX_FMT_VDPAU_MPEG4] = {
638         .name = "vdpau_mpeg4",
639         .log2_chroma_w = 1,
640         .log2_chroma_h = 1,
641         .flags = PIX_FMT_HWACCEL,
642     },
643     [PIX_FMT_RGB48BE] = {
644         .name = "rgb48be",
645         .nb_components = 3,
646         .log2_chroma_w = 0,
647         .log2_chroma_h = 0,
648         .comp = {
649             { 0, 5, 1, 0, 15 },       /* R */
650             { 0, 5, 3, 0, 15 },       /* G */
651             { 0, 5, 5, 0, 15 },       /* B */
652         },
653         .flags = PIX_FMT_RGB | PIX_FMT_BE,
654     },
655     [PIX_FMT_RGB48LE] = {
656         .name = "rgb48le",
657         .nb_components = 3,
658         .log2_chroma_w = 0,
659         .log2_chroma_h = 0,
660         .comp = {
661             { 0, 5, 1, 0, 15 },       /* R */
662             { 0, 5, 3, 0, 15 },       /* G */
663             { 0, 5, 5, 0, 15 },       /* B */
664         },
665         .flags = PIX_FMT_RGB,
666     },
667     [PIX_FMT_RGBA64BE] = {
668         .name = "rgba64be",
669         .nb_components= 4,
670         .log2_chroma_w= 0,
671         .log2_chroma_h= 0,
672         .comp = {
673             { 0, 7, 1, 0, 15 },       /* R */
674             { 0, 7, 3, 0, 15 },       /* G */
675             { 0, 7, 5, 0, 15 },       /* B */
676             { 0, 7, 7, 0, 15 },       /* A */
677         },
678         .flags = PIX_FMT_RGB | PIX_FMT_BE,
679     },
680     [PIX_FMT_RGBA64LE] = {
681         .name = "rgba64le",
682         .nb_components= 4,
683         .log2_chroma_w= 0,
684         .log2_chroma_h= 0,
685         .comp = {
686             { 0, 7, 1, 0, 15 },       /* R */
687             { 0, 7, 3, 0, 15 },       /* G */
688             { 0, 7, 5, 0, 15 },       /* B */
689             { 0, 7, 7, 0, 15 },       /* A */
690         },
691         .flags = PIX_FMT_RGB,
692     },
693     [PIX_FMT_RGB565BE] = {
694         .name = "rgb565be",
695         .nb_components = 3,
696         .log2_chroma_w = 0,
697         .log2_chroma_h = 0,
698         .comp = {
699             { 0, 1, 0, 3, 4 },        /* R */
700             { 0, 1, 1, 5, 5 },        /* G */
701             { 0, 1, 1, 0, 4 },        /* B */
702         },
703         .flags = PIX_FMT_BE | PIX_FMT_RGB,
704     },
705     [PIX_FMT_RGB565LE] = {
706         .name = "rgb565le",
707         .nb_components = 3,
708         .log2_chroma_w = 0,
709         .log2_chroma_h = 0,
710         .comp = {
711             { 0, 1, 2, 3, 4 },        /* R */
712             { 0, 1, 1, 5, 5 },        /* G */
713             { 0, 1, 1, 0, 4 },        /* B */
714         },
715         .flags = PIX_FMT_RGB,
716     },
717     [PIX_FMT_RGB555BE] = {
718         .name = "rgb555be",
719         .nb_components = 3,
720         .log2_chroma_w = 0,
721         .log2_chroma_h = 0,
722         .comp = {
723             { 0, 1, 0, 2, 4 },        /* R */
724             { 0, 1, 1, 5, 4 },        /* G */
725             { 0, 1, 1, 0, 4 },        /* B */
726         },
727         .flags = PIX_FMT_BE | PIX_FMT_RGB,
728     },
729     [PIX_FMT_RGB555LE] = {
730         .name = "rgb555le",
731         .nb_components = 3,
732         .log2_chroma_w = 0,
733         .log2_chroma_h = 0,
734         .comp = {
735             { 0, 1, 2, 2, 4 },        /* R */
736             { 0, 1, 1, 5, 4 },        /* G */
737             { 0, 1, 1, 0, 4 },        /* B */
738         },
739         .flags = PIX_FMT_RGB,
740     },
741     [PIX_FMT_RGB444BE] = {
742         .name = "rgb444be",
743         .nb_components = 3,
744         .log2_chroma_w = 0,
745         .log2_chroma_h = 0,
746         .comp = {
747             { 0, 1, 0, 0, 3 },        /* R */
748             { 0, 1, 1, 4, 3 },        /* G */
749             { 0, 1, 1, 0, 3 },        /* B */
750         },
751         .flags = PIX_FMT_BE | PIX_FMT_RGB,
752     },
753     [PIX_FMT_RGB444LE] = {
754         .name = "rgb444le",
755         .nb_components = 3,
756         .log2_chroma_w = 0,
757         .log2_chroma_h = 0,
758         .comp = {
759             { 0, 1, 2, 0, 3 },        /* R */
760             { 0, 1, 1, 4, 3 },        /* G */
761             { 0, 1, 1, 0, 3 },        /* B */
762         },
763         .flags = PIX_FMT_RGB,
764     },
765     [PIX_FMT_BGR48BE] = {
766         .name = "bgr48be",
767         .nb_components = 3,
768         .log2_chroma_w = 0,
769         .log2_chroma_h = 0,
770         .comp = {
771             { 0, 5, 5, 0, 15 },       /* R */
772             { 0, 5, 3, 0, 15 },       /* G */
773             { 0, 5, 1, 0, 15 },       /* B */
774         },
775         .flags = PIX_FMT_BE | PIX_FMT_RGB,
776     },
777     [PIX_FMT_BGR48LE] = {
778         .name = "bgr48le",
779         .nb_components = 3,
780         .log2_chroma_w = 0,
781         .log2_chroma_h = 0,
782         .comp = {
783             { 0, 5, 5, 0, 15 },       /* R */
784             { 0, 5, 3, 0, 15 },       /* G */
785             { 0, 5, 1, 0, 15 },       /* B */
786         },
787         .flags = PIX_FMT_RGB,
788     },
789     [PIX_FMT_BGRA64BE] = {
790         .name = "bgra64be",
791         .nb_components= 4,
792         .log2_chroma_w= 0,
793         .log2_chroma_h= 0,
794         .comp = {
795             { 0, 7, 5, 0, 15 },       /* R */
796             { 0, 7, 3, 0, 15 },       /* G */
797             { 0, 7, 1, 0, 15 },       /* B */
798             { 0, 7, 7, 0, 15 },       /* A */
799         },
800         .flags = PIX_FMT_BE | PIX_FMT_RGB,
801     },
802     [PIX_FMT_BGRA64LE] = {
803         .name = "bgra64le",
804         .nb_components= 4,
805         .log2_chroma_w= 0,
806         .log2_chroma_h= 0,
807         .comp = {
808             { 0, 7, 5, 0, 15 },       /* R */
809             { 0, 7, 3, 0, 15 },       /* G */
810             { 0, 7, 1, 0, 15 },       /* B */
811             { 0, 7, 7, 0, 15 },       /* A */
812         },
813         .flags = PIX_FMT_RGB,
814     },
815     [PIX_FMT_BGR565BE] = {
816         .name = "bgr565be",
817         .nb_components = 3,
818         .log2_chroma_w = 0,
819         .log2_chroma_h = 0,
820         .comp = {
821             { 0, 1, 1, 0, 4 },        /* R */
822             { 0, 1, 1, 5, 5 },        /* G */
823             { 0, 1, 0, 3, 4 },        /* B */
824         },
825         .flags = PIX_FMT_BE | PIX_FMT_RGB,
826     },
827     [PIX_FMT_BGR565LE] = {
828         .name = "bgr565le",
829         .nb_components = 3,
830         .log2_chroma_w = 0,
831         .log2_chroma_h = 0,
832         .comp = {
833             { 0, 1, 1, 0, 4 },        /* R */
834             { 0, 1, 1, 5, 5 },        /* G */
835             { 0, 1, 2, 3, 4 },        /* B */
836         },
837         .flags = PIX_FMT_RGB,
838     },
839     [PIX_FMT_BGR555BE] = {
840         .name = "bgr555be",
841         .nb_components = 3,
842         .log2_chroma_w = 0,
843         .log2_chroma_h = 0,
844         .comp = {
845             { 0, 1, 1, 0, 4 },       /* R */
846             { 0, 1, 1, 5, 4 },       /* G */
847             { 0, 1, 0, 2, 4 },       /* B */
848         },
849         .flags = PIX_FMT_BE | PIX_FMT_RGB,
850      },
851     [PIX_FMT_BGR555LE] = {
852         .name = "bgr555le",
853         .nb_components = 3,
854         .log2_chroma_w = 0,
855         .log2_chroma_h = 0,
856         .comp = {
857             { 0, 1, 1, 0, 4 },        /* R */
858             { 0, 1, 1, 5, 4 },        /* G */
859             { 0, 1, 2, 2, 4 },        /* B */
860         },
861         .flags = PIX_FMT_RGB,
862     },
863     [PIX_FMT_BGR444BE] = {
864         .name = "bgr444be",
865         .nb_components = 3,
866         .log2_chroma_w = 0,
867         .log2_chroma_h = 0,
868         .comp = {
869             { 0, 1, 1, 0, 3 },       /* R */
870             { 0, 1, 1, 4, 3 },       /* G */
871             { 0, 1, 0, 0, 3 },       /* B */
872         },
873         .flags = PIX_FMT_BE | PIX_FMT_RGB,
874      },
875     [PIX_FMT_BGR444LE] = {
876         .name = "bgr444le",
877         .nb_components = 3,
878         .log2_chroma_w = 0,
879         .log2_chroma_h = 0,
880         .comp = {
881             { 0, 1, 1, 0, 3 },        /* R */
882             { 0, 1, 1, 4, 3 },        /* G */
883             { 0, 1, 2, 0, 3 },        /* B */
884         },
885         .flags = PIX_FMT_RGB,
886     },
887     [PIX_FMT_VAAPI_MOCO] = {
888         .name = "vaapi_moco",
889         .log2_chroma_w = 1,
890         .log2_chroma_h = 1,
891         .flags = PIX_FMT_HWACCEL,
892     },
893     [PIX_FMT_VAAPI_IDCT] = {
894         .name = "vaapi_idct",
895         .log2_chroma_w = 1,
896         .log2_chroma_h = 1,
897         .flags = PIX_FMT_HWACCEL,
898     },
899     [PIX_FMT_VAAPI_VLD] = {
900         .name = "vaapi_vld",
901         .log2_chroma_w = 1,
902         .log2_chroma_h = 1,
903         .flags = PIX_FMT_HWACCEL,
904     },
905     [PIX_FMT_YUV420P9LE] = {
906         .name = "yuv420p9le",
907         .nb_components = 3,
908         .log2_chroma_w = 1,
909         .log2_chroma_h = 1,
910         .comp = {
911             { 0, 1, 1, 0, 8 },        /* Y */
912             { 1, 1, 1, 0, 8 },        /* U */
913             { 2, 1, 1, 0, 8 },        /* V */
914         },
915         .flags = PIX_FMT_PLANAR,
916     },
917     [PIX_FMT_YUV420P9BE] = {
918         .name = "yuv420p9be",
919         .nb_components = 3,
920         .log2_chroma_w = 1,
921         .log2_chroma_h = 1,
922         .comp = {
923             { 0, 1, 1, 0, 8 },        /* Y */
924             { 1, 1, 1, 0, 8 },        /* U */
925             { 2, 1, 1, 0, 8 },        /* V */
926         },
927         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
928     },
929     [PIX_FMT_YUV420P10LE] = {
930         .name = "yuv420p10le",
931         .nb_components = 3,
932         .log2_chroma_w = 1,
933         .log2_chroma_h = 1,
934         .comp = {
935             { 0, 1, 1, 0, 9 },        /* Y */
936             { 1, 1, 1, 0, 9 },        /* U */
937             { 2, 1, 1, 0, 9 },        /* V */
938         },
939         .flags = PIX_FMT_PLANAR,
940     },
941     [PIX_FMT_YUV420P10BE] = {
942         .name = "yuv420p10be",
943         .nb_components = 3,
944         .log2_chroma_w = 1,
945         .log2_chroma_h = 1,
946         .comp = {
947             { 0, 1, 1, 0, 9 },        /* Y */
948             { 1, 1, 1, 0, 9 },        /* U */
949             { 2, 1, 1, 0, 9 },        /* V */
950         },
951         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
952     },
953     [PIX_FMT_YUV420P12LE] = {
954         .name = "yuv420p12le",
955         .nb_components = 3,
956         .log2_chroma_w = 1,
957         .log2_chroma_h = 1,
958         .comp = {
959             { 0, 1, 1, 0, 11 },        /* Y */
960             { 1, 1, 1, 0, 11 },        /* U */
961             { 2, 1, 1, 0, 11 },        /* V */
962         },
963         .flags = PIX_FMT_PLANAR,
964     },
965     [PIX_FMT_YUV420P12BE] = {
966         .name = "yuv420p12be",
967         .nb_components = 3,
968         .log2_chroma_w = 1,
969         .log2_chroma_h = 1,
970         .comp = {
971             { 0, 1, 1, 0, 11 },        /* Y */
972             { 1, 1, 1, 0, 11 },        /* U */
973             { 2, 1, 1, 0, 11 },        /* V */
974         },
975         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
976     },
977     [PIX_FMT_YUV420P14LE] = {
978         .name = "yuv420p14le",
979         .nb_components = 3,
980         .log2_chroma_w = 1,
981         .log2_chroma_h = 1,
982         .comp = {
983             { 0, 1, 1, 0, 13 },        /* Y */
984             { 1, 1, 1, 0, 13 },        /* U */
985             { 2, 1, 1, 0, 13 },        /* V */
986         },
987         .flags = PIX_FMT_PLANAR,
988     },
989     [PIX_FMT_YUV420P14BE] = {
990         .name = "yuv420p14be",
991         .nb_components = 3,
992         .log2_chroma_w = 1,
993         .log2_chroma_h = 1,
994         .comp = {
995             { 0, 1, 1, 0, 13 },        /* Y */
996             { 1, 1, 1, 0, 13 },        /* U */
997             { 2, 1, 1, 0, 13 },        /* V */
998         },
999         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1000     },
1001     [PIX_FMT_YUV420P16LE] = {
1002         .name = "yuv420p16le",
1003         .nb_components = 3,
1004         .log2_chroma_w = 1,
1005         .log2_chroma_h = 1,
1006         .comp = {
1007             { 0, 1, 1, 0, 15 },        /* Y */
1008             { 1, 1, 1, 0, 15 },        /* U */
1009             { 2, 1, 1, 0, 15 },        /* V */
1010         },
1011         .flags = PIX_FMT_PLANAR,
1012     },
1013     [PIX_FMT_YUV420P16BE] = {
1014         .name = "yuv420p16be",
1015         .nb_components = 3,
1016         .log2_chroma_w = 1,
1017         .log2_chroma_h = 1,
1018         .comp = {
1019             { 0, 1, 1, 0, 15 },        /* Y */
1020             { 1, 1, 1, 0, 15 },        /* U */
1021             { 2, 1, 1, 0, 15 },        /* V */
1022         },
1023         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1024     },
1025     [PIX_FMT_YUV422P9LE] = {
1026         .name = "yuv422p9le",
1027         .nb_components = 3,
1028         .log2_chroma_w = 1,
1029         .log2_chroma_h = 0,
1030         .comp = {
1031             { 0, 1, 1, 0, 8 },        /* Y */
1032             { 1, 1, 1, 0, 8 },        /* U */
1033             { 2, 1, 1, 0, 8 },        /* V */
1034         },
1035         .flags = PIX_FMT_PLANAR,
1036     },
1037     [PIX_FMT_YUV422P9BE] = {
1038         .name = "yuv422p9be",
1039         .nb_components = 3,
1040         .log2_chroma_w = 1,
1041         .log2_chroma_h = 0,
1042         .comp = {
1043             { 0, 1, 1, 0, 8 },        /* Y */
1044             { 1, 1, 1, 0, 8 },        /* U */
1045             { 2, 1, 1, 0, 8 },        /* V */
1046         },
1047         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1048     },
1049     [PIX_FMT_YUV422P10LE] = {
1050         .name = "yuv422p10le",
1051         .nb_components = 3,
1052         .log2_chroma_w = 1,
1053         .log2_chroma_h = 0,
1054         .comp = {
1055             { 0, 1, 1, 0, 9 },        /* Y */
1056             { 1, 1, 1, 0, 9 },        /* U */
1057             { 2, 1, 1, 0, 9 },        /* V */
1058         },
1059         .flags = PIX_FMT_PLANAR,
1060     },
1061     [PIX_FMT_YUV422P10BE] = {
1062         .name = "yuv422p10be",
1063         .nb_components = 3,
1064         .log2_chroma_w = 1,
1065         .log2_chroma_h = 0,
1066         .comp = {
1067             { 0, 1, 1, 0, 9 },        /* Y */
1068             { 1, 1, 1, 0, 9 },        /* U */
1069             { 2, 1, 1, 0, 9 },        /* V */
1070         },
1071         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1072     },
1073     [PIX_FMT_YUV422P12LE] = {
1074         .name = "yuv422p12le",
1075         .nb_components = 3,
1076         .log2_chroma_w = 1,
1077         .log2_chroma_h = 0,
1078         .comp = {
1079             { 0, 1, 1, 0, 11 },        /* Y */
1080             { 1, 1, 1, 0, 11 },        /* U */
1081             { 2, 1, 1, 0, 11 },        /* V */
1082         },
1083         .flags = PIX_FMT_PLANAR,
1084     },
1085     [PIX_FMT_YUV422P12BE] = {
1086         .name = "yuv422p12be",
1087         .nb_components = 3,
1088         .log2_chroma_w = 1,
1089         .log2_chroma_h = 0,
1090         .comp = {
1091             { 0, 1, 1, 0, 11 },        /* Y */
1092             { 1, 1, 1, 0, 11 },        /* U */
1093             { 2, 1, 1, 0, 11 },        /* V */
1094         },
1095         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1096     },
1097     [PIX_FMT_YUV422P14LE] = {
1098         .name = "yuv422p14le",
1099         .nb_components = 3,
1100         .log2_chroma_w = 1,
1101         .log2_chroma_h = 0,
1102         .comp = {
1103             { 0, 1, 1, 0, 13 },        /* Y */
1104             { 1, 1, 1, 0, 13 },        /* U */
1105             { 2, 1, 1, 0, 13 },        /* V */
1106         },
1107         .flags = PIX_FMT_PLANAR,
1108     },
1109     [PIX_FMT_YUV422P14BE] = {
1110         .name = "yuv422p14be",
1111         .nb_components = 3,
1112         .log2_chroma_w = 1,
1113         .log2_chroma_h = 0,
1114         .comp = {
1115             { 0, 1, 1, 0, 13 },        /* Y */
1116             { 1, 1, 1, 0, 13 },        /* U */
1117             { 2, 1, 1, 0, 13 },        /* V */
1118         },
1119         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1120     },
1121     [PIX_FMT_YUV422P16LE] = {
1122         .name = "yuv422p16le",
1123         .nb_components = 3,
1124         .log2_chroma_w = 1,
1125         .log2_chroma_h = 0,
1126         .comp = {
1127             { 0, 1, 1, 0, 15 },        /* Y */
1128             { 1, 1, 1, 0, 15 },        /* U */
1129             { 2, 1, 1, 0, 15 },        /* V */
1130         },
1131         .flags = PIX_FMT_PLANAR,
1132     },
1133     [PIX_FMT_YUV422P16BE] = {
1134         .name = "yuv422p16be",
1135         .nb_components = 3,
1136         .log2_chroma_w = 1,
1137         .log2_chroma_h = 0,
1138         .comp = {
1139             { 0, 1, 1, 0, 15 },        /* Y */
1140             { 1, 1, 1, 0, 15 },        /* U */
1141             { 2, 1, 1, 0, 15 },        /* V */
1142         },
1143         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1144     },
1145     [PIX_FMT_YUV444P16LE] = {
1146         .name = "yuv444p16le",
1147         .nb_components = 3,
1148         .log2_chroma_w = 0,
1149         .log2_chroma_h = 0,
1150         .comp = {
1151             { 0, 1, 1, 0, 15 },        /* Y */
1152             { 1, 1, 1, 0, 15 },        /* U */
1153             { 2, 1, 1, 0, 15 },        /* V */
1154         },
1155         .flags = PIX_FMT_PLANAR,
1156     },
1157     [PIX_FMT_YUV444P16BE] = {
1158         .name = "yuv444p16be",
1159         .nb_components = 3,
1160         .log2_chroma_w = 0,
1161         .log2_chroma_h = 0,
1162         .comp = {
1163             { 0, 1, 1, 0, 15 },        /* Y */
1164             { 1, 1, 1, 0, 15 },        /* U */
1165             { 2, 1, 1, 0, 15 },        /* V */
1166         },
1167         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1168     },
1169     [PIX_FMT_YUV444P10LE] = {
1170         .name = "yuv444p10le",
1171         .nb_components = 3,
1172         .log2_chroma_w = 0,
1173         .log2_chroma_h = 0,
1174         .comp = {
1175             { 0, 1, 1, 0, 9 },        /* Y */
1176             { 1, 1, 1, 0, 9 },        /* U */
1177             { 2, 1, 1, 0, 9 },        /* V */
1178         },
1179         .flags = PIX_FMT_PLANAR,
1180     },
1181     [PIX_FMT_YUV444P10BE] = {
1182         .name = "yuv444p10be",
1183         .nb_components = 3,
1184         .log2_chroma_w = 0,
1185         .log2_chroma_h = 0,
1186         .comp = {
1187             { 0, 1, 1, 0, 9 },        /* Y */
1188             { 1, 1, 1, 0, 9 },        /* U */
1189             { 2, 1, 1, 0, 9 },        /* V */
1190         },
1191         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1192     },
1193     [PIX_FMT_YUV444P9LE] = {
1194         .name = "yuv444p9le",
1195         .nb_components = 3,
1196         .log2_chroma_w = 0,
1197         .log2_chroma_h = 0,
1198         .comp = {
1199             { 0, 1, 1, 0, 8 },        /* Y */
1200             { 1, 1, 1, 0, 8 },        /* U */
1201             { 2, 1, 1, 0, 8 },        /* V */
1202         },
1203         .flags = PIX_FMT_PLANAR,
1204     },
1205     [PIX_FMT_YUV444P9BE] = {
1206         .name = "yuv444p9be",
1207         .nb_components = 3,
1208         .log2_chroma_w = 0,
1209         .log2_chroma_h = 0,
1210         .comp = {
1211             { 0, 1, 1, 0, 8 },        /* Y */
1212             { 1, 1, 1, 0, 8 },        /* U */
1213             { 2, 1, 1, 0, 8 },        /* V */
1214         },
1215         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1216     },
1217     [PIX_FMT_YUV444P12LE] = {
1218         .name = "yuv444p12le",
1219         .nb_components = 3,
1220         .log2_chroma_w = 0,
1221         .log2_chroma_h = 0,
1222         .comp = {
1223             { 0, 1, 1, 0, 11 },        /* Y */
1224             { 1, 1, 1, 0, 11 },        /* U */
1225             { 2, 1, 1, 0, 11 },        /* V */
1226         },
1227         .flags = PIX_FMT_PLANAR,
1228     },
1229     [PIX_FMT_YUV444P12BE] = {
1230         .name = "yuv444p12be",
1231         .nb_components = 3,
1232         .log2_chroma_w = 0,
1233         .log2_chroma_h = 0,
1234         .comp = {
1235             { 0, 1, 1, 0, 11 },        /* Y */
1236             { 1, 1, 1, 0, 11 },        /* U */
1237             { 2, 1, 1, 0, 11 },        /* V */
1238         },
1239         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1240     },
1241     [PIX_FMT_YUV444P14LE] = {
1242         .name = "yuv444p14le",
1243         .nb_components = 3,
1244         .log2_chroma_w = 0,
1245         .log2_chroma_h = 0,
1246         .comp = {
1247             { 0, 1, 1, 0, 13 },        /* Y */
1248             { 1, 1, 1, 0, 13 },        /* U */
1249             { 2, 1, 1, 0, 13 },        /* V */
1250         },
1251         .flags = PIX_FMT_PLANAR,
1252     },
1253     [PIX_FMT_YUV444P14BE] = {
1254         .name = "yuv444p14be",
1255         .nb_components = 3,
1256         .log2_chroma_w = 0,
1257         .log2_chroma_h = 0,
1258         .comp = {
1259             { 0, 1, 1, 0, 13 },        /* Y */
1260             { 1, 1, 1, 0, 13 },        /* U */
1261             { 2, 1, 1, 0, 13 },        /* V */
1262         },
1263         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1264     },
1265     [PIX_FMT_DXVA2_VLD] = {
1266         .name = "dxva2_vld",
1267         .log2_chroma_w = 1,
1268         .log2_chroma_h = 1,
1269         .flags = PIX_FMT_HWACCEL,
1270     },
1271     [PIX_FMT_VDA_VLD] = {
1272         .name = "vda_vld",
1273         .log2_chroma_w = 1,
1274         .log2_chroma_h = 1,
1275         .flags = PIX_FMT_HWACCEL,
1276     },
1277     [PIX_FMT_GRAY8A] = {
1278         .name = "gray8a",
1279         .nb_components = 2,
1280         .comp = {
1281             { 0, 1, 1, 0, 7 },        /* Y */
1282             { 0, 1, 2, 0, 7 },        /* A */
1283         },
1284     },
1285     [PIX_FMT_GBRP] = {
1286         .name = "gbrp",
1287         .nb_components = 3,
1288         .log2_chroma_w = 0,
1289         .log2_chroma_h = 0,
1290         .comp = {
1291             { 2, 0, 1, 0, 7 },        /* R */
1292             { 0, 0, 1, 0, 7 },        /* G */
1293             { 1, 0, 1, 0, 7 },        /* B */
1294         },
1295         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1296     },
1297     [PIX_FMT_GBRP9LE] = {
1298         .name = "gbrp9le",
1299         .nb_components = 3,
1300         .log2_chroma_w = 0,
1301         .log2_chroma_h = 0,
1302         .comp = {
1303             { 2, 1, 1, 0, 8 },        /* R */
1304             { 0, 1, 1, 0, 8 },        /* G */
1305             { 1, 1, 1, 0, 8 },        /* B */
1306         },
1307         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1308     },
1309     [PIX_FMT_GBRP9BE] = {
1310         .name = "gbrp9be",
1311         .nb_components = 3,
1312         .log2_chroma_w = 0,
1313         .log2_chroma_h = 0,
1314         .comp = {
1315             { 2, 1, 1, 0, 8 },        /* R */
1316             { 0, 1, 1, 0, 8 },        /* G */
1317             { 1, 1, 1, 0, 8 },        /* B */
1318         },
1319         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1320     },
1321     [PIX_FMT_GBRP10LE] = {
1322         .name = "gbrp10le",
1323         .nb_components = 3,
1324         .log2_chroma_w = 0,
1325         .log2_chroma_h = 0,
1326         .comp = {
1327             { 2, 1, 1, 0, 9 },        /* R */
1328             { 0, 1, 1, 0, 9 },        /* G */
1329             { 1, 1, 1, 0, 9 },        /* B */
1330         },
1331         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1332     },
1333     [PIX_FMT_GBRP10BE] = {
1334         .name = "gbrp10be",
1335         .nb_components = 3,
1336         .log2_chroma_w = 0,
1337         .log2_chroma_h = 0,
1338         .comp = {
1339             { 2, 1, 1, 0, 9 },        /* R */
1340             { 0, 1, 1, 0, 9 },        /* G */
1341             { 1, 1, 1, 0, 9 },        /* B */
1342         },
1343         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1344     },
1345     [PIX_FMT_GBRP12LE] = {
1346         .name = "gbrp12le",
1347         .nb_components = 3,
1348         .log2_chroma_w = 0,
1349         .log2_chroma_h = 0,
1350         .comp = {
1351             { 2, 1, 1, 0, 11 },        /* R */
1352             { 0, 1, 1, 0, 11 },        /* G */
1353             { 1, 1, 1, 0, 11 },        /* B */
1354         },
1355         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1356     },
1357     [PIX_FMT_GBRP12BE] = {
1358         .name = "gbrp12be",
1359         .nb_components = 3,
1360         .log2_chroma_w = 0,
1361         .log2_chroma_h = 0,
1362         .comp = {
1363             { 2, 1, 1, 0, 11 },        /* R */
1364             { 0, 1, 1, 0, 11 },        /* G */
1365             { 1, 1, 1, 0, 11 },        /* B */
1366         },
1367         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1368     },
1369     [PIX_FMT_GBRP14LE] = {
1370         .name = "gbrp14le",
1371         .nb_components = 3,
1372         .log2_chroma_w = 0,
1373         .log2_chroma_h = 0,
1374         .comp = {
1375             { 2, 1, 1, 0, 13 },        /* R */
1376             { 0, 1, 1, 0, 13 },        /* G */
1377             { 1, 1, 1, 0, 13 },        /* B */
1378         },
1379         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1380     },
1381     [PIX_FMT_GBRP14BE] = {
1382         .name = "gbrp14be",
1383         .nb_components = 3,
1384         .log2_chroma_w = 0,
1385         .log2_chroma_h = 0,
1386         .comp = {
1387             { 2, 1, 1, 0, 13 },        /* R */
1388             { 0, 1, 1, 0, 13 },        /* G */
1389             { 1, 1, 1, 0, 13 },        /* B */
1390         },
1391         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1392     },
1393     [PIX_FMT_GBRP16LE] = {
1394         .name = "gbrp16le",
1395         .nb_components = 3,
1396         .log2_chroma_w = 0,
1397         .log2_chroma_h = 0,
1398         .comp = {
1399             { 2, 1, 1, 0, 15 },       /* R */
1400             { 0, 1, 1, 0, 15 },       /* G */
1401             { 1, 1, 1, 0, 15 },       /* B */
1402         },
1403         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1404     },
1405     [PIX_FMT_GBRP16BE] = {
1406         .name = "gbrp16be",
1407         .nb_components = 3,
1408         .log2_chroma_w = 0,
1409         .log2_chroma_h = 0,
1410         .comp = {
1411             { 2, 1, 1, 0, 15 },       /* R */
1412             { 0, 1, 1, 0, 15 },       /* G */
1413             { 1, 1, 1, 0, 15 },       /* B */
1414         },
1415         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1416     },
1417 };
1418
1419 static enum PixelFormat get_pix_fmt_internal(const char *name)
1420 {
1421     enum PixelFormat pix_fmt;
1422
1423     for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
1424         if (av_pix_fmt_descriptors[pix_fmt].name &&
1425             !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1426             return pix_fmt;
1427
1428     return PIX_FMT_NONE;
1429 }
1430
1431 const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt)
1432 {
1433     return (unsigned)pix_fmt < PIX_FMT_NB ?
1434         av_pix_fmt_descriptors[pix_fmt].name : NULL;
1435 }
1436
1437 #if HAVE_BIGENDIAN
1438 #   define X_NE(be, le) be
1439 #else
1440 #   define X_NE(be, le) le
1441 #endif
1442
1443 enum PixelFormat av_get_pix_fmt(const char *name)
1444 {
1445     enum PixelFormat pix_fmt;
1446
1447     if (!strcmp(name, "rgb32"))
1448         name = X_NE("argb", "bgra");
1449     else if (!strcmp(name, "bgr32"))
1450         name = X_NE("abgr", "rgba");
1451
1452     pix_fmt = get_pix_fmt_internal(name);
1453     if (pix_fmt == PIX_FMT_NONE) {
1454         char name2[32];
1455
1456         snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1457         pix_fmt = get_pix_fmt_internal(name2);
1458     }
1459     return pix_fmt;
1460 }
1461
1462 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1463 {
1464     int c, bits = 0;
1465     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1466
1467     for (c = 0; c < pixdesc->nb_components; c++) {
1468         int s = c == 1 || c == 2 ? 0 : log2_pixels;
1469         bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1470     }
1471
1472     return bits >> log2_pixels;
1473 }
1474
1475 char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
1476 {
1477     /* print header */
1478     if (pix_fmt < 0) {
1479        snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1480     } else {
1481         const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1482         snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1483                  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1484     }
1485
1486     return buf;
1487 }