]> git.sesse.net Git - ffmpeg/blob - libavutil/pixdesc.c
Move read_line() and write_line() definition from pixdesc.h to
[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 "pixfmt.h"
23 #include "pixdesc.h"
24
25 #include "intreadwrite.h"
26
27 void read_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4],
28                const AVPixFmtDescriptor *desc, int x, int y, int c, int w, int read_pal_component)
29 {
30     AVComponentDescriptor comp= desc->comp[c];
31     int plane= comp.plane;
32     int depth= comp.depth_minus1+1;
33     int mask = (1<<depth)-1;
34     int shift= comp.shift;
35     int step = comp.step_minus1+1;
36     int flags= desc->flags;
37
38     if (flags & PIX_FMT_BITSTREAM){
39         int skip = x*step + comp.offset_plus1-1;
40         const uint8_t *p = data[plane] + y*linesize[plane] + (skip>>3);
41         int shift = 8 - depth - (skip&7);
42
43         while(w--){
44             int val = (*p >> shift) & mask;
45             if(read_pal_component)
46                 val= data[1][4*val + c];
47             shift -= step;
48             p -= shift>>3;
49             shift &= 7;
50             *dst++= val;
51         }
52     } else {
53         const uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1;
54
55         while(w--){
56             int val;
57             if(flags & PIX_FMT_BE) val= AV_RB16(p);
58             else                   val= AV_RL16(p);
59             val = (val>>shift) & mask;
60             if(read_pal_component)
61                 val= data[1][4*val + c];
62             p+= step;
63             *dst++= val;
64         }
65     }
66 }
67
68 void write_line(const uint16_t *src, uint8_t *data[4], const int linesize[4],
69                 const AVPixFmtDescriptor *desc, int x, int y, int c, int w)
70 {
71     AVComponentDescriptor comp = desc->comp[c];
72     int plane = comp.plane;
73     int depth = comp.depth_minus1+1;
74     int step  = comp.step_minus1+1;
75     int flags = desc->flags;
76
77     if (flags & PIX_FMT_BITSTREAM) {
78         int skip = x*step + comp.offset_plus1-1;
79         uint8_t *p = data[plane] + y*linesize[plane] + (skip>>3);
80         int shift = 8 - depth - (skip&7);
81
82         while (w--) {
83             *p |= *src++ << shift;
84             shift -= step;
85             p -= shift>>3;
86             shift &= 7;
87         }
88     } else {
89         int shift = comp.shift;
90         uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1;
91
92         while (w--) {
93             if (flags & PIX_FMT_BE) {
94                 uint16_t val = AV_RB16(p) | (*src++<<shift);
95                 AV_WB16(p, val);
96             } else {
97                 uint16_t val = AV_RL16(p) | (*src++<<shift);
98                 AV_WL16(p, val);
99             }
100             p+= step;
101         }
102     }
103 }
104
105 const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = {
106     [PIX_FMT_YUV420P] = {
107         .name = "yuv420p",
108         .nb_components= 3,
109         .log2_chroma_w= 1,
110         .log2_chroma_h= 1,
111         .comp = {
112             {0,0,1,0,7},        /* Y */
113             {1,0,1,0,7},        /* U */
114             {2,0,1,0,7},        /* V */
115         },
116     },
117     [PIX_FMT_YUYV422] = {
118         .name = "yuyv422",
119         .nb_components= 3,
120         .log2_chroma_w= 1,
121         .log2_chroma_h= 0,
122         .comp = {
123             {0,1,1,0,7},        /* Y */
124             {0,3,2,0,7},        /* U */
125             {0,3,4,0,7},        /* V */
126         },
127     },
128     [PIX_FMT_RGB24] = {
129         .name = "rgb24",
130         .nb_components= 3,
131         .log2_chroma_w= 0,
132         .log2_chroma_h= 0,
133         .comp = {
134             {0,2,1,0,7},        /* R */
135             {0,2,2,0,7},        /* G */
136             {0,2,3,0,7},        /* B */
137         },
138     },
139     [PIX_FMT_BGR24] = {
140         .name = "bgr24",
141         .nb_components= 3,
142         .log2_chroma_w= 0,
143         .log2_chroma_h= 0,
144         .comp = {
145             {0,2,1,0,7},        /* B */
146             {0,2,2,0,7},        /* G */
147             {0,2,3,0,7},        /* R */
148         },
149     },
150     [PIX_FMT_YUV422P] = {
151         .name = "yuv422p",
152         .nb_components= 3,
153         .log2_chroma_w= 1,
154         .log2_chroma_h= 0,
155         .comp = {
156             {0,0,1,0,7},        /* Y */
157             {1,0,1,0,7},        /* U */
158             {2,0,1,0,7},        /* V */
159         },
160     },
161     [PIX_FMT_YUV444P] = {
162         .name = "yuv444p",
163         .nb_components= 3,
164         .log2_chroma_w= 0,
165         .log2_chroma_h= 0,
166         .comp = {
167             {0,0,1,0,7},        /* Y */
168             {1,0,1,0,7},        /* U */
169             {2,0,1,0,7},        /* V */
170         },
171     },
172     [PIX_FMT_YUV410P] = {
173         .name = "yuv410p",
174         .nb_components= 3,
175         .log2_chroma_w= 2,
176         .log2_chroma_h= 2,
177         .comp = {
178             {0,0,1,0,7},        /* Y */
179             {1,0,1,0,7},        /* U */
180             {2,0,1,0,7},        /* V */
181         },
182     },
183     [PIX_FMT_YUV411P] = {
184         .name = "yuv411p",
185         .nb_components= 3,
186         .log2_chroma_w= 2,
187         .log2_chroma_h= 0,
188         .comp = {
189             {0,0,1,0,7},        /* Y */
190             {1,0,1,0,7},        /* U */
191             {2,0,1,0,7},        /* V */
192         },
193     },
194     [PIX_FMT_GRAY8] = {
195         .name = "gray",
196         .nb_components= 1,
197         .log2_chroma_w= 0,
198         .log2_chroma_h= 0,
199         .comp = {
200             {0,0,1,0,7},        /* Y */
201         },
202     },
203     [PIX_FMT_MONOWHITE] = {
204         .name = "monow",
205         .nb_components= 1,
206         .log2_chroma_w= 0,
207         .log2_chroma_h= 0,
208         .comp = {
209             {0,0,1,0,0},        /* Y */
210         },
211         .flags = PIX_FMT_BITSTREAM,
212     },
213     [PIX_FMT_MONOBLACK] = {
214         .name = "monob",
215         .nb_components= 1,
216         .log2_chroma_w= 0,
217         .log2_chroma_h= 0,
218         .comp = {
219             {0,0,1,7,0},        /* Y */
220         },
221         .flags = PIX_FMT_BITSTREAM,
222     },
223     [PIX_FMT_PAL8] = {
224         .name = "pal8",
225         .nb_components= 1,
226         .log2_chroma_w= 0,
227         .log2_chroma_h= 0,
228         .comp = {
229             {0,0,1,0,7},
230         },
231         .flags = PIX_FMT_PAL,
232     },
233     [PIX_FMT_YUVJ420P] = {
234         .name = "yuvj420p",
235         .nb_components= 3,
236         .log2_chroma_w= 1,
237         .log2_chroma_h= 1,
238         .comp = {
239             {0,0,1,0,7},        /* Y */
240             {1,0,1,0,7},        /* U */
241             {2,0,1,0,7},        /* V */
242         },
243     },
244     [PIX_FMT_YUVJ422P] = {
245         .name = "yuvj422p",
246         .nb_components= 3,
247         .log2_chroma_w= 1,
248         .log2_chroma_h= 0,
249         .comp = {
250             {0,0,1,0,7},        /* Y */
251             {1,0,1,0,7},        /* U */
252             {2,0,1,0,7},        /* V */
253         },
254     },
255     [PIX_FMT_YUVJ444P] = {
256         .name = "yuvj444p",
257         .nb_components= 3,
258         .log2_chroma_w= 0,
259         .log2_chroma_h= 0,
260         .comp = {
261             {0,0,1,0,7},        /* Y */
262             {1,0,1,0,7},        /* U */
263             {2,0,1,0,7},        /* V */
264         },
265     },
266     [PIX_FMT_XVMC_MPEG2_MC] = {
267         .name = "xvmcmc",
268         .flags = PIX_FMT_HWACCEL,
269     },
270     [PIX_FMT_XVMC_MPEG2_IDCT] = {
271         .name = "xvmcidct",
272         .flags = PIX_FMT_HWACCEL,
273     },
274     [PIX_FMT_UYVY422] = {
275         .name = "uyvy422",
276         .nb_components= 3,
277         .log2_chroma_w= 1,
278         .log2_chroma_h= 0,
279         .comp = {
280             {0,1,2,0,7},        /* Y */
281             {0,3,1,0,7},        /* U */
282             {0,3,3,0,7},        /* V */
283         },
284     },
285     [PIX_FMT_UYYVYY411] = {
286         .name = "uyyvyy411",
287         .nb_components= 3,
288         .log2_chroma_w= 2,
289         .log2_chroma_h= 0,
290         .comp = {
291             {0,3,2,0,7},        /* Y */
292             {0,5,1,0,7},        /* U */
293             {0,5,4,0,7},        /* V */
294         },
295     },
296     [PIX_FMT_BGR8] = {
297         .name = "bgr8",
298         .nb_components= 3,
299         .log2_chroma_w= 0,
300         .log2_chroma_h= 0,
301         .comp = {
302             {0,0,1,6,1},        /* B */
303             {0,0,1,3,2},        /* G */
304             {0,0,1,0,2},        /* R */
305         },
306         .flags = PIX_FMT_PAL,
307     },
308     [PIX_FMT_BGR4] = {
309         .name = "bgr4",
310         .nb_components= 3,
311         .log2_chroma_w= 0,
312         .log2_chroma_h= 0,
313         .comp = {
314             {0,3,1,0,0},        /* B */
315             {0,3,2,0,1},        /* G */
316             {0,3,4,0,0},        /* R */
317         },
318         .flags = PIX_FMT_BITSTREAM,
319     },
320     [PIX_FMT_BGR4_BYTE] = {
321         .name = "bgr4_byte",
322         .nb_components= 3,
323         .log2_chroma_w= 0,
324         .log2_chroma_h= 0,
325         .comp = {
326             {0,0,1,3,0},        /* B */
327             {0,0,1,1,1},        /* G */
328             {0,0,1,0,0},        /* R */
329         },
330         .flags = PIX_FMT_PAL,
331     },
332     [PIX_FMT_RGB8] = {
333         .name = "rgb8",
334         .nb_components= 3,
335         .log2_chroma_w= 0,
336         .log2_chroma_h= 0,
337         .comp = {
338             {0,0,1,6,1},        /* R */
339             {0,0,1,3,2},        /* G */
340             {0,0,1,0,2},        /* B */
341         },
342         .flags = PIX_FMT_PAL,
343     },
344     [PIX_FMT_RGB4] = {
345         .name = "rgb4",
346         .nb_components= 3,
347         .log2_chroma_w= 0,
348         .log2_chroma_h= 0,
349         .comp = {
350             {0,3,1,0,0},       /* R */
351             {0,3,2,0,1},       /* G */
352             {0,3,4,0,0},       /* B */
353         },
354         .flags = PIX_FMT_BITSTREAM,
355     },
356     [PIX_FMT_RGB4_BYTE] = {
357         .name = "rgb4_byte",
358         .nb_components= 3,
359         .log2_chroma_w= 0,
360         .log2_chroma_h= 0,
361         .comp = {
362             {0,0,1,3,0},        /* R */
363             {0,0,1,1,1},        /* G */
364             {0,0,1,0,0},        /* B */
365         },
366         .flags = PIX_FMT_PAL,
367     },
368     [PIX_FMT_NV12] = {
369         .name = "nv12",
370         .nb_components= 3,
371         .log2_chroma_w= 1,
372         .log2_chroma_h= 1,
373         .comp = {
374             {0,0,1,0,7},        /* Y */
375             {1,1,1,0,7},        /* U */
376             {1,1,2,0,7},        /* V */
377         },
378     },
379     [PIX_FMT_NV21] = {
380         .name = "nv21",
381         .nb_components= 3,
382         .log2_chroma_w= 1,
383         .log2_chroma_h= 1,
384         .comp = {
385             {0,0,1,0,7},        /* Y */
386             {1,1,1,0,7},        /* V */
387             {1,1,2,0,7},        /* U */
388         },
389     },
390     [PIX_FMT_ARGB] = {
391         .name = "argb",
392         .nb_components= 4,
393         .log2_chroma_w= 0,
394         .log2_chroma_h= 0,
395         .comp = {
396             {0,3,1,0,7},        /* A */
397             {0,3,2,0,7},        /* R */
398             {0,3,3,0,7},        /* G */
399             {0,3,4,0,7},        /* B */
400         },
401     },
402     [PIX_FMT_RGBA] = {
403         .name = "rgba",
404         .nb_components= 4,
405         .log2_chroma_w= 0,
406         .log2_chroma_h= 0,
407         .comp = {
408             {0,3,1,0,7},        /* R */
409             {0,3,2,0,7},        /* G */
410             {0,3,3,0,7},        /* B */
411             {0,3,4,0,7},        /* A */
412         },
413     },
414     [PIX_FMT_ABGR] = {
415         .name = "abgr",
416         .nb_components= 4,
417         .log2_chroma_w= 0,
418         .log2_chroma_h= 0,
419         .comp = {
420             {0,3,1,0,7},        /* A */
421             {0,3,2,0,7},        /* B */
422             {0,3,3,0,7},        /* G */
423             {0,3,4,0,7},        /* R */
424         },
425     },
426     [PIX_FMT_BGRA] = {
427         .name = "bgra",
428         .nb_components= 4,
429         .log2_chroma_w= 0,
430         .log2_chroma_h= 0,
431         .comp = {
432             {0,3,1,0,7},        /* B */
433             {0,3,2,0,7},        /* G */
434             {0,3,3,0,7},        /* R */
435             {0,3,4,0,7},        /* A */
436         },
437     },
438     [PIX_FMT_GRAY16BE] = {
439         .name = "gray16be",
440         .nb_components= 1,
441         .log2_chroma_w= 0,
442         .log2_chroma_h= 0,
443         .comp = {
444             {0,1,1,0,15},       /* Y */
445         },
446         .flags = PIX_FMT_BE,
447     },
448     [PIX_FMT_GRAY16LE] = {
449         .name = "gray16le",
450         .nb_components= 1,
451         .log2_chroma_w= 0,
452         .log2_chroma_h= 0,
453         .comp = {
454             {0,1,1,0,15},       /* Y */
455         },
456     },
457     [PIX_FMT_YUV440P] = {
458         .name = "yuv440p",
459         .nb_components= 3,
460         .log2_chroma_w= 0,
461         .log2_chroma_h= 1,
462         .comp = {
463             {0,0,1,0,7},        /* Y */
464             {1,0,1,0,7},        /* U */
465             {2,0,1,0,7},        /* V */
466         },
467     },
468     [PIX_FMT_YUVJ440P] = {
469         .name = "yuvj440p",
470         .nb_components= 3,
471         .log2_chroma_w= 0,
472         .log2_chroma_h= 1,
473         .comp = {
474             {0,0,1,0,7},        /* Y */
475             {1,0,1,0,7},        /* U */
476             {2,0,1,0,7},        /* V */
477         },
478     },
479     [PIX_FMT_YUVA420P] = {
480         .name = "yuva420p",
481         .nb_components= 4,
482         .log2_chroma_w= 1,
483         .log2_chroma_h= 1,
484         .comp = {
485             {0,0,1,0,7},        /* Y */
486             {1,0,1,0,7},        /* U */
487             {2,0,1,0,7},        /* V */
488             {3,0,1,0,7},        /* A */
489         },
490     },
491     [PIX_FMT_VDPAU_H264] = {
492         .name = "vdpau_h264",
493         .log2_chroma_w = 1,
494         .log2_chroma_h = 1,
495         .flags = PIX_FMT_HWACCEL,
496     },
497     [PIX_FMT_VDPAU_MPEG1] = {
498         .name = "vdpau_mpeg1",
499         .log2_chroma_w = 1,
500         .log2_chroma_h = 1,
501         .flags = PIX_FMT_HWACCEL,
502     },
503     [PIX_FMT_VDPAU_MPEG2] = {
504         .name = "vdpau_mpeg2",
505         .log2_chroma_w = 1,
506         .log2_chroma_h = 1,
507         .flags = PIX_FMT_HWACCEL,
508     },
509     [PIX_FMT_VDPAU_WMV3] = {
510         .name = "vdpau_wmv3",
511         .log2_chroma_w = 1,
512         .log2_chroma_h = 1,
513         .flags = PIX_FMT_HWACCEL,
514     },
515     [PIX_FMT_VDPAU_VC1] = {
516         .name = "vdpau_vc1",
517         .log2_chroma_w = 1,
518         .log2_chroma_h = 1,
519         .flags = PIX_FMT_HWACCEL,
520     },
521     [PIX_FMT_VDPAU_MPEG4] = {
522         .name = "vdpau_mpeg4",
523         .log2_chroma_w = 1,
524         .log2_chroma_h = 1,
525         .flags = PIX_FMT_HWACCEL,
526     },
527     [PIX_FMT_RGB48BE] = {
528         .name = "rgb48be",
529         .nb_components= 3,
530         .log2_chroma_w= 0,
531         .log2_chroma_h= 0,
532         .comp = {
533             {0,5,1,0,15},       /* R */
534             {0,5,3,0,15},       /* G */
535             {0,5,5,0,15},       /* B */
536         },
537         .flags = PIX_FMT_BE,
538     },
539     [PIX_FMT_RGB48LE] = {
540         .name = "rgb48le",
541         .nb_components= 3,
542         .log2_chroma_w= 0,
543         .log2_chroma_h= 0,
544         .comp = {
545             {0,5,1,0,15},       /* R */
546             {0,5,3,0,15},       /* G */
547             {0,5,5,0,15},       /* B */
548         },
549     },
550     [PIX_FMT_RGB565BE] = {
551         .name = "rgb565be",
552         .nb_components= 3,
553         .log2_chroma_w= 0,
554         .log2_chroma_h= 0,
555         .comp = {
556             {0,1,0,3,4},        /* R */
557             {0,1,1,5,5},        /* G */
558             {0,1,1,0,4},        /* B */
559         },
560         .flags = PIX_FMT_BE,
561     },
562     [PIX_FMT_RGB565LE] = {
563         .name = "rgb565le",
564         .nb_components= 3,
565         .log2_chroma_w= 0,
566         .log2_chroma_h= 0,
567         .comp = {
568             {0,1,2,3,4},        /* R */
569             {0,1,1,5,5},        /* G */
570             {0,1,1,0,4},        /* B */
571         },
572     },
573     [PIX_FMT_RGB555BE] = {
574         .name = "rgb555be",
575         .nb_components= 3,
576         .log2_chroma_w= 0,
577         .log2_chroma_h= 0,
578         .comp = {
579             {0,1,0,2,4},        /* R */
580             {0,1,1,5,4},        /* G */
581             {0,1,1,0,4},        /* B */
582         },
583         .flags = PIX_FMT_BE,
584     },
585     [PIX_FMT_RGB555LE] = {
586         .name = "rgb555le",
587         .nb_components= 3,
588         .log2_chroma_w= 0,
589         .log2_chroma_h= 0,
590         .comp = {
591             {0,1,2,2,4},        /* R */
592             {0,1,1,5,4},        /* G */
593             {0,1,1,0,4},        /* B */
594         },
595     },
596     [PIX_FMT_BGR565BE] = {
597         .name = "bgr565be",
598         .nb_components= 3,
599         .log2_chroma_w= 0,
600         .log2_chroma_h= 0,
601         .comp = {
602             {0,1,0,3,4},        /* B */
603             {0,1,1,5,5},        /* G */
604             {0,1,1,0,4},        /* R */
605         },
606         .flags = PIX_FMT_BE,
607     },
608     [PIX_FMT_BGR565LE] = {
609         .name = "bgr565le",
610         .nb_components= 3,
611         .log2_chroma_w= 0,
612         .log2_chroma_h= 0,
613         .comp = {
614             {0,1,2,3,4},        /* B */
615             {0,1,1,5,5},        /* G */
616             {0,1,1,0,4},        /* R */
617         },
618     },
619     [PIX_FMT_BGR555BE] = {
620         .name = "bgr555be",
621         .nb_components= 3,
622         .log2_chroma_w= 0,
623         .log2_chroma_h= 0,
624         .comp = {
625             {0,1,0,2,4},       /* B */
626             {0,1,1,5,4},       /* G */
627             {0,1,1,0,4},       /* R */
628         },
629         .flags = PIX_FMT_BE,
630      },
631     [PIX_FMT_BGR555LE] = {
632         .name = "bgr555le",
633         .nb_components= 3,
634         .log2_chroma_w= 0,
635         .log2_chroma_h= 0,
636         .comp = {
637             {0,1,2,2,4},        /* B */
638             {0,1,1,5,4},        /* G */
639             {0,1,1,0,4},        /* R */
640         },
641     },
642     [PIX_FMT_VAAPI_MOCO] = {
643         .name = "vaapi_moco",
644         .log2_chroma_w = 1,
645         .log2_chroma_h = 1,
646         .flags = PIX_FMT_HWACCEL,
647     },
648     [PIX_FMT_VAAPI_IDCT] = {
649         .name = "vaapi_idct",
650         .log2_chroma_w = 1,
651         .log2_chroma_h = 1,
652         .flags = PIX_FMT_HWACCEL,
653     },
654     [PIX_FMT_VAAPI_VLD] = {
655         .name = "vaapi_vld",
656         .log2_chroma_w = 1,
657         .log2_chroma_h = 1,
658         .flags = PIX_FMT_HWACCEL,
659     },
660     [PIX_FMT_YUV420P16LE] = {
661         .name = "yuv420p16le",
662         .nb_components= 3,
663         .log2_chroma_w= 1,
664         .log2_chroma_h= 1,
665         .comp = {
666             {0,1,1,0,15},        /* Y */
667             {1,1,1,0,15},        /* U */
668             {2,1,1,0,15},        /* V */
669         },
670     },
671     [PIX_FMT_YUV420P16BE] = {
672         .name = "yuv420p16be",
673         .nb_components= 3,
674         .log2_chroma_w= 1,
675         .log2_chroma_h= 1,
676         .comp = {
677             {0,1,1,0,15},        /* Y */
678             {1,1,1,0,15},        /* U */
679             {2,1,1,0,15},        /* V */
680         },
681         .flags = PIX_FMT_BE,
682     },
683     [PIX_FMT_YUV422P16LE] = {
684         .name = "yuv422p16le",
685         .nb_components= 3,
686         .log2_chroma_w= 1,
687         .log2_chroma_h= 0,
688         .comp = {
689             {0,1,1,0,15},        /* Y */
690             {1,1,1,0,15},        /* U */
691             {2,1,1,0,15},        /* V */
692         },
693     },
694     [PIX_FMT_YUV422P16BE] = {
695         .name = "yuv422p16be",
696         .nb_components= 3,
697         .log2_chroma_w= 1,
698         .log2_chroma_h= 0,
699         .comp = {
700             {0,1,1,0,15},        /* Y */
701             {1,1,1,0,15},        /* U */
702             {2,1,1,0,15},        /* V */
703         },
704         .flags = PIX_FMT_BE,
705     },
706     [PIX_FMT_YUV444P16LE] = {
707         .name = "yuv444p16le",
708         .nb_components= 3,
709         .log2_chroma_w= 0,
710         .log2_chroma_h= 0,
711         .comp = {
712             {0,1,1,0,15},        /* Y */
713             {1,1,1,0,15},        /* U */
714             {2,1,1,0,15},        /* V */
715         },
716     },
717     [PIX_FMT_YUV444P16BE] = {
718         .name = "yuv444p16be",
719         .nb_components= 3,
720         .log2_chroma_w= 0,
721         .log2_chroma_h= 0,
722         .comp = {
723             {0,1,1,0,15},        /* Y */
724             {1,1,1,0,15},        /* U */
725             {2,1,1,0,15},        /* V */
726         },
727         .flags = PIX_FMT_BE,
728     },
729     [PIX_FMT_DXVA2_VLD] = {
730         .name = "dxva2_vld",
731         .log2_chroma_w = 1,
732         .log2_chroma_h = 1,
733         .flags = PIX_FMT_HWACCEL,
734     },
735 };
736
737 static enum PixelFormat get_pix_fmt_internal(const char *name)
738 {
739     enum PixelFormat pix_fmt;
740
741     for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
742         if (av_pix_fmt_descriptors[pix_fmt].name &&
743             !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
744             return pix_fmt;
745
746     return PIX_FMT_NONE;
747 }
748
749 #if HAVE_BIGENDIAN
750 #   define X_NE(be, le) be
751 #else
752 #   define X_NE(be, le) le
753 #endif
754
755 enum PixelFormat av_get_pix_fmt(const char *name)
756 {
757     enum PixelFormat pix_fmt;
758
759     if (!strcmp(name, "rgb32"))
760         name = X_NE("argb", "bgra");
761     else if (!strcmp(name, "bgr32"))
762         name = X_NE("abgr", "rgba");
763
764     pix_fmt = get_pix_fmt_internal(name);
765     if (pix_fmt == PIX_FMT_NONE) {
766         char name2[32];
767
768         snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
769         pix_fmt = get_pix_fmt_internal(name2);
770     }
771     return pix_fmt;
772 }
773
774 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
775 {
776     int c, bits = 0;
777     int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
778
779     for (c = 0; c < pixdesc->nb_components; c++) {
780         int s = c==1 || c==2 ? 0 : log2_pixels;
781         bits += (pixdesc->comp[c].depth_minus1+1) << s;
782     }
783
784     return bits >> log2_pixels;
785 }