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