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