Cleaned pixdesc.c file in libavutil
[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_VDPAU_H264] = {
525         .name = "vdpau_h264",
526         .log2_chroma_w = 1,
527         .log2_chroma_h = 1,
528         .flags = PIX_FMT_HWACCEL,
529     },
530     [PIX_FMT_VDPAU_MPEG1] = {
531         .name = "vdpau_mpeg1",
532         .log2_chroma_w = 1,
533         .log2_chroma_h = 1,
534         .flags = PIX_FMT_HWACCEL,
535     },
536     [PIX_FMT_VDPAU_MPEG2] = {
537         .name = "vdpau_mpeg2",
538         .log2_chroma_w = 1,
539         .log2_chroma_h = 1,
540         .flags = PIX_FMT_HWACCEL,
541     },
542     [PIX_FMT_VDPAU_WMV3] = {
543         .name = "vdpau_wmv3",
544         .log2_chroma_w = 1,
545         .log2_chroma_h = 1,
546         .flags = PIX_FMT_HWACCEL,
547     },
548     [PIX_FMT_VDPAU_VC1] = {
549         .name = "vdpau_vc1",
550         .log2_chroma_w = 1,
551         .log2_chroma_h = 1,
552         .flags = PIX_FMT_HWACCEL,
553     },
554     [PIX_FMT_VDPAU_MPEG4] = {
555         .name = "vdpau_mpeg4",
556         .log2_chroma_w = 1,
557         .log2_chroma_h = 1,
558         .flags = PIX_FMT_HWACCEL,
559     },
560     [PIX_FMT_RGB48BE] = {
561         .name = "rgb48be",
562         .nb_components = 3,
563         .log2_chroma_w = 0,
564         .log2_chroma_h = 0,
565         .comp = {
566             { 0, 5, 1, 0, 15 },       /* R */
567             { 0, 5, 3, 0, 15 },       /* G */
568             { 0, 5, 5, 0, 15 },       /* B */
569         },
570         .flags = PIX_FMT_RGB | PIX_FMT_BE,
571     },
572     [PIX_FMT_RGB48LE] = {
573         .name = "rgb48le",
574         .nb_components = 3,
575         .log2_chroma_w = 0,
576         .log2_chroma_h = 0,
577         .comp = {
578             { 0, 5, 1, 0, 15 },       /* R */
579             { 0, 5, 3, 0, 15 },       /* G */
580             { 0, 5, 5, 0, 15 },       /* B */
581         },
582         .flags = PIX_FMT_RGB,
583     },
584     [PIX_FMT_RGB565BE] = {
585         .name = "rgb565be",
586         .nb_components = 3,
587         .log2_chroma_w = 0,
588         .log2_chroma_h = 0,
589         .comp = {
590             { 0, 1, 0, 3, 4 },        /* R */
591             { 0, 1, 1, 5, 5 },        /* G */
592             { 0, 1, 1, 0, 4 },        /* B */
593         },
594         .flags = PIX_FMT_BE | PIX_FMT_RGB,
595     },
596     [PIX_FMT_RGB565LE] = {
597         .name = "rgb565le",
598         .nb_components = 3,
599         .log2_chroma_w = 0,
600         .log2_chroma_h = 0,
601         .comp = {
602             { 0, 1, 2, 3, 4 },        /* R */
603             { 0, 1, 1, 5, 5 },        /* G */
604             { 0, 1, 1, 0, 4 },        /* B */
605         },
606         .flags = PIX_FMT_RGB,
607     },
608     [PIX_FMT_RGB555BE] = {
609         .name = "rgb555be",
610         .nb_components = 3,
611         .log2_chroma_w = 0,
612         .log2_chroma_h = 0,
613         .comp = {
614             { 0, 1, 0, 2, 4 },        /* R */
615             { 0, 1, 1, 5, 4 },        /* G */
616             { 0, 1, 1, 0, 4 },        /* B */
617         },
618         .flags = PIX_FMT_BE | PIX_FMT_RGB,
619     },
620     [PIX_FMT_RGB555LE] = {
621         .name = "rgb555le",
622         .nb_components = 3,
623         .log2_chroma_w = 0,
624         .log2_chroma_h = 0,
625         .comp = {
626             { 0, 1, 2, 2, 4 },        /* R */
627             { 0, 1, 1, 5, 4 },        /* G */
628             { 0, 1, 1, 0, 4 },        /* B */
629         },
630         .flags = PIX_FMT_RGB,
631     },
632     [PIX_FMT_RGB444BE] = {
633         .name = "rgb444be",
634         .nb_components = 3,
635         .log2_chroma_w = 0,
636         .log2_chroma_h = 0,
637         .comp = {
638             { 0, 1, 0, 0, 3 },        /* R */
639             { 0, 1, 1, 4, 3 },        /* G */
640             { 0, 1, 1, 0, 3 },        /* B */
641         },
642         .flags = PIX_FMT_BE | PIX_FMT_RGB,
643     },
644     [PIX_FMT_RGB444LE] = {
645         .name = "rgb444le",
646         .nb_components = 3,
647         .log2_chroma_w = 0,
648         .log2_chroma_h = 0,
649         .comp = {
650             { 0, 1, 2, 0, 3 },        /* R */
651             { 0, 1, 1, 4, 3 },        /* G */
652             { 0, 1, 1, 0, 3 },        /* B */
653         },
654         .flags = PIX_FMT_RGB,
655     },
656     [PIX_FMT_BGR48BE] = {
657         .name = "bgr48be",
658         .nb_components = 3,
659         .log2_chroma_w = 0,
660         .log2_chroma_h = 0,
661         .comp = {
662             { 0, 5, 1, 0, 15 },       /* B */
663             { 0, 5, 3, 0, 15 },       /* G */
664             { 0, 5, 5, 0, 15 },       /* R */
665         },
666         .flags = PIX_FMT_BE | PIX_FMT_RGB,
667     },
668     [PIX_FMT_BGR48LE] = {
669         .name = "bgr48le",
670         .nb_components = 3,
671         .log2_chroma_w = 0,
672         .log2_chroma_h = 0,
673         .comp = {
674             { 0, 5, 1, 0, 15 },       /* B */
675             { 0, 5, 3, 0, 15 },       /* G */
676             { 0, 5, 5, 0, 15 },       /* R */
677         },
678         .flags = PIX_FMT_RGB,
679     },
680     [PIX_FMT_BGR565BE] = {
681         .name = "bgr565be",
682         .nb_components = 3,
683         .log2_chroma_w = 0,
684         .log2_chroma_h = 0,
685         .comp = {
686             { 0, 1, 0, 3, 4 },        /* B */
687             { 0, 1, 1, 5, 5 },        /* G */
688             { 0, 1, 1, 0, 4 },        /* R */
689         },
690         .flags = PIX_FMT_BE | PIX_FMT_RGB,
691     },
692     [PIX_FMT_BGR565LE] = {
693         .name = "bgr565le",
694         .nb_components = 3,
695         .log2_chroma_w = 0,
696         .log2_chroma_h = 0,
697         .comp = {
698             { 0, 1, 2, 3, 4 },        /* B */
699             { 0, 1, 1, 5, 5 },        /* G */
700             { 0, 1, 1, 0, 4 },        /* R */
701         },
702         .flags = PIX_FMT_RGB,
703     },
704     [PIX_FMT_BGR555BE] = {
705         .name = "bgr555be",
706         .nb_components = 3,
707         .log2_chroma_w = 0,
708         .log2_chroma_h = 0,
709         .comp = {
710             { 0, 1, 0, 2, 4 },       /* B */
711             { 0, 1, 1, 5, 4 },       /* G */
712             { 0, 1, 1, 0, 4 },       /* R */
713         },
714         .flags = PIX_FMT_BE | PIX_FMT_RGB,
715      },
716     [PIX_FMT_BGR555LE] = {
717         .name = "bgr555le",
718         .nb_components = 3,
719         .log2_chroma_w = 0,
720         .log2_chroma_h = 0,
721         .comp = {
722             { 0, 1, 2, 2, 4 },        /* B */
723             { 0, 1, 1, 5, 4 },        /* G */
724             { 0, 1, 1, 0, 4 },        /* R */
725         },
726         .flags = PIX_FMT_RGB,
727     },
728     [PIX_FMT_BGR444BE] = {
729         .name = "bgr444be",
730         .nb_components = 3,
731         .log2_chroma_w = 0,
732         .log2_chroma_h = 0,
733         .comp = {
734             { 0, 1, 0, 0, 3 },       /* B */
735             { 0, 1, 1, 4, 3 },       /* G */
736             { 0, 1, 1, 0, 3 },       /* R */
737         },
738         .flags = PIX_FMT_BE | PIX_FMT_RGB,
739      },
740     [PIX_FMT_BGR444LE] = {
741         .name = "bgr444le",
742         .nb_components = 3,
743         .log2_chroma_w = 0,
744         .log2_chroma_h = 0,
745         .comp = {
746             { 0, 1, 2, 0, 3 },        /* B */
747             { 0, 1, 1, 4, 3 },        /* G */
748             { 0, 1, 1, 0, 3 },        /* R */
749         },
750         .flags = PIX_FMT_RGB,
751     },
752     [PIX_FMT_VAAPI_MOCO] = {
753         .name = "vaapi_moco",
754         .log2_chroma_w = 1,
755         .log2_chroma_h = 1,
756         .flags = PIX_FMT_HWACCEL,
757     },
758     [PIX_FMT_VAAPI_IDCT] = {
759         .name = "vaapi_idct",
760         .log2_chroma_w = 1,
761         .log2_chroma_h = 1,
762         .flags = PIX_FMT_HWACCEL,
763     },
764     [PIX_FMT_VAAPI_VLD] = {
765         .name = "vaapi_vld",
766         .log2_chroma_w = 1,
767         .log2_chroma_h = 1,
768         .flags = PIX_FMT_HWACCEL,
769     },
770     [PIX_FMT_VDA_VLD] = {
771         .name = "vda_vld",
772         .log2_chroma_w = 1,
773         .log2_chroma_h = 1,
774         .flags = PIX_FMT_HWACCEL,
775     },
776     [PIX_FMT_YUV420P9LE] = {
777         .name = "yuv420p9le",
778         .nb_components = 3,
779         .log2_chroma_w = 1,
780         .log2_chroma_h = 1,
781         .comp = {
782             { 0, 1, 1, 0, 8 },        /* Y */
783             { 1, 1, 1, 0, 8 },        /* U */
784             { 2, 1, 1, 0, 8 },        /* V */
785         },
786         .flags = PIX_FMT_PLANAR,
787     },
788     [PIX_FMT_YUV420P9BE] = {
789         .name = "yuv420p9be",
790         .nb_components = 3,
791         .log2_chroma_w = 1,
792         .log2_chroma_h = 1,
793         .comp = {
794             { 0, 1, 1, 0, 8 },        /* Y */
795             { 1, 1, 1, 0, 8 },        /* U */
796             { 2, 1, 1, 0, 8 },        /* V */
797         },
798         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
799     },
800     [PIX_FMT_YUV420P10LE] = {
801         .name = "yuv420p10le",
802         .nb_components = 3,
803         .log2_chroma_w = 1,
804         .log2_chroma_h = 1,
805         .comp = {
806             { 0, 1, 1, 0, 9 },        /* Y */
807             { 1, 1, 1, 0, 9 },        /* U */
808             { 2, 1, 1, 0, 9 },        /* V */
809         },
810         .flags = PIX_FMT_PLANAR,
811     },
812     [PIX_FMT_YUV420P10BE] = {
813         .name = "yuv420p10be",
814         .nb_components = 3,
815         .log2_chroma_w = 1,
816         .log2_chroma_h = 1,
817         .comp = {
818             { 0, 1, 1, 0, 9 },        /* Y */
819             { 1, 1, 1, 0, 9 },        /* U */
820             { 2, 1, 1, 0, 9 },        /* V */
821         },
822         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
823     },
824     [PIX_FMT_YUV420P16LE] = {
825         .name = "yuv420p16le",
826         .nb_components = 3,
827         .log2_chroma_w = 1,
828         .log2_chroma_h = 1,
829         .comp = {
830             { 0, 1, 1, 0, 15 },        /* Y */
831             { 1, 1, 1, 0, 15 },        /* U */
832             { 2, 1, 1, 0, 15 },        /* V */
833         },
834         .flags = PIX_FMT_PLANAR,
835     },
836     [PIX_FMT_YUV420P16BE] = {
837         .name = "yuv420p16be",
838         .nb_components = 3,
839         .log2_chroma_w = 1,
840         .log2_chroma_h = 1,
841         .comp = {
842             { 0, 1, 1, 0, 15 },        /* Y */
843             { 1, 1, 1, 0, 15 },        /* U */
844             { 2, 1, 1, 0, 15 },        /* V */
845         },
846         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
847     },
848     [PIX_FMT_YUV422P9LE] = {
849         .name = "yuv422p9le",
850         .nb_components = 3,
851         .log2_chroma_w = 1,
852         .log2_chroma_h = 0,
853         .comp = {
854             { 0, 1, 1, 0, 8 },        /* Y */
855             { 1, 1, 1, 0, 8 },        /* U */
856             { 2, 1, 1, 0, 8 },        /* V */
857         },
858         .flags = PIX_FMT_PLANAR,
859     },
860     [PIX_FMT_YUV422P9BE] = {
861         .name = "yuv422p9be",
862         .nb_components = 3,
863         .log2_chroma_w = 1,
864         .log2_chroma_h = 0,
865         .comp = {
866             {0,1,1,0,8},        /* Y */
867             {1,1,1,0,8},        /* U */
868             {2,1,1,0,8},        /* V */
869         },
870         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
871     },
872     [PIX_FMT_YUV422P10LE] = {
873         .name = "yuv422p10le",
874         .nb_components = 3,
875         .log2_chroma_w = 1,
876         .log2_chroma_h = 0,
877         .comp = {
878             { 0, 1, 1, 0, 9 },        /* Y */
879             { 1, 1, 1, 0, 9 },        /* U */
880             { 2, 1, 1, 0, 9 },        /* V */
881         },
882         .flags = PIX_FMT_PLANAR,
883     },
884     [PIX_FMT_YUV422P10BE] = {
885         .name = "yuv422p10be",
886         .nb_components = 3,
887         .log2_chroma_w = 1,
888         .log2_chroma_h = 0,
889         .comp = {
890             { 0, 1, 1, 0, 9 },        /* Y */
891             { 1, 1, 1, 0, 9 },        /* U */
892             { 2, 1, 1, 0, 9 },        /* V */
893         },
894         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
895     },
896     [PIX_FMT_YUV422P16LE] = {
897         .name = "yuv422p16le",
898         .nb_components = 3,
899         .log2_chroma_w = 1,
900         .log2_chroma_h = 0,
901         .comp = {
902             { 0, 1, 1, 0, 15 },        /* Y */
903             { 1, 1, 1, 0, 15 },        /* U */
904             { 2, 1, 1, 0, 15 },        /* V */
905         },
906         .flags = PIX_FMT_PLANAR,
907     },
908     [PIX_FMT_YUV422P16BE] = {
909         .name = "yuv422p16be",
910         .nb_components = 3,
911         .log2_chroma_w = 1,
912         .log2_chroma_h = 0,
913         .comp = {
914             { 0, 1, 1, 0, 15 },        /* Y */
915             { 1, 1, 1, 0, 15 },        /* U */
916             { 2, 1, 1, 0, 15 },        /* V */
917         },
918         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
919     },
920     [PIX_FMT_YUV444P16LE] = {
921         .name = "yuv444p16le",
922         .nb_components = 3,
923         .log2_chroma_w = 0,
924         .log2_chroma_h = 0,
925         .comp = {
926             { 0, 1, 1, 0, 15 },        /* Y */
927             { 1, 1, 1, 0, 15 },        /* U */
928             { 2, 1, 1, 0, 15 },        /* V */
929         },
930         .flags = PIX_FMT_PLANAR,
931     },
932     [PIX_FMT_YUV444P16BE] = {
933         .name = "yuv444p16be",
934         .nb_components = 3,
935         .log2_chroma_w = 0,
936         .log2_chroma_h = 0,
937         .comp = {
938             { 0, 1, 1, 0, 15 },        /* Y */
939             { 1, 1, 1, 0, 15 },        /* U */
940             { 2, 1, 1, 0, 15 },        /* V */
941         },
942         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
943     },
944     [PIX_FMT_YUV444P10LE] = {
945         .name = "yuv444p10le",
946         .nb_components = 3,
947         .log2_chroma_w = 0,
948         .log2_chroma_h = 0,
949         .comp = {
950             { 0, 1, 1, 0, 9 },        /* Y */
951             { 1, 1, 1, 0, 9 },        /* U */
952             { 2, 1, 1, 0, 9 },        /* V */
953         },
954         .flags = PIX_FMT_PLANAR,
955     },
956     [PIX_FMT_YUV444P10BE] = {
957         .name = "yuv444p10be",
958         .nb_components = 3,
959         .log2_chroma_w = 0,
960         .log2_chroma_h = 0,
961         .comp = {
962             { 0, 1, 1, 0, 9 },        /* Y */
963             { 1, 1, 1, 0, 9 },        /* U */
964             { 2, 1, 1, 0, 9 },        /* V */
965         },
966         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
967     },
968     [PIX_FMT_YUV444P9LE] = {
969         .name = "yuv444p9le",
970         .nb_components = 3,
971         .log2_chroma_w = 0,
972         .log2_chroma_h = 0,
973         .comp = {
974             { 0, 1, 1, 0, 8 },        /* Y */
975             { 1, 1, 1, 0, 8 },        /* U */
976             { 2, 1, 1, 0, 8 },        /* V */
977         },
978         .flags = PIX_FMT_PLANAR,
979     },
980     [PIX_FMT_YUV444P9BE] = {
981         .name = "yuv444p9be",
982         .nb_components = 3,
983         .log2_chroma_w = 0,
984         .log2_chroma_h = 0,
985         .comp = {
986             { 0, 1, 1, 0, 8 },        /* Y */
987             { 1, 1, 1, 0, 8 },        /* U */
988             { 2, 1, 1, 0, 8 },        /* V */
989         },
990         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
991     },
992     [PIX_FMT_DXVA2_VLD] = {
993         .name = "dxva2_vld",
994         .log2_chroma_w = 1,
995         .log2_chroma_h = 1,
996         .flags = PIX_FMT_HWACCEL,
997     },
998     [PIX_FMT_Y400A] = {
999         .name = "y400a",
1000         .nb_components = 2,
1001         .comp = {
1002             { 0, 1, 1, 0, 7 },        /* Y */
1003             { 0, 1, 2, 0, 7 },        /* A */
1004         },
1005     },
1006     [PIX_FMT_GBRP] = {
1007         .name = "gbrp",
1008         .nb_components = 3,
1009         .log2_chroma_w = 0,
1010         .log2_chroma_h = 0,
1011         .comp = {
1012             { 0, 0, 1, 0, 7 },        /* G */
1013             { 1, 0, 1, 0, 7 },        /* B */
1014             { 2, 0, 1, 0, 7 },        /* R */
1015         },
1016         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1017     },
1018     [PIX_FMT_GBRP9LE] = {
1019         .name = "gbrp9le",
1020         .nb_components = 3,
1021         .log2_chroma_w = 0,
1022         .log2_chroma_h = 0,
1023         .comp = {
1024             { 0, 1, 1, 0, 8 },        /* G */
1025             { 1, 1, 1, 0, 8 },        /* B */
1026             { 2, 1, 1, 0, 8 },        /* R */
1027         },
1028         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1029     },
1030     [PIX_FMT_GBRP9BE] = {
1031         .name = "gbrp9be",
1032         .nb_components = 3,
1033         .log2_chroma_w = 0,
1034         .log2_chroma_h = 0,
1035         .comp = {
1036             { 0, 1, 1, 0, 8 },        /* G */
1037             { 1, 1, 1, 0, 8 },        /* B */
1038             { 2, 1, 1, 0, 8 },        /* R */
1039         },
1040         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1041     },
1042     [PIX_FMT_GBRP10LE] = {
1043         .name = "gbrp10le",
1044         .nb_components = 3,
1045         .log2_chroma_w = 0,
1046         .log2_chroma_h = 0,
1047         .comp = {
1048             { 0, 1, 1, 0, 9 },        /* G */
1049             { 1, 1, 1, 0, 9 },        /* B */
1050             { 2, 1, 1, 0, 9 },        /* R */
1051         },
1052         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1053     },
1054     [PIX_FMT_GBRP10BE] = {
1055         .name = "gbrp10be",
1056         .nb_components = 3,
1057         .log2_chroma_w = 0,
1058         .log2_chroma_h = 0,
1059         .comp = {
1060             { 0, 1, 1, 0, 9 },        /* G */
1061             { 1, 1, 1, 0, 9 },        /* B */
1062             { 2, 1, 1, 0, 9 },        /* R */
1063         },
1064         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1065     },
1066     [PIX_FMT_GBRP16LE] = {
1067         .name = "gbrp16le",
1068         .nb_components = 3,
1069         .log2_chroma_w = 0,
1070         .log2_chroma_h = 0,
1071         .comp = {
1072             { 0, 1, 1, 0, 15 },       /* G */
1073             { 1, 1, 1, 0, 15 },       /* B */
1074             { 2, 1, 1, 0, 15 },       /* R */
1075         },
1076         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1077     },
1078     [PIX_FMT_GBRP16BE] = {
1079         .name = "gbrp16be",
1080         .nb_components = 3,
1081         .log2_chroma_w = 0,
1082         .log2_chroma_h = 0,
1083         .comp = {
1084             { 0, 1, 1, 0, 15 },       /* G */
1085             { 1, 1, 1, 0, 15 },       /* B */
1086             { 2, 1, 1, 0, 15 },       /* R */
1087         },
1088         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1089     },
1090 };
1091
1092 static enum PixelFormat get_pix_fmt_internal(const char *name)
1093 {
1094     enum PixelFormat pix_fmt;
1095
1096     for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
1097         if (av_pix_fmt_descriptors[pix_fmt].name &&
1098             !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1099             return pix_fmt;
1100
1101     return PIX_FMT_NONE;
1102 }
1103
1104 const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt)
1105 {
1106     return (unsigned)pix_fmt < PIX_FMT_NB ?
1107         av_pix_fmt_descriptors[pix_fmt].name : NULL;
1108 }
1109
1110 #if HAVE_BIGENDIAN
1111 #   define X_NE(be, le) be
1112 #else
1113 #   define X_NE(be, le) le
1114 #endif
1115
1116 enum PixelFormat av_get_pix_fmt(const char *name)
1117 {
1118     enum PixelFormat pix_fmt;
1119
1120     if (!strcmp(name, "rgb32"))
1121         name = X_NE("argb", "bgra");
1122     else if (!strcmp(name, "bgr32"))
1123         name = X_NE("abgr", "rgba");
1124
1125     pix_fmt = get_pix_fmt_internal(name);
1126     if (pix_fmt == PIX_FMT_NONE) {
1127         char name2[32];
1128
1129         snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1130         pix_fmt = get_pix_fmt_internal(name2);
1131     }
1132     return pix_fmt;
1133 }
1134
1135 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1136 {
1137     int c, bits = 0;
1138     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1139
1140     for (c = 0; c < pixdesc->nb_components; c++) {
1141         int s = c == 1 || c == 2 ? 0 : log2_pixels;
1142         bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1143     }
1144
1145     return bits >> log2_pixels;
1146 }
1147
1148 char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
1149 {
1150     /* print header */
1151     if (pix_fmt < 0) {
1152        snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1153     } else {
1154         const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1155         snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1156                  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1157     }
1158
1159     return buf;
1160 }