]> 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, 3, 0, 7 },        /* R */
162             { 0, 2, 2, 0, 7 },        /* G */
163             { 0, 2, 1, 0, 7 },        /* B */
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, 0, 2 },        /* R */
327             { 0, 0, 1, 3, 2 },        /* G */
328             { 0, 0, 1, 6, 1 },        /* B */
329         },
330         .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
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, 4, 0, 0 },        /* R */
339             { 0, 3, 2, 0, 1 },        /* G */
340             { 0, 3, 1, 0, 0 },        /* B */
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, 0, 0 },        /* R */
351             { 0, 0, 1, 1, 1 },        /* G */
352             { 0, 0, 1, 3, 0 },        /* B */
353         },
354         .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
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_RGB | PIX_FMT_PSEUDOPAL,
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_RGB | PIX_FMT_PSEUDOPAL,
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, 2, 0, 7 },        /* U */
412             { 1, 1, 1, 0, 7 },        /* V */
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, 2, 0, 7 },        /* R */
423             { 0, 3, 3, 0, 7 },        /* G */
424             { 0, 3, 4, 0, 7 },        /* B */
425             { 0, 3, 1, 0, 7 },        /* A */
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, 4, 0, 7 },        /* R */
449             { 0, 3, 3, 0, 7 },        /* G */
450             { 0, 3, 2, 0, 7 },        /* B */
451             { 0, 3, 1, 0, 7 },        /* A */
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, 3, 0, 7 },        /* R */
462             { 0, 3, 2, 0, 7 },        /* G */
463             { 0, 3, 1, 0, 7 },        /* B */
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, 4, 0, 7 },        /* R */
500             { 0, 3, 3, 0, 7 },        /* G */
501             { 0, 3, 2, 0, 7 },        /* B */
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, 3, 0, 7 },        /* R */
512             { 0, 3, 2, 0, 7 },        /* G */
513             { 0, 3, 1, 0, 7 },        /* B */
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_YUVA444P] = {
575         .name = "yuva444p",
576         .nb_components = 4,
577         .log2_chroma_w = 0,
578         .log2_chroma_h = 0,
579         .comp = {
580             { 0, 0, 1, 0, 7 },        /* Y */
581             { 1, 0, 1, 0, 7 },        /* U */
582             { 2, 0, 1, 0, 7 },        /* V */
583             { 3, 0, 1, 0, 7 },        /* A */
584         },
585         .flags = PIX_FMT_PLANAR,
586     },
587     [PIX_FMT_VDPAU_H264] = {
588         .name = "vdpau_h264",
589         .log2_chroma_w = 1,
590         .log2_chroma_h = 1,
591         .flags = PIX_FMT_HWACCEL,
592     },
593     [PIX_FMT_VDPAU_MPEG1] = {
594         .name = "vdpau_mpeg1",
595         .log2_chroma_w = 1,
596         .log2_chroma_h = 1,
597         .flags = PIX_FMT_HWACCEL,
598     },
599     [PIX_FMT_VDPAU_MPEG2] = {
600         .name = "vdpau_mpeg2",
601         .log2_chroma_w = 1,
602         .log2_chroma_h = 1,
603         .flags = PIX_FMT_HWACCEL,
604     },
605     [PIX_FMT_VDPAU_WMV3] = {
606         .name = "vdpau_wmv3",
607         .log2_chroma_w = 1,
608         .log2_chroma_h = 1,
609         .flags = PIX_FMT_HWACCEL,
610     },
611     [PIX_FMT_VDPAU_VC1] = {
612         .name = "vdpau_vc1",
613         .log2_chroma_w = 1,
614         .log2_chroma_h = 1,
615         .flags = PIX_FMT_HWACCEL,
616     },
617     [PIX_FMT_VDPAU_MPEG4] = {
618         .name = "vdpau_mpeg4",
619         .log2_chroma_w = 1,
620         .log2_chroma_h = 1,
621         .flags = PIX_FMT_HWACCEL,
622     },
623     [PIX_FMT_RGB48BE] = {
624         .name = "rgb48be",
625         .nb_components = 3,
626         .log2_chroma_w = 0,
627         .log2_chroma_h = 0,
628         .comp = {
629             { 0, 5, 1, 0, 15 },       /* R */
630             { 0, 5, 3, 0, 15 },       /* G */
631             { 0, 5, 5, 0, 15 },       /* B */
632         },
633         .flags = PIX_FMT_RGB | PIX_FMT_BE,
634     },
635     [PIX_FMT_RGB48LE] = {
636         .name = "rgb48le",
637         .nb_components = 3,
638         .log2_chroma_w = 0,
639         .log2_chroma_h = 0,
640         .comp = {
641             { 0, 5, 1, 0, 15 },       /* R */
642             { 0, 5, 3, 0, 15 },       /* G */
643             { 0, 5, 5, 0, 15 },       /* B */
644         },
645         .flags = PIX_FMT_RGB,
646     },
647     [PIX_FMT_RGBA64BE] = {
648         .name = "rgba64be",
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 },       /* A */
657         },
658         .flags = PIX_FMT_RGB | PIX_FMT_BE,
659     },
660     [PIX_FMT_RGBA64LE] = {
661         .name = "rgba64le",
662         .nb_components= 4,
663         .log2_chroma_w= 0,
664         .log2_chroma_h= 0,
665         .comp = {
666             { 0, 7, 1, 0, 15 },       /* R */
667             { 0, 7, 3, 0, 15 },       /* G */
668             { 0, 7, 5, 0, 15 },       /* B */
669             { 0, 7, 7, 0, 15 },       /* A */
670         },
671         .flags = PIX_FMT_RGB,
672     },
673     [PIX_FMT_RGB565BE] = {
674         .name = "rgb565be",
675         .nb_components = 3,
676         .log2_chroma_w = 0,
677         .log2_chroma_h = 0,
678         .comp = {
679             { 0, 1, 0, 3, 4 },        /* R */
680             { 0, 1, 1, 5, 5 },        /* G */
681             { 0, 1, 1, 0, 4 },        /* B */
682         },
683         .flags = PIX_FMT_BE | PIX_FMT_RGB,
684     },
685     [PIX_FMT_RGB565LE] = {
686         .name = "rgb565le",
687         .nb_components = 3,
688         .log2_chroma_w = 0,
689         .log2_chroma_h = 0,
690         .comp = {
691             { 0, 1, 2, 3, 4 },        /* R */
692             { 0, 1, 1, 5, 5 },        /* G */
693             { 0, 1, 1, 0, 4 },        /* B */
694         },
695         .flags = PIX_FMT_RGB,
696     },
697     [PIX_FMT_RGB555BE] = {
698         .name = "rgb555be",
699         .nb_components = 3,
700         .log2_chroma_w = 0,
701         .log2_chroma_h = 0,
702         .comp = {
703             { 0, 1, 0, 2, 4 },        /* R */
704             { 0, 1, 1, 5, 4 },        /* G */
705             { 0, 1, 1, 0, 4 },        /* B */
706         },
707         .flags = PIX_FMT_BE | PIX_FMT_RGB,
708     },
709     [PIX_FMT_RGB555LE] = {
710         .name = "rgb555le",
711         .nb_components = 3,
712         .log2_chroma_w = 0,
713         .log2_chroma_h = 0,
714         .comp = {
715             { 0, 1, 2, 2, 4 },        /* R */
716             { 0, 1, 1, 5, 4 },        /* G */
717             { 0, 1, 1, 0, 4 },        /* B */
718         },
719         .flags = PIX_FMT_RGB,
720     },
721     [PIX_FMT_RGB444BE] = {
722         .name = "rgb444be",
723         .nb_components = 3,
724         .log2_chroma_w = 0,
725         .log2_chroma_h = 0,
726         .comp = {
727             { 0, 1, 0, 0, 3 },        /* R */
728             { 0, 1, 1, 4, 3 },        /* G */
729             { 0, 1, 1, 0, 3 },        /* B */
730         },
731         .flags = PIX_FMT_BE | PIX_FMT_RGB,
732     },
733     [PIX_FMT_RGB444LE] = {
734         .name = "rgb444le",
735         .nb_components = 3,
736         .log2_chroma_w = 0,
737         .log2_chroma_h = 0,
738         .comp = {
739             { 0, 1, 2, 0, 3 },        /* R */
740             { 0, 1, 1, 4, 3 },        /* G */
741             { 0, 1, 1, 0, 3 },        /* B */
742         },
743         .flags = PIX_FMT_RGB,
744     },
745     [PIX_FMT_BGR48BE] = {
746         .name = "bgr48be",
747         .nb_components = 3,
748         .log2_chroma_w = 0,
749         .log2_chroma_h = 0,
750         .comp = {
751             { 0, 5, 5, 0, 15 },       /* R */
752             { 0, 5, 3, 0, 15 },       /* G */
753             { 0, 5, 1, 0, 15 },       /* B */
754         },
755         .flags = PIX_FMT_BE | PIX_FMT_RGB,
756     },
757     [PIX_FMT_BGR48LE] = {
758         .name = "bgr48le",
759         .nb_components = 3,
760         .log2_chroma_w = 0,
761         .log2_chroma_h = 0,
762         .comp = {
763             { 0, 5, 5, 0, 15 },       /* R */
764             { 0, 5, 3, 0, 15 },       /* G */
765             { 0, 5, 1, 0, 15 },       /* B */
766         },
767         .flags = PIX_FMT_RGB,
768     },
769     [PIX_FMT_BGRA64BE] = {
770         .name = "bgra64be",
771         .nb_components= 4,
772         .log2_chroma_w= 0,
773         .log2_chroma_h= 0,
774         .comp = {
775             { 0, 7, 5, 0, 15 },       /* R */
776             { 0, 7, 3, 0, 15 },       /* G */
777             { 0, 7, 1, 0, 15 },       /* B */
778             { 0, 7, 7, 0, 15 },       /* A */
779         },
780         .flags = PIX_FMT_BE,
781     },
782     [PIX_FMT_BGRA64LE] = {
783         .name = "bgra64le",
784         .nb_components= 4,
785         .log2_chroma_w= 0,
786         .log2_chroma_h= 0,
787         .comp = {
788             { 0, 7, 5, 0, 15 },       /* R */
789             { 0, 7, 3, 0, 15 },       /* G */
790             { 0, 7, 1, 0, 15 },       /* B */
791             { 0, 7, 7, 0, 15 },       /* A */
792         },
793     },
794     [PIX_FMT_BGR565BE] = {
795         .name = "bgr565be",
796         .nb_components = 3,
797         .log2_chroma_w = 0,
798         .log2_chroma_h = 0,
799         .comp = {
800             { 0, 1, 1, 0, 4 },        /* R */
801             { 0, 1, 1, 5, 5 },        /* G */
802             { 0, 1, 0, 3, 4 },        /* B */
803         },
804         .flags = PIX_FMT_BE | PIX_FMT_RGB,
805     },
806     [PIX_FMT_BGR565LE] = {
807         .name = "bgr565le",
808         .nb_components = 3,
809         .log2_chroma_w = 0,
810         .log2_chroma_h = 0,
811         .comp = {
812             { 0, 1, 1, 0, 4 },        /* R */
813             { 0, 1, 1, 5, 5 },        /* G */
814             { 0, 1, 2, 3, 4 },        /* B */
815         },
816         .flags = PIX_FMT_RGB,
817     },
818     [PIX_FMT_BGR555BE] = {
819         .name = "bgr555be",
820         .nb_components = 3,
821         .log2_chroma_w = 0,
822         .log2_chroma_h = 0,
823         .comp = {
824             { 0, 1, 1, 0, 4 },       /* R */
825             { 0, 1, 1, 5, 4 },       /* G */
826             { 0, 1, 0, 2, 4 },       /* B */
827         },
828         .flags = PIX_FMT_BE | PIX_FMT_RGB,
829      },
830     [PIX_FMT_BGR555LE] = {
831         .name = "bgr555le",
832         .nb_components = 3,
833         .log2_chroma_w = 0,
834         .log2_chroma_h = 0,
835         .comp = {
836             { 0, 1, 1, 0, 4 },        /* R */
837             { 0, 1, 1, 5, 4 },        /* G */
838             { 0, 1, 2, 2, 4 },        /* B */
839         },
840         .flags = PIX_FMT_RGB,
841     },
842     [PIX_FMT_BGR444BE] = {
843         .name = "bgr444be",
844         .nb_components = 3,
845         .log2_chroma_w = 0,
846         .log2_chroma_h = 0,
847         .comp = {
848             { 0, 1, 1, 0, 3 },       /* R */
849             { 0, 1, 1, 4, 3 },       /* G */
850             { 0, 1, 0, 0, 3 },       /* B */
851         },
852         .flags = PIX_FMT_BE | PIX_FMT_RGB,
853      },
854     [PIX_FMT_BGR444LE] = {
855         .name = "bgr444le",
856         .nb_components = 3,
857         .log2_chroma_w = 0,
858         .log2_chroma_h = 0,
859         .comp = {
860             { 0, 1, 1, 0, 3 },        /* R */
861             { 0, 1, 1, 4, 3 },        /* G */
862             { 0, 1, 2, 0, 3 },        /* B */
863         },
864         .flags = PIX_FMT_RGB,
865     },
866     [PIX_FMT_VAAPI_MOCO] = {
867         .name = "vaapi_moco",
868         .log2_chroma_w = 1,
869         .log2_chroma_h = 1,
870         .flags = PIX_FMT_HWACCEL,
871     },
872     [PIX_FMT_VAAPI_IDCT] = {
873         .name = "vaapi_idct",
874         .log2_chroma_w = 1,
875         .log2_chroma_h = 1,
876         .flags = PIX_FMT_HWACCEL,
877     },
878     [PIX_FMT_VAAPI_VLD] = {
879         .name = "vaapi_vld",
880         .log2_chroma_w = 1,
881         .log2_chroma_h = 1,
882         .flags = PIX_FMT_HWACCEL,
883     },
884     [PIX_FMT_YUV420P9LE] = {
885         .name = "yuv420p9le",
886         .nb_components = 3,
887         .log2_chroma_w = 1,
888         .log2_chroma_h = 1,
889         .comp = {
890             { 0, 1, 1, 0, 8 },        /* Y */
891             { 1, 1, 1, 0, 8 },        /* U */
892             { 2, 1, 1, 0, 8 },        /* V */
893         },
894         .flags = PIX_FMT_PLANAR,
895     },
896     [PIX_FMT_YUV420P9BE] = {
897         .name = "yuv420p9be",
898         .nb_components = 3,
899         .log2_chroma_w = 1,
900         .log2_chroma_h = 1,
901         .comp = {
902             { 0, 1, 1, 0, 8 },        /* Y */
903             { 1, 1, 1, 0, 8 },        /* U */
904             { 2, 1, 1, 0, 8 },        /* V */
905         },
906         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
907     },
908     [PIX_FMT_YUV420P10LE] = {
909         .name = "yuv420p10le",
910         .nb_components = 3,
911         .log2_chroma_w = 1,
912         .log2_chroma_h = 1,
913         .comp = {
914             { 0, 1, 1, 0, 9 },        /* Y */
915             { 1, 1, 1, 0, 9 },        /* U */
916             { 2, 1, 1, 0, 9 },        /* V */
917         },
918         .flags = PIX_FMT_PLANAR,
919     },
920     [PIX_FMT_YUV420P10BE] = {
921         .name = "yuv420p10be",
922         .nb_components = 3,
923         .log2_chroma_w = 1,
924         .log2_chroma_h = 1,
925         .comp = {
926             { 0, 1, 1, 0, 9 },        /* Y */
927             { 1, 1, 1, 0, 9 },        /* U */
928             { 2, 1, 1, 0, 9 },        /* V */
929         },
930         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
931     },
932     [PIX_FMT_YUV420P16LE] = {
933         .name = "yuv420p16le",
934         .nb_components = 3,
935         .log2_chroma_w = 1,
936         .log2_chroma_h = 1,
937         .comp = {
938             { 0, 1, 1, 0, 15 },        /* Y */
939             { 1, 1, 1, 0, 15 },        /* U */
940             { 2, 1, 1, 0, 15 },        /* V */
941         },
942         .flags = PIX_FMT_PLANAR,
943     },
944     [PIX_FMT_YUV420P16BE] = {
945         .name = "yuv420p16be",
946         .nb_components = 3,
947         .log2_chroma_w = 1,
948         .log2_chroma_h = 1,
949         .comp = {
950             { 0, 1, 1, 0, 15 },        /* Y */
951             { 1, 1, 1, 0, 15 },        /* U */
952             { 2, 1, 1, 0, 15 },        /* V */
953         },
954         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
955     },
956     [PIX_FMT_YUV422P9LE] = {
957         .name = "yuv422p9le",
958         .nb_components = 3,
959         .log2_chroma_w = 1,
960         .log2_chroma_h = 0,
961         .comp = {
962             { 0, 1, 1, 0, 8 },        /* Y */
963             { 1, 1, 1, 0, 8 },        /* U */
964             { 2, 1, 1, 0, 8 },        /* V */
965         },
966         .flags = PIX_FMT_PLANAR,
967     },
968     [PIX_FMT_YUV422P9BE] = {
969         .name = "yuv422p9be",
970         .nb_components = 3,
971         .log2_chroma_w = 1,
972         .log2_chroma_h = 0,
973         .comp = {
974             { 0, 1, 1, 0, 8 },        /* Y */
975             { 1, 1, 1, 0, 8 },        /* U */
976             { 2, 1, 1, 0, 8 },        /* V */
977         },
978         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
979     },
980     [PIX_FMT_YUV422P10LE] = {
981         .name = "yuv422p10le",
982         .nb_components = 3,
983         .log2_chroma_w = 1,
984         .log2_chroma_h = 0,
985         .comp = {
986             { 0, 1, 1, 0, 9 },        /* Y */
987             { 1, 1, 1, 0, 9 },        /* U */
988             { 2, 1, 1, 0, 9 },        /* V */
989         },
990         .flags = PIX_FMT_PLANAR,
991     },
992     [PIX_FMT_YUV422P10BE] = {
993         .name = "yuv422p10be",
994         .nb_components = 3,
995         .log2_chroma_w = 1,
996         .log2_chroma_h = 0,
997         .comp = {
998             { 0, 1, 1, 0, 9 },        /* Y */
999             { 1, 1, 1, 0, 9 },        /* U */
1000             { 2, 1, 1, 0, 9 },        /* V */
1001         },
1002         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1003     },
1004     [PIX_FMT_YUV422P16LE] = {
1005         .name = "yuv422p16le",
1006         .nb_components = 3,
1007         .log2_chroma_w = 1,
1008         .log2_chroma_h = 0,
1009         .comp = {
1010             { 0, 1, 1, 0, 15 },        /* Y */
1011             { 1, 1, 1, 0, 15 },        /* U */
1012             { 2, 1, 1, 0, 15 },        /* V */
1013         },
1014         .flags = PIX_FMT_PLANAR,
1015     },
1016     [PIX_FMT_YUV422P16BE] = {
1017         .name = "yuv422p16be",
1018         .nb_components = 3,
1019         .log2_chroma_w = 1,
1020         .log2_chroma_h = 0,
1021         .comp = {
1022             { 0, 1, 1, 0, 15 },        /* Y */
1023             { 1, 1, 1, 0, 15 },        /* U */
1024             { 2, 1, 1, 0, 15 },        /* V */
1025         },
1026         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1027     },
1028     [PIX_FMT_YUV444P16LE] = {
1029         .name = "yuv444p16le",
1030         .nb_components = 3,
1031         .log2_chroma_w = 0,
1032         .log2_chroma_h = 0,
1033         .comp = {
1034             { 0, 1, 1, 0, 15 },        /* Y */
1035             { 1, 1, 1, 0, 15 },        /* U */
1036             { 2, 1, 1, 0, 15 },        /* V */
1037         },
1038         .flags = PIX_FMT_PLANAR,
1039     },
1040     [PIX_FMT_YUV444P16BE] = {
1041         .name = "yuv444p16be",
1042         .nb_components = 3,
1043         .log2_chroma_w = 0,
1044         .log2_chroma_h = 0,
1045         .comp = {
1046             { 0, 1, 1, 0, 15 },        /* Y */
1047             { 1, 1, 1, 0, 15 },        /* U */
1048             { 2, 1, 1, 0, 15 },        /* V */
1049         },
1050         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1051     },
1052     [PIX_FMT_YUV444P10LE] = {
1053         .name = "yuv444p10le",
1054         .nb_components = 3,
1055         .log2_chroma_w = 0,
1056         .log2_chroma_h = 0,
1057         .comp = {
1058             { 0, 1, 1, 0, 9 },        /* Y */
1059             { 1, 1, 1, 0, 9 },        /* U */
1060             { 2, 1, 1, 0, 9 },        /* V */
1061         },
1062         .flags = PIX_FMT_PLANAR,
1063     },
1064     [PIX_FMT_YUV444P10BE] = {
1065         .name = "yuv444p10be",
1066         .nb_components = 3,
1067         .log2_chroma_w = 0,
1068         .log2_chroma_h = 0,
1069         .comp = {
1070             { 0, 1, 1, 0, 9 },        /* Y */
1071             { 1, 1, 1, 0, 9 },        /* U */
1072             { 2, 1, 1, 0, 9 },        /* V */
1073         },
1074         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1075     },
1076     [PIX_FMT_YUV444P9LE] = {
1077         .name = "yuv444p9le",
1078         .nb_components = 3,
1079         .log2_chroma_w = 0,
1080         .log2_chroma_h = 0,
1081         .comp = {
1082             { 0, 1, 1, 0, 8 },        /* Y */
1083             { 1, 1, 1, 0, 8 },        /* U */
1084             { 2, 1, 1, 0, 8 },        /* V */
1085         },
1086         .flags = PIX_FMT_PLANAR,
1087     },
1088     [PIX_FMT_YUV444P9BE] = {
1089         .name = "yuv444p9be",
1090         .nb_components = 3,
1091         .log2_chroma_w = 0,
1092         .log2_chroma_h = 0,
1093         .comp = {
1094             { 0, 1, 1, 0, 8 },        /* Y */
1095             { 1, 1, 1, 0, 8 },        /* U */
1096             { 2, 1, 1, 0, 8 },        /* V */
1097         },
1098         .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1099     },
1100     [PIX_FMT_DXVA2_VLD] = {
1101         .name = "dxva2_vld",
1102         .log2_chroma_w = 1,
1103         .log2_chroma_h = 1,
1104         .flags = PIX_FMT_HWACCEL,
1105     },
1106     [PIX_FMT_VDA_VLD] = {
1107         .name = "vda_vld",
1108         .log2_chroma_w = 1,
1109         .log2_chroma_h = 1,
1110         .flags = PIX_FMT_HWACCEL,
1111     },
1112     [PIX_FMT_GRAY8A] = {
1113         .name = "gray8a",
1114         .nb_components = 2,
1115         .comp = {
1116             { 0, 1, 1, 0, 7 },        /* Y */
1117             { 0, 1, 2, 0, 7 },        /* A */
1118         },
1119     },
1120     [PIX_FMT_GBRP] = {
1121         .name = "gbrp",
1122         .nb_components = 3,
1123         .log2_chroma_w = 0,
1124         .log2_chroma_h = 0,
1125         .comp = {
1126             { 2, 0, 1, 0, 7 },        /* R */
1127             { 0, 0, 1, 0, 7 },        /* G */
1128             { 1, 0, 1, 0, 7 },        /* B */
1129         },
1130         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1131     },
1132     [PIX_FMT_GBRP9LE] = {
1133         .name = "gbrp9le",
1134         .nb_components = 3,
1135         .log2_chroma_w = 0,
1136         .log2_chroma_h = 0,
1137         .comp = {
1138             { 2, 1, 1, 0, 8 },        /* R */
1139             { 0, 1, 1, 0, 8 },        /* G */
1140             { 1, 1, 1, 0, 8 },        /* B */
1141         },
1142         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1143     },
1144     [PIX_FMT_GBRP9BE] = {
1145         .name = "gbrp9be",
1146         .nb_components = 3,
1147         .log2_chroma_w = 0,
1148         .log2_chroma_h = 0,
1149         .comp = {
1150             { 2, 1, 1, 0, 8 },        /* R */
1151             { 0, 1, 1, 0, 8 },        /* G */
1152             { 1, 1, 1, 0, 8 },        /* B */
1153         },
1154         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1155     },
1156     [PIX_FMT_GBRP10LE] = {
1157         .name = "gbrp10le",
1158         .nb_components = 3,
1159         .log2_chroma_w = 0,
1160         .log2_chroma_h = 0,
1161         .comp = {
1162             { 2, 1, 1, 0, 9 },        /* R */
1163             { 0, 1, 1, 0, 9 },        /* G */
1164             { 1, 1, 1, 0, 9 },        /* B */
1165         },
1166         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1167     },
1168     [PIX_FMT_GBRP10BE] = {
1169         .name = "gbrp10be",
1170         .nb_components = 3,
1171         .log2_chroma_w = 0,
1172         .log2_chroma_h = 0,
1173         .comp = {
1174             { 2, 1, 1, 0, 9 },        /* R */
1175             { 0, 1, 1, 0, 9 },        /* G */
1176             { 1, 1, 1, 0, 9 },        /* B */
1177         },
1178         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1179     },
1180     [PIX_FMT_GBRP16LE] = {
1181         .name = "gbrp16le",
1182         .nb_components = 3,
1183         .log2_chroma_w = 0,
1184         .log2_chroma_h = 0,
1185         .comp = {
1186             { 2, 1, 1, 0, 15 },       /* R */
1187             { 0, 1, 1, 0, 15 },       /* G */
1188             { 1, 1, 1, 0, 15 },       /* B */
1189         },
1190         .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1191     },
1192     [PIX_FMT_GBRP16BE] = {
1193         .name = "gbrp16be",
1194         .nb_components = 3,
1195         .log2_chroma_w = 0,
1196         .log2_chroma_h = 0,
1197         .comp = {
1198             { 2, 1, 1, 0, 15 },       /* R */
1199             { 0, 1, 1, 0, 15 },       /* G */
1200             { 1, 1, 1, 0, 15 },       /* B */
1201         },
1202         .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1203     },
1204 };
1205
1206 static enum PixelFormat get_pix_fmt_internal(const char *name)
1207 {
1208     enum PixelFormat pix_fmt;
1209
1210     for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
1211         if (av_pix_fmt_descriptors[pix_fmt].name &&
1212             !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1213             return pix_fmt;
1214
1215     return PIX_FMT_NONE;
1216 }
1217
1218 const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt)
1219 {
1220     return (unsigned)pix_fmt < PIX_FMT_NB ?
1221         av_pix_fmt_descriptors[pix_fmt].name : NULL;
1222 }
1223
1224 #if HAVE_BIGENDIAN
1225 #   define X_NE(be, le) be
1226 #else
1227 #   define X_NE(be, le) le
1228 #endif
1229
1230 enum PixelFormat av_get_pix_fmt(const char *name)
1231 {
1232     enum PixelFormat pix_fmt;
1233
1234     if (!strcmp(name, "rgb32"))
1235         name = X_NE("argb", "bgra");
1236     else if (!strcmp(name, "bgr32"))
1237         name = X_NE("abgr", "rgba");
1238
1239     pix_fmt = get_pix_fmt_internal(name);
1240     if (pix_fmt == PIX_FMT_NONE) {
1241         char name2[32];
1242
1243         snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1244         pix_fmt = get_pix_fmt_internal(name2);
1245     }
1246     return pix_fmt;
1247 }
1248
1249 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1250 {
1251     int c, bits = 0;
1252     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1253
1254     for (c = 0; c < pixdesc->nb_components; c++) {
1255         int s = c == 1 || c == 2 ? 0 : log2_pixels;
1256         bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1257     }
1258
1259     return bits >> log2_pixels;
1260 }
1261
1262 char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
1263 {
1264     /* print header */
1265     if (pix_fmt < 0) {
1266        snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1267     } else {
1268         const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1269         snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1270                  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1271     }
1272
1273     return buf;
1274 }