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