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