sws/pixfmt/pixdesc: add support for yuva444p
[ffmpeg.git] / libavutil / pixdesc.c
1 /*
2  * pixel format descriptor
3  * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of 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 #include "pixfmt.h"
25 #include "pixdesc.h"
26
27 #include "intreadwrite.h"
28
29 void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4],
30                         const AVPixFmtDescriptor *desc, int x, int y, int c, int w,
31                         int read_pal_component)
32 {
33     AVComponentDescriptor comp = desc->comp[c];
34     int plane = comp.plane;
35     int depth = comp.depth_minus1 + 1;
36     int mask  = (1 << depth) - 1;
37     int shift = comp.shift;
38     int step  = comp.step_minus1 + 1;
39     int flags = desc->flags;
40
41     if (flags & PIX_FMT_BITSTREAM) {
42         int skip = x * step + comp.offset_plus1 - 1;
43         const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
44         int shift = 8 - depth - (skip & 7);
45
46         while (w--) {
47             int val = (*p >> shift) & mask;
48             if (read_pal_component)
49                 val = data[1][4*val + c];
50             shift -= step;
51             p -= shift >> 3;
52             shift &= 7;
53             *dst++ = val;
54         }
55     } else {
56         const uint8_t *p = data[plane] + y * linesize[plane] + x * step + comp.offset_plus1 - 1;
57         int is_8bit = shift + depth <= 8;
58
59         if (is_8bit)
60             p += !!(flags & PIX_FMT_BE);
61
62         while (w--) {
63             int val = is_8bit ? *p :
64                 flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
65             val = (val >> shift) & mask;
66             if (read_pal_component)
67                 val = data[1][4 * val + c];
68             p += step;
69             *dst++ = val;
70         }
71     }
72 }
73
74 void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4],
75                          const AVPixFmtDescriptor *desc, int x, int y, int c, int w)
76 {
77     AVComponentDescriptor comp = desc->comp[c];
78     int plane = comp.plane;
79     int depth = comp.depth_minus1 + 1;
80     int step  = comp.step_minus1 + 1;
81     int flags = desc->flags;
82
83     if (flags & PIX_FMT_BITSTREAM) {
84         int skip = x * step + comp.offset_plus1 - 1;
85         uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
86         int shift = 8 - depth - (skip & 7);
87
88         while (w--) {
89             *p |= *src++ << shift;
90             shift -= step;
91             p -= shift >> 3;
92             shift &= 7;
93         }
94     } else {
95         int shift = comp.shift;
96         uint8_t *p = data[plane] + y * linesize[plane] + x * step + comp.offset_plus1 - 1;
97
98         if (shift + depth <= 8) {
99             p += !!(flags & PIX_FMT_BE);
100             while (w--) {
101                 *p |= (*src++ << shift);
102                 p += step;
103             }
104         } else {
105             while (w--) {
106                 if (flags & PIX_FMT_BE) {
107                     uint16_t val = AV_RB16(p) | (*src++ << shift);
108                     AV_WB16(p, val);
109                 } else {
110                     uint16_t val = AV_RL16(p) | (*src++ << shift);
111                     AV_WL16(p, val);
112                 }
113                 p += step;
114             }
115         }
116     }
117 }
118
119 const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = {
120     [PIX_FMT_YUV420P] = {
121         .name = "yuv420p",
122         .nb_components = 3,
123         .log2_chroma_w = 1,
124         .log2_chroma_h = 1,
125         .comp = {
126             { 0, 0, 1, 0, 7 },        /* Y */
127             { 1, 0, 1, 0, 7 },        /* U */
128             { 2, 0, 1, 0, 7 },        /* V */
129         },
130         .flags = PIX_FMT_PLANAR,
131     },
132     [PIX_FMT_YUYV422] = {
133         .name = "yuyv422",
134         .nb_components = 3,
135         .log2_chroma_w = 1,
136         .log2_chroma_h = 0,
137         .comp = {
138             { 0, 1, 1, 0, 7 },        /* Y */
139             { 0, 3, 2, 0, 7 },        /* U */
140             { 0, 3, 4, 0, 7 },        /* V */
141         },
142     },
143     [PIX_FMT_RGB24] = {
144         .name = "rgb24",
145         .nb_components = 3,
146         .log2_chroma_w = 0,
147         .log2_chroma_h = 0,
148         .comp = {
149             { 0, 2, 1, 0, 7 },        /* R */
150             { 0, 2, 2, 0, 7 },        /* G */
151             { 0, 2, 3, 0, 7 },        /* B */
152         },
153         .flags = PIX_FMT_RGB,
154     },
155     [PIX_FMT_BGR24] = {
156         .name = "bgr24",
157         .nb_components = 3,
158         .log2_chroma_w = 0,
159         .log2_chroma_h = 0,
160         .comp = {
161             { 0, 2, 1, 0, 7 },        /* B */
162             { 0, 2, 2, 0, 7 },        /* G */
163             { 0, 2, 3, 0, 7 },        /* R */
164         },
165         .flags = PIX_FMT_RGB,
166     },
167     [PIX_FMT_YUV422P] = {
168         .name = "yuv422p",
169         .nb_components = 3,
170         .log2_chroma_w = 1,
171         .log2_chroma_h = 0,
172         .comp = {
173             { 0, 0, 1, 0, 7 },        /* Y */
174             { 1, 0, 1, 0, 7 },        /* U */
175             { 2, 0, 1, 0, 7 },        /* V */
176         },
177         .flags = PIX_FMT_PLANAR,
178     },
179     [PIX_FMT_YUV444P] = {
180         .name = "yuv444p",
181         .nb_components = 3,
182         .log2_chroma_w = 0,
183         .log2_chroma_h = 0,
184         .comp = {
185             { 0, 0, 1, 0, 7 },        /* Y */
186             { 1, 0, 1, 0, 7 },        /* U */
187             { 2, 0, 1, 0, 7 },        /* V */
188         },
189         .flags = PIX_FMT_PLANAR,
190     },
191     [PIX_FMT_YUV410P] = {
192         .name = "yuv410p",
193         .nb_components = 3,
194         .log2_chroma_w = 2,
195         .log2_chroma_h = 2,
196         .comp = {
197             { 0, 0, 1, 0, 7 },        /* Y */
198             { 1, 0, 1, 0, 7 },        /* U */
199             { 2, 0, 1, 0, 7 },        /* V */
200         },
201         .flags = PIX_FMT_PLANAR,
202     },
203     [PIX_FMT_YUV411P] = {
204         .name = "yuv411p",
205         .nb_components = 3,
206         .log2_chroma_w = 2,
207         .log2_chroma_h = 0,
208         .comp = {
209             { 0, 0, 1, 0, 7 },        /* Y */
210             { 1, 0, 1, 0, 7 },        /* U */
211             { 2, 0, 1, 0, 7 },        /* V */
212         },
213         .flags = PIX_FMT_PLANAR,
214     },
215     [PIX_FMT_GRAY8] = {
216         .name = "gray",
217         .nb_components = 1,
218         .log2_chroma_w = 0,
219         .log2_chroma_h = 0,
220         .comp = {
221             { 0, 0, 1, 0, 7 },        /* Y */
222         },
223     },
224     [PIX_FMT_MONOWHITE] = {
225         .name = "monow",
226         .nb_components = 1,
227         .log2_chroma_w = 0,
228         .log2_chroma_h = 0,
229         .comp = {
230             { 0, 0, 1, 0, 0 },        /* Y */
231         },
232         .flags = PIX_FMT_BITSTREAM,
233     },
234     [PIX_FMT_MONOBLACK] = {
235         .name = "monob",
236         .nb_components = 1,
237         .log2_chroma_w = 0,
238         .log2_chroma_h = 0,
239         .comp = {
240             { 0, 0, 1, 7, 0 },        /* Y */
241         },
242         .flags = PIX_FMT_BITSTREAM,
243     },
244     [PIX_FMT_PAL8] = {
245         .name = "pal8",
246         .nb_components = 1,
247         .log2_chroma_w = 0,
248         .log2_chroma_h = 0,
249         .comp = {
250             { 0, 0, 1, 0, 7 },
251         },
252         .flags = PIX_FMT_PAL,
253     },
254     [PIX_FMT_YUVJ420P] = {
255         .name = "yuvj420p",
256         .nb_components = 3,
257         .log2_chroma_w = 1,
258         .log2_chroma_h = 1,
259         .comp = {
260             { 0, 0, 1, 0, 7 },        /* Y */
261             { 1, 0, 1, 0, 7 },        /* U */
262             { 2, 0, 1, 0, 7 },        /* V */
263         },
264         .flags = PIX_FMT_PLANAR,
265     },
266     [PIX_FMT_YUVJ422P] = {
267         .name = "yuvj422p",
268         .nb_components = 3,
269         .log2_chroma_w = 1,
270         .log2_chroma_h = 0,
271         .comp = {
272             { 0, 0, 1, 0, 7 },        /* Y */
273             { 1, 0, 1, 0, 7 },        /* U */
274             { 2, 0, 1, 0, 7 },        /* V */
275         },
276         .flags = PIX_FMT_PLANAR,
277     },
278     [PIX_FMT_YUVJ444P] = {
279         .name = "yuvj444p",
280         .nb_components = 3,
281         .log2_chroma_w = 0,
282         .log2_chroma_h = 0,
283         .comp = {
284             {0, 0, 1, 0, 7},        /* Y */
285             {1, 0, 1, 0, 7},        /* U */
286             {2, 0, 1, 0, 7},        /* V */
287         },
288         .flags = PIX_FMT_PLANAR,
289     },
290     [PIX_FMT_XVMC_MPEG2_MC] = {
291         .name = "xvmcmc",
292         .flags = PIX_FMT_HWACCEL,
293     },
294     [PIX_FMT_XVMC_MPEG2_IDCT] = {
295         .name = "xvmcidct",
296         .flags = PIX_FMT_HWACCEL,
297     },
298     [PIX_FMT_UYVY422] = {
299         .name = "uyvy422",
300         .nb_components = 3,
301         .log2_chroma_w = 1,
302         .log2_chroma_h = 0,
303         .comp = {
304             { 0, 1, 2, 0, 7 },        /* Y */
305             { 0, 3, 1, 0, 7 },        /* U */
306             { 0, 3, 3, 0, 7 },        /* V */
307         },
308     },
309     [PIX_FMT_UYYVYY411] = {
310         .name = "uyyvyy411",
311         .nb_components = 3,
312         .log2_chroma_w = 2,
313         .log2_chroma_h = 0,
314         .comp = {
315             { 0, 3, 2, 0, 7 },        /* Y */
316             { 0, 5, 1, 0, 7 },        /* U */
317             { 0, 5, 4, 0, 7 },        /* V */
318         },
319     },
320     [PIX_FMT_BGR8] = {
321         .name = "bgr8",
322         .nb_components = 3,
323         .log2_chroma_w = 0,
324         .log2_chroma_h = 0,
325         .comp = {
326             { 0, 0, 1, 6, 1 },        /* B */
327             { 0, 0, 1, 3, 2 },        /* G */
328             { 0, 0, 1, 0, 2 },        /* R */
329         },
330         .flags = PIX_FMT_PAL | PIX_FMT_RGB,
331     },
332     [PIX_FMT_BGR4] = {
333         .name = "bgr4",
334         .nb_components = 3,
335         .log2_chroma_w = 0,
336         .log2_chroma_h = 0,
337         .comp = {
338             { 0, 3, 1, 0, 0 },        /* B */
339             { 0, 3, 2, 0, 1 },        /* G */
340             { 0, 3, 4, 0, 0 },        /* R */
341         },
342         .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
343     },
344     [PIX_FMT_BGR4_BYTE] = {
345         .name = "bgr4_byte",
346         .nb_components = 3,
347         .log2_chroma_w = 0,
348         .log2_chroma_h = 0,
349         .comp = {
350             { 0, 0, 1, 3, 0 },        /* B */
351             { 0, 0, 1, 1, 1 },        /* G */
352             { 0, 0, 1, 0, 0 },        /* R */
353         },
354         .flags = PIX_FMT_PAL | PIX_FMT_RGB,
355     },
356     [PIX_FMT_RGB8] = {
357         .name = "rgb8",
358         .nb_components = 3,
359         .log2_chroma_w = 0,
360         .log2_chroma_h = 0,
361         .comp = {
362             { 0, 0, 1, 6, 1 },        /* R */
363             { 0, 0, 1, 3, 2 },        /* G */
364             { 0, 0, 1, 0, 2 },        /* B */
365         },
366         .flags = PIX_FMT_PAL | PIX_FMT_RGB,
367     },
368     [PIX_FMT_RGB4] = {
369         .name = "rgb4",
370         .nb_components = 3,
371         .log2_chroma_w = 0,
372         .log2_chroma_h = 0,
373         .comp = {
374             { 0, 3, 1, 0, 0 },        /* R */
375             { 0, 3, 2, 0, 1 },        /* G */
376             { 0, 3, 4, 0, 0 },        /* B */
377         },
378         .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
379     },
380     [PIX_FMT_RGB4_BYTE] = {
381         .name = "rgb4_byte",
382         .nb_components = 3,
383         .log2_chroma_w = 0,
384         .log2_chroma_h = 0,
385         .comp = {
386             { 0, 0, 1, 3, 0 },        /* R */
387             { 0, 0, 1, 1, 1 },        /* G */
388             { 0, 0, 1, 0, 0 },        /* B */
389         },
390         .flags = PIX_FMT_PAL | PIX_FMT_RGB,
391     },
392     [PIX_FMT_NV12] = {
393         .name = "nv12",
394         .nb_components = 3,
395         .log2_chroma_w = 1,
396         .log2_chroma_h = 1,
397         .comp = {
398             { 0,0,1,0,7 },        /* Y */
399             { 1,1,1,0,7 },        /* U */
400             { 1,1,2,0,7 },        /* V */
401         },
402         .flags = PIX_FMT_PLANAR,
403     },
404     [PIX_FMT_NV21] = {
405         .name = "nv21",
406         .nb_components = 3,
407         .log2_chroma_w = 1,
408         .log2_chroma_h = 1,
409         .comp = {
410             { 0, 0, 1, 0, 7 },        /* Y */
411             { 1, 1, 1, 0, 7 },        /* V */
412             { 1, 1, 2, 0, 7 },        /* U */
413         },
414         .flags = PIX_FMT_PLANAR,
415     },
416     [PIX_FMT_ARGB] = {
417         .name = "argb",
418         .nb_components = 4,
419         .log2_chroma_w = 0,
420         .log2_chroma_h = 0,
421         .comp = {
422             { 0, 3, 1, 0, 7 },        /* A */
423             { 0, 3, 2, 0, 7 },        /* R */
424             { 0, 3, 3, 0, 7 },        /* G */
425             { 0, 3, 4, 0, 7 },        /* B */
426         },
427         .flags = PIX_FMT_RGB,
428     },
429     [PIX_FMT_RGBA] = {
430         .name = "rgba",
431         .nb_components = 4,
432         .log2_chroma_w = 0,
433         .log2_chroma_h = 0,
434         .comp = {
435             { 0, 3, 1, 0, 7 },        /* R */
436             { 0, 3, 2, 0, 7 },        /* G */
437             { 0, 3, 3, 0, 7 },        /* B */
438             { 0, 3, 4, 0, 7 },        /* A */
439         },
440         .flags = PIX_FMT_RGB,
441     },
442     [PIX_FMT_ABGR] = {
443         .name = "abgr",
444         .nb_components = 4,
445         .log2_chroma_w = 0,
446         .log2_chroma_h = 0,
447         .comp = {
448             { 0, 3, 1, 0, 7 },        /* A */
449             { 0, 3, 2, 0, 7 },        /* B */
450             { 0, 3, 3, 0, 7 },        /* G */
451             { 0, 3, 4, 0, 7 },        /* R */
452         },
453         .flags = PIX_FMT_RGB,
454     },
455     [PIX_FMT_BGRA] = {
456         .name = "bgra",
457         .nb_components = 4,
458         .log2_chroma_w = 0,
459         .log2_chroma_h = 0,
460         .comp = {
461             { 0, 3, 1, 0, 7 },        /* B */
462             { 0, 3, 2, 0, 7 },        /* G */
463             { 0, 3, 3, 0, 7 },        /* R */
464             { 0, 3, 4, 0, 7 },        /* A */
465         },
466         .flags = PIX_FMT_RGB,
467     },
468     [PIX_FMT_GRAY16BE] = {
469         .name = "gray16be",
470         .nb_components = 1,
471         .log2_chroma_w = 0,
472         .log2_chroma_h = 0,
473         .comp = {
474             { 0, 1, 1, 0, 15 },       /* Y */
475         },
476         .flags = PIX_FMT_BE,
477     },
478     [PIX_FMT_GRAY16LE] = {
479         .name = "gray16le",
480         .nb_components = 1,
481         .log2_chroma_w = 0,
482         .log2_chroma_h = 0,
483         .comp = {
484             { 0, 1, 1, 0, 15 },       /* Y */
485         },
486     },
487     [PIX_FMT_YUV440P] = {
488         .name = "yuv440p",
489         .nb_components = 3,
490         .log2_chroma_w = 0,
491         .log2_chroma_h = 1,
492         .comp = {
493             { 0, 0, 1, 0, 7 },        /* Y */
494             { 1, 0, 1, 0, 7 },        /* U */
495             { 2, 0, 1, 0, 7 },        /* V */
496         },
497         .flags = PIX_FMT_PLANAR,
498     },
499     [PIX_FMT_YUVJ440P] = {
500         .name = "yuvj440p",
501         .nb_components = 3,
502         .log2_chroma_w = 0,
503         .log2_chroma_h = 1,
504         .comp = {
505             { 0, 0, 1, 0, 7 },        /* Y */
506             { 1, 0, 1, 0, 7 },        /* U */
507             { 2, 0, 1, 0, 7 },        /* V */
508         },
509         .flags = PIX_FMT_PLANAR,
510     },
511     [PIX_FMT_YUVA420P] = {
512         .name = "yuva420p",
513         .nb_components = 4,
514         .log2_chroma_w = 1,
515         .log2_chroma_h = 1,
516         .comp = {
517             { 0, 0, 1, 0, 7 },        /* Y */
518             { 1, 0, 1, 0, 7 },        /* U */
519             { 2, 0, 1, 0, 7 },        /* V */
520             { 3, 0, 1, 0, 7 },        /* A */
521         },
522         .flags = PIX_FMT_PLANAR,
523     },
524     [PIX_FMT_YUVA444P] = {
525         .name = "yuva444p",
526         .nb_components = 4,
527         .log2_chroma_w = 0,
528         .log2_chroma_h = 0,
529         .comp = {
530             { 0, 0, 1, 0, 7 },        /* Y */
531             { 1, 0, 1, 0, 7 },        /* U */
532             { 2, 0, 1, 0, 7 },        /* V */
533             { 3, 0, 1, 0, 7 },        /* A */
534         },
535         .flags = PIX_FMT_PLANAR,
536     },
537     [PIX_FMT_VDPAU_H264] = {
538         .name = "vdpau_h264",
539         .log2_chroma_w = 1,
540         .log2_chroma_h = 1,
541         .flags = PIX_FMT_HWACCEL,
542     },
543     [PIX_FMT_VDPAU_MPEG1] = {
544         .name = "vdpau_mpeg1",
545         .log2_chroma_w = 1,
546         .log2_chroma_h = 1,
547         .flags = PIX_FMT_HWACCEL,
548     },
549     [PIX_FMT_VDPAU_MPEG2] = {
550         .name = "vdpau_mpeg2",
551         .log2_chroma_w = 1,
552         .log2_chroma_h = 1,
553         .flags = PIX_FMT_HWACCEL,
554     },
555     [PIX_FMT_VDPAU_WMV3] = {
556         .name = "vdpau_wmv3",
557         .log2_chroma_w = 1,
558         .log2_chroma_h = 1,
559         .flags = PIX_FMT_HWACCEL,
560     },
561     [PIX_FMT_VDPAU_VC1] = {
562         .name = "vdpau_vc1",
563         .log2_chroma_w = 1,
564         .log2_chroma_h = 1,
565         .flags = PIX_FMT_HWACCEL,
566     },
567     [PIX_FMT_VDPAU_MPEG4] = {
568         .name = "vdpau_mpeg4",
569         .log2_chroma_w = 1,
570         .log2_chroma_h = 1,
571         .flags = PIX_FMT_HWACCEL,
572     },
573     [PIX_FMT_RGB48BE] = {
574         .name = "rgb48be",
575         .nb_components = 3,
576         .log2_chroma_w = 0,
577         .log2_chroma_h = 0,
578         .comp = {
579             { 0, 5, 1, 0, 15 },       /* R */
580             { 0, 5, 3, 0, 15 },       /* G */
581             { 0, 5, 5, 0, 15 },       /* B */
582         },
583         .flags = PIX_FMT_RGB | PIX_FMT_BE,
584     },
585     [PIX_FMT_RGB48LE] = {
586         .name = "rgb48le",
587         .nb_components = 3,
588         .log2_chroma_w = 0,
589         .log2_chroma_h = 0,
590         .comp = {
591             { 0, 5, 1, 0, 15 },       /* R */
592             { 0, 5, 3, 0, 15 },       /* G */
593             { 0, 5, 5, 0, 15 },       /* B */
594         },
595         .flags = PIX_FMT_RGB,
596     },
597     [PIX_FMT_RGB565BE] = {
598         .name = "rgb565be",
599         .nb_components = 3,
600         .log2_chroma_w = 0,
601         .log2_chroma_h = 0,
602         .comp = {
603             { 0, 1, 0, 3, 4 },        /* R */
604             { 0, 1, 1, 5, 5 },        /* G */
605             { 0, 1, 1, 0, 4 },        /* B */
606         },
607         .flags = PIX_FMT_BE | PIX_FMT_RGB,
608     },
609     [PIX_FMT_RGB565LE] = {
610         .name = "rgb565le",
611         .nb_components = 3,
612         .log2_chroma_w = 0,
613         .log2_chroma_h = 0,
614         .comp = {
615             { 0, 1, 2, 3, 4 },        /* R */
616             { 0, 1, 1, 5, 5 },        /* G */
617             { 0, 1, 1, 0, 4 },        /* B */
618         },
619         .flags = PIX_FMT_RGB,
620     },
621     [PIX_FMT_RGB555BE] = {
622         .name = "rgb555be",
623         .nb_components = 3,
624         .log2_chroma_w = 0,
625         .log2_chroma_h = 0,
626         .comp = {
627             { 0, 1, 0, 2, 4 },        /* R */
628             { 0, 1, 1, 5, 4 },        /* G */
629             { 0, 1, 1, 0, 4 },        /* B */
630         },
631         .flags = PIX_FMT_BE | PIX_FMT_RGB,
632     },
633     [PIX_FMT_RGB555LE] = {
634         .name = "rgb555le",
635         .nb_components = 3,
636         .log2_chroma_w = 0,
637         .log2_chroma_h = 0,
638         .comp = {
639             { 0, 1, 2, 2, 4 },        /* R */
640             { 0, 1, 1, 5, 4 },        /* G */
641             { 0, 1, 1, 0, 4 },        /* B */
642         },
643         .flags = PIX_FMT_RGB,
644     },
645     [PIX_FMT_RGB444BE] = {
646         .name = "rgb444be",
647         .nb_components = 3,
648         .log2_chroma_w = 0,
649         .log2_chroma_h = 0,
650         .comp = {
651             { 0, 1, 0, 0, 3 },        /* R */
652             { 0, 1, 1, 4, 3 },        /* G */
653             { 0, 1, 1, 0, 3 },        /* B */
654         },
655         .flags = PIX_FMT_BE | PIX_FMT_RGB,
656     },
657     [PIX_FMT_RGB444LE] = {
658         .name = "rgb444le",
659         .nb_components = 3,
660         .log2_chroma_w = 0,
661         .log2_chroma_h = 0,
662         .comp = {
663             { 0, 1, 2, 0, 3 },        /* R */
664             { 0, 1, 1, 4, 3 },        /* G */
665             { 0, 1, 1, 0, 3 },        /* B */
666         },
667         .flags = PIX_FMT_RGB,
668     },
669     [PIX_FMT_BGR48BE] = {
670         .name = "bgr48be",
671         .nb_components = 3,
672         .log2_chroma_w = 0,
673         .log2_chroma_h = 0,
674         .comp = {
675             { 0, 5, 1, 0, 15 },       /* B */
676             { 0, 5, 3, 0, 15 },       /* G */
677             { 0, 5, 5, 0, 15 },       /* R */
678         },
679         .flags = PIX_FMT_BE | PIX_FMT_RGB,
680     },
681     [PIX_FMT_BGR48LE] = {
682         .name = "bgr48le",
683         .nb_components = 3,
684         .log2_chroma_w = 0,
685         .log2_chroma_h = 0,
686         .comp = {
687             { 0, 5, 1, 0, 15 },       /* B */
688             { 0, 5, 3, 0, 15 },       /* G */
689             { 0, 5, 5, 0, 15 },       /* R */
690         },
691         .flags = PIX_FMT_RGB,
692     },
693     [PIX_FMT_BGR565BE] = {
694         .name = "bgr565be",
695         .nb_components = 3,
696         .log2_chroma_w = 0,
697         .log2_chroma_h = 0,
698         .comp = {
699             { 0, 1, 0, 3, 4 },        /* B */
700             { 0, 1, 1, 5, 5 },        /* G */
701             { 0, 1, 1, 0, 4 },        /* R */
702         },
703         .flags = PIX_FMT_BE | PIX_FMT_RGB,
704     },
705     [PIX_FMT_BGR565LE] = {
706         .name = "bgr565le",
707         .nb_components = 3,
708         .log2_chroma_w = 0,
709         .log2_chroma_h = 0,
710         .comp = {
711             { 0, 1, 2, 3, 4 },        /* B */
712             { 0, 1, 1, 5, 5 },        /* G */
713             { 0, 1, 1, 0, 4 },        /* R */
714         },
715         .flags = PIX_FMT_RGB,
716     },
717     [PIX_FMT_BGR555BE] = {
718         .name = "bgr555be",
719         .nb_components = 3,
720         .log2_chroma_w = 0,
721         .log2_chroma_h = 0,
722         .comp = {
723             { 0, 1, 0, 2, 4 },       /* B */
724             { 0, 1, 1, 5, 4 },       /* G */
725             { 0, 1, 1, 0, 4 },       /* R */
726         },
727         .flags = PIX_FMT_BE | PIX_FMT_RGB,
728      },
729     [PIX_FMT_BGR555LE] = {
730         .name = "bgr555le",
731         .nb_components = 3,
732         .log2_chroma_w = 0,
733         .log2_chroma_h = 0,
734         .comp = {
735             { 0, 1, 2, 2, 4 },        /* B */
736             { 0, 1, 1, 5, 4 },        /* G */
737             { 0, 1, 1, 0, 4 },        /* R */
738         },
739         .flags = PIX_FMT_RGB,
740     },
741     [PIX_FMT_BGR444BE] = {
742         .name = "bgr444be",
743         .nb_components = 3,
744         .log2_chroma_w = 0,
745         .log2_chroma_h = 0,
746         .comp = {
747             { 0, 1, 0, 0, 3 },       /* B */
748             { 0, 1, 1, 4, 3 },       /* G */
749             { 0, 1, 1, 0, 3 },       /* R */
750         },
751         .flags = PIX_FMT_BE | PIX_FMT_RGB,
752      },
753     [PIX_FMT_BGR444LE] = {
754         .name = "bgr444le",
755         .nb_components = 3,
756         .log2_chroma_w = 0,
757         .log2_chroma_h = 0,
758         .comp = {
759             { 0, 1, 2, 0, 3 },        /* B */
760             { 0, 1, 1, 4, 3 },        /* G */
761             { 0, 1, 1, 0, 3 },        /* R */
762         },
763         .flags = PIX_FMT_RGB,
764     },
765     [PIX_FMT_VAAPI_MOCO] = {
766         .name = "vaapi_moco",
767         .log2_chroma_w = 1,
768         .log2_chroma_h = 1,
769         .flags = PIX_FMT_HWACCEL,
770     },
771     [PIX_FMT_VAAPI_IDCT] = {
772         .name = "vaapi_idct",
773         .log2_chroma_w = 1,
774         .log2_chroma_h = 1,
775         .flags = PIX_FMT_HWACCEL,
776     },
777     [PIX_FMT_VAAPI_VLD] = {
778         .name = "vaapi_vld",
779         .log2_chroma_w = 1,
780         .log2_chroma_h = 1,
781         .flags = PIX_FMT_HWACCEL,
782     },
783     [PIX_FMT_VDA_VLD] = {
784         .name = "vda_vld",
785         .log2_chroma_w = 1,
786         .log2_chroma_h = 1,
787         .flags = PIX_FMT_HWACCEL,
788     },
789     [PIX_FMT_YUV420P9LE] = {
790         .name = "yuv420p9le",
791         .nb_components = 3,
792         .log2_chroma_w = 1,
793         .log2_chroma_h = 1,
794         .comp = {
795             { 0, 1, 1, 0, 8 },        /* Y */
796             { 1, 1, 1, 0, 8 },        /* U */
797             { 2, 1, 1, 0, 8 },        /* V */
798         },
799         .flags = PIX_FMT_PLANAR,
800     },
801     [PIX_FMT_YUV420P9BE] = {
802         .name = "yuv420p9be",
803         .nb_components = 3,
804         .log2_chroma_w = 1,
805         .log2_chroma_h = 1,
806         .comp = {
807             { 0, 1, 1, 0, 8 },        /* Y */
808             { 1, 1, 1, 0, 8 },        /* U */
809             { 2, 1, 1, 0, 8 },        /* V */
810         },
811         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
812     },
813     [PIX_FMT_YUV420P10LE] = {
814         .name = "yuv420p10le",
815         .nb_components = 3,
816         .log2_chroma_w = 1,
817         .log2_chroma_h = 1,
818         .comp = {
819             { 0, 1, 1, 0, 9 },        /* Y */
820             { 1, 1, 1, 0, 9 },        /* U */
821             { 2, 1, 1, 0, 9 },        /* V */
822         },
823         .flags = PIX_FMT_PLANAR,
824     },
825     [PIX_FMT_YUV420P10BE] = {
826         .name = "yuv420p10be",
827         .nb_components = 3,
828         .log2_chroma_w = 1,
829         .log2_chroma_h = 1,
830         .comp = {
831             { 0, 1, 1, 0, 9 },        /* Y */
832             { 1, 1, 1, 0, 9 },        /* U */
833             { 2, 1, 1, 0, 9 },        /* V */
834         },
835         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
836     },
837     [PIX_FMT_YUV420P16LE] = {
838         .name = "yuv420p16le",
839         .nb_components = 3,
840         .log2_chroma_w = 1,
841         .log2_chroma_h = 1,
842         .comp = {
843             { 0, 1, 1, 0, 15 },        /* Y */
844             { 1, 1, 1, 0, 15 },        /* U */
845             { 2, 1, 1, 0, 15 },        /* V */
846         },
847         .flags = PIX_FMT_PLANAR,
848     },
849     [PIX_FMT_YUV420P16BE] = {
850         .name = "yuv420p16be",
851         .nb_components = 3,
852         .log2_chroma_w = 1,
853         .log2_chroma_h = 1,
854         .comp = {
855             { 0, 1, 1, 0, 15 },        /* Y */
856             { 1, 1, 1, 0, 15 },        /* U */
857             { 2, 1, 1, 0, 15 },        /* V */
858         },
859         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
860     },
861     [PIX_FMT_YUV422P9LE] = {
862         .name = "yuv422p9le",
863         .nb_components = 3,
864         .log2_chroma_w = 1,
865         .log2_chroma_h = 0,
866         .comp = {
867             { 0, 1, 1, 0, 8 },        /* Y */
868             { 1, 1, 1, 0, 8 },        /* U */
869             { 2, 1, 1, 0, 8 },        /* V */
870         },
871         .flags = PIX_FMT_PLANAR,
872     },
873     [PIX_FMT_YUV422P9BE] = {
874         .name = "yuv422p9be",
875         .nb_components = 3,
876         .log2_chroma_w = 1,
877         .log2_chroma_h = 0,
878         .comp = {
879             {0,1,1,0,8},        /* Y */
880             {1,1,1,0,8},        /* U */
881             {2,1,1,0,8},        /* V */
882         },
883         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
884     },
885     [PIX_FMT_YUV422P10LE] = {
886         .name = "yuv422p10le",
887         .nb_components = 3,
888         .log2_chroma_w = 1,
889         .log2_chroma_h = 0,
890         .comp = {
891             { 0, 1, 1, 0, 9 },        /* Y */
892             { 1, 1, 1, 0, 9 },        /* U */
893             { 2, 1, 1, 0, 9 },        /* V */
894         },
895         .flags = PIX_FMT_PLANAR,
896     },
897     [PIX_FMT_YUV422P10BE] = {
898         .name = "yuv422p10be",
899         .nb_components = 3,
900         .log2_chroma_w = 1,
901         .log2_chroma_h = 0,
902         .comp = {
903             { 0, 1, 1, 0, 9 },        /* Y */
904             { 1, 1, 1, 0, 9 },        /* U */
905             { 2, 1, 1, 0, 9 },        /* V */
906         },
907         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
908     },
909     [PIX_FMT_YUV422P16LE] = {
910         .name = "yuv422p16le",
911         .nb_components = 3,
912         .log2_chroma_w = 1,
913         .log2_chroma_h = 0,
914         .comp = {
915             { 0, 1, 1, 0, 15 },        /* Y */
916             { 1, 1, 1, 0, 15 },        /* U */
917             { 2, 1, 1, 0, 15 },        /* V */
918         },
919         .flags = PIX_FMT_PLANAR,
920     },
921     [PIX_FMT_YUV422P16BE] = {
922         .name = "yuv422p16be",
923         .nb_components = 3,
924         .log2_chroma_w = 1,
925         .log2_chroma_h = 0,
926         .comp = {
927             { 0, 1, 1, 0, 15 },        /* Y */
928             { 1, 1, 1, 0, 15 },        /* U */
929             { 2, 1, 1, 0, 15 },        /* V */
930         },
931         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
932     },
933     [PIX_FMT_YUV444P16LE] = {
934         .name = "yuv444p16le",
935         .nb_components = 3,
936         .log2_chroma_w = 0,
937         .log2_chroma_h = 0,
938         .comp = {
939             { 0, 1, 1, 0, 15 },        /* Y */
940             { 1, 1, 1, 0, 15 },        /* U */
941             { 2, 1, 1, 0, 15 },        /* V */
942         },
943         .flags = PIX_FMT_PLANAR,
944     },
945     [PIX_FMT_YUV444P16BE] = {
946         .name = "yuv444p16be",
947         .nb_components = 3,
948         .log2_chroma_w = 0,
949         .log2_chroma_h = 0,
950         .comp = {
951             { 0, 1, 1, 0, 15 },        /* Y */
952             { 1, 1, 1, 0, 15 },        /* U */
953             { 2, 1, 1, 0, 15 },        /* V */
954         },
955         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
956     },
957     [PIX_FMT_YUV444P10LE] = {
958         .name = "yuv444p10le",
959         .nb_components = 3,
960         .log2_chroma_w = 0,
961         .log2_chroma_h = 0,
962         .comp = {
963             { 0, 1, 1, 0, 9 },        /* Y */
964             { 1, 1, 1, 0, 9 },        /* U */
965             { 2, 1, 1, 0, 9 },        /* V */
966         },
967         .flags = PIX_FMT_PLANAR,
968     },
969     [PIX_FMT_YUV444P10BE] = {
970         .name = "yuv444p10be",
971         .nb_components = 3,
972         .log2_chroma_w = 0,
973         .log2_chroma_h = 0,
974         .comp = {
975             { 0, 1, 1, 0, 9 },        /* Y */
976             { 1, 1, 1, 0, 9 },        /* U */
977             { 2, 1, 1, 0, 9 },        /* V */
978         },
979         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
980     },
981     [PIX_FMT_YUV444P9LE] = {
982         .name = "yuv444p9le",
983         .nb_components = 3,
984         .log2_chroma_w = 0,
985         .log2_chroma_h = 0,
986         .comp = {
987             { 0, 1, 1, 0, 8 },        /* Y */
988             { 1, 1, 1, 0, 8 },        /* U */
989             { 2, 1, 1, 0, 8 },        /* V */
990         },
991         .flags = PIX_FMT_PLANAR,
992     },
993     [PIX_FMT_YUV444P9BE] = {
994         .name = "yuv444p9be",
995         .nb_components = 3,
996         .log2_chroma_w = 0,
997         .log2_chroma_h = 0,
998         .comp = {
999             { 0, 1, 1, 0, 8 },        /* Y */
1000             { 1, 1, 1, 0, 8 },        /* U */
1001             { 2, 1, 1, 0, 8 },        /* V */
1002         },
1003         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1004     },
1005     [PIX_FMT_DXVA2_VLD] = {
1006         .name = "dxva2_vld",
1007         .log2_chroma_w = 1,
1008         .log2_chroma_h = 1,
1009         .flags = PIX_FMT_HWACCEL,
1010     },
1011     [PIX_FMT_Y400A] = {
1012         .name = "y400a",
1013         .nb_components = 2,
1014         .comp = {
1015             { 0, 1, 1, 0, 7 },        /* Y */
1016             { 0, 1, 2, 0, 7 },        /* A */
1017         },
1018     },
1019     [PIX_FMT_GBRP] = {
1020         .name = "gbrp",
1021         .nb_components = 3,
1022         .log2_chroma_w = 0,
1023         .log2_chroma_h = 0,
1024         .comp = {
1025             { 0, 0, 1, 0, 7 },        /* G */
1026             { 1, 0, 1, 0, 7 },        /* B */
1027             { 2, 0, 1, 0, 7 },        /* R */
1028         },
1029         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1030     },
1031     [PIX_FMT_GBRP9LE] = {
1032         .name = "gbrp9le",
1033         .nb_components = 3,
1034         .log2_chroma_w = 0,
1035         .log2_chroma_h = 0,
1036         .comp = {
1037             { 0, 1, 1, 0, 8 },        /* G */
1038             { 1, 1, 1, 0, 8 },        /* B */
1039             { 2, 1, 1, 0, 8 },        /* R */
1040         },
1041         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1042     },
1043     [PIX_FMT_GBRP9BE] = {
1044         .name = "gbrp9be",
1045         .nb_components = 3,
1046         .log2_chroma_w = 0,
1047         .log2_chroma_h = 0,
1048         .comp = {
1049             { 0, 1, 1, 0, 8 },        /* G */
1050             { 1, 1, 1, 0, 8 },        /* B */
1051             { 2, 1, 1, 0, 8 },        /* R */
1052         },
1053         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1054     },
1055     [PIX_FMT_GBRP10LE] = {
1056         .name = "gbrp10le",
1057         .nb_components = 3,
1058         .log2_chroma_w = 0,
1059         .log2_chroma_h = 0,
1060         .comp = {
1061             { 0, 1, 1, 0, 9 },        /* G */
1062             { 1, 1, 1, 0, 9 },        /* B */
1063             { 2, 1, 1, 0, 9 },        /* R */
1064         },
1065         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1066     },
1067     [PIX_FMT_GBRP10BE] = {
1068         .name = "gbrp10be",
1069         .nb_components = 3,
1070         .log2_chroma_w = 0,
1071         .log2_chroma_h = 0,
1072         .comp = {
1073             { 0, 1, 1, 0, 9 },        /* G */
1074             { 1, 1, 1, 0, 9 },        /* B */
1075             { 2, 1, 1, 0, 9 },        /* R */
1076         },
1077         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1078     },
1079     [PIX_FMT_GBRP16LE] = {
1080         .name = "gbrp16le",
1081         .nb_components = 3,
1082         .log2_chroma_w = 0,
1083         .log2_chroma_h = 0,
1084         .comp = {
1085             { 0, 1, 1, 0, 15 },       /* G */
1086             { 1, 1, 1, 0, 15 },       /* B */
1087             { 2, 1, 1, 0, 15 },       /* R */
1088         },
1089         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1090     },
1091     [PIX_FMT_GBRP16BE] = {
1092         .name = "gbrp16be",
1093         .nb_components = 3,
1094         .log2_chroma_w = 0,
1095         .log2_chroma_h = 0,
1096         .comp = {
1097             { 0, 1, 1, 0, 15 },       /* G */
1098             { 1, 1, 1, 0, 15 },       /* B */
1099             { 2, 1, 1, 0, 15 },       /* R */
1100         },
1101         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1102     },
1103 };
1104
1105 static enum PixelFormat get_pix_fmt_internal(const char *name)
1106 {
1107     enum PixelFormat pix_fmt;
1108
1109     for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
1110         if (av_pix_fmt_descriptors[pix_fmt].name &&
1111             !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1112             return pix_fmt;
1113
1114     return PIX_FMT_NONE;
1115 }
1116
1117 const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt)
1118 {
1119     return (unsigned)pix_fmt < PIX_FMT_NB ?
1120         av_pix_fmt_descriptors[pix_fmt].name : NULL;
1121 }
1122
1123 #if HAVE_BIGENDIAN
1124 #   define X_NE(be, le) be
1125 #else
1126 #   define X_NE(be, le) le
1127 #endif
1128
1129 enum PixelFormat av_get_pix_fmt(const char *name)
1130 {
1131     enum PixelFormat pix_fmt;
1132
1133     if (!strcmp(name, "rgb32"))
1134         name = X_NE("argb", "bgra");
1135     else if (!strcmp(name, "bgr32"))
1136         name = X_NE("abgr", "rgba");
1137
1138     pix_fmt = get_pix_fmt_internal(name);
1139     if (pix_fmt == PIX_FMT_NONE) {
1140         char name2[32];
1141
1142         snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1143         pix_fmt = get_pix_fmt_internal(name2);
1144     }
1145     return pix_fmt;
1146 }
1147
1148 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1149 {
1150     int c, bits = 0;
1151     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1152
1153     for (c = 0; c < pixdesc->nb_components; c++) {
1154         int s = c == 1 || c == 2 ? 0 : log2_pixels;
1155         bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1156     }
1157
1158     return bits >> log2_pixels;
1159 }
1160
1161 char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
1162 {
1163     /* print header */
1164     if (pix_fmt < 0) {
1165        snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1166     } else {
1167         const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1168         snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1169                  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1170     }
1171
1172     return buf;
1173 }