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