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