2 * pixel format descriptor
3 * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "intreadwrite.h"
29 void av_read_image_line(uint16_t *dst,
30 const uint8_t *data[4], const int linesize[4],
31 const AVPixFmtDescriptor *desc,
32 int x, int y, int c, int w,
33 int read_pal_component)
35 AVComponentDescriptor comp = desc->comp[c];
36 int plane = comp.plane;
37 int depth = comp.depth_minus1 + 1;
38 int mask = (1 << depth) - 1;
39 int shift = comp.shift;
40 int step = comp.step_minus1 + 1;
41 int flags = desc->flags;
43 if (flags & PIX_FMT_BITSTREAM) {
44 int skip = x * step + comp.offset_plus1 - 1;
45 const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
46 int shift = 8 - depth - (skip & 7);
49 int val = (*p >> shift) & mask;
50 if (read_pal_component)
51 val = data[1][4*val + c];
58 const uint8_t *p = data[plane] + y * linesize[plane] +
59 x * step + comp.offset_plus1 - 1;
60 int is_8bit = shift + depth <= 8;
63 p += !!(flags & PIX_FMT_BE);
66 int val = is_8bit ? *p :
67 flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
68 val = (val >> shift) & mask;
69 if (read_pal_component)
70 val = data[1][4 * val + c];
77 void av_write_image_line(const uint16_t *src,
78 uint8_t *data[4], const int linesize[4],
79 const AVPixFmtDescriptor *desc,
80 int x, int y, int c, int w)
82 AVComponentDescriptor comp = desc->comp[c];
83 int plane = comp.plane;
84 int depth = comp.depth_minus1 + 1;
85 int step = comp.step_minus1 + 1;
86 int flags = desc->flags;
88 if (flags & PIX_FMT_BITSTREAM) {
89 int skip = x * step + comp.offset_plus1 - 1;
90 uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
91 int shift = 8 - depth - (skip & 7);
94 *p |= *src++ << shift;
100 int shift = comp.shift;
101 uint8_t *p = data[plane] + y * linesize[plane] +
102 x * step + comp.offset_plus1 - 1;
104 if (shift + depth <= 8) {
105 p += !!(flags & PIX_FMT_BE);
107 *p |= (*src++ << shift);
112 if (flags & PIX_FMT_BE) {
113 uint16_t val = AV_RB16(p) | (*src++ << shift);
116 uint16_t val = AV_RL16(p) | (*src++ << shift);
125 const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
126 [AV_PIX_FMT_YUV420P] = {
132 { 0, 0, 1, 0, 7 }, /* Y */
133 { 1, 0, 1, 0, 7 }, /* U */
134 { 2, 0, 1, 0, 7 }, /* V */
136 .flags = PIX_FMT_PLANAR,
138 [AV_PIX_FMT_YUYV422] = {
144 { 0, 1, 1, 0, 7 }, /* Y */
145 { 0, 3, 2, 0, 7 }, /* U */
146 { 0, 3, 4, 0, 7 }, /* V */
149 [AV_PIX_FMT_RGB24] = {
155 { 0, 2, 1, 0, 7 }, /* R */
156 { 0, 2, 2, 0, 7 }, /* G */
157 { 0, 2, 3, 0, 7 }, /* B */
159 .flags = PIX_FMT_RGB,
161 [AV_PIX_FMT_BGR24] = {
167 { 0, 2, 1, 0, 7 }, /* B */
168 { 0, 2, 2, 0, 7 }, /* G */
169 { 0, 2, 3, 0, 7 }, /* R */
171 .flags = PIX_FMT_RGB,
173 [AV_PIX_FMT_YUV422P] = {
179 { 0, 0, 1, 0, 7 }, /* Y */
180 { 1, 0, 1, 0, 7 }, /* U */
181 { 2, 0, 1, 0, 7 }, /* V */
183 .flags = PIX_FMT_PLANAR,
185 [AV_PIX_FMT_YUV444P] = {
191 { 0, 0, 1, 0, 7 }, /* Y */
192 { 1, 0, 1, 0, 7 }, /* U */
193 { 2, 0, 1, 0, 7 }, /* V */
195 .flags = PIX_FMT_PLANAR,
197 [AV_PIX_FMT_YUV410P] = {
203 { 0, 0, 1, 0, 7 }, /* Y */
204 { 1, 0, 1, 0, 7 }, /* U */
205 { 2, 0, 1, 0, 7 }, /* V */
207 .flags = PIX_FMT_PLANAR,
209 [AV_PIX_FMT_YUV411P] = {
215 { 0, 0, 1, 0, 7 }, /* Y */
216 { 1, 0, 1, 0, 7 }, /* U */
217 { 2, 0, 1, 0, 7 }, /* V */
219 .flags = PIX_FMT_PLANAR,
221 [AV_PIX_FMT_GRAY8] = {
227 { 0, 0, 1, 0, 7 }, /* Y */
230 [AV_PIX_FMT_MONOWHITE] = {
236 { 0, 0, 1, 0, 0 }, /* Y */
238 .flags = PIX_FMT_BITSTREAM,
240 [AV_PIX_FMT_MONOBLACK] = {
246 { 0, 0, 1, 7, 0 }, /* Y */
248 .flags = PIX_FMT_BITSTREAM,
250 [AV_PIX_FMT_PAL8] = {
258 .flags = PIX_FMT_PAL,
260 [AV_PIX_FMT_YUVJ420P] = {
266 { 0, 0, 1, 0, 7 }, /* Y */
267 { 1, 0, 1, 0, 7 }, /* U */
268 { 2, 0, 1, 0, 7 }, /* V */
270 .flags = PIX_FMT_PLANAR,
272 [AV_PIX_FMT_YUVJ422P] = {
278 { 0, 0, 1, 0, 7 }, /* Y */
279 { 1, 0, 1, 0, 7 }, /* U */
280 { 2, 0, 1, 0, 7 }, /* V */
282 .flags = PIX_FMT_PLANAR,
284 [AV_PIX_FMT_YUVJ444P] = {
290 {0, 0, 1, 0, 7}, /* Y */
291 {1, 0, 1, 0, 7}, /* U */
292 {2, 0, 1, 0, 7}, /* V */
294 .flags = PIX_FMT_PLANAR,
296 [AV_PIX_FMT_XVMC_MPEG2_MC] = {
298 .flags = PIX_FMT_HWACCEL,
300 [AV_PIX_FMT_XVMC_MPEG2_IDCT] = {
302 .flags = PIX_FMT_HWACCEL,
304 [AV_PIX_FMT_UYVY422] = {
310 { 0, 1, 2, 0, 7 }, /* Y */
311 { 0, 3, 1, 0, 7 }, /* U */
312 { 0, 3, 3, 0, 7 }, /* V */
315 [AV_PIX_FMT_UYYVYY411] = {
321 { 0, 3, 2, 0, 7 }, /* Y */
322 { 0, 5, 1, 0, 7 }, /* U */
323 { 0, 5, 4, 0, 7 }, /* V */
326 [AV_PIX_FMT_BGR8] = {
332 { 0, 0, 1, 6, 1 }, /* B */
333 { 0, 0, 1, 3, 2 }, /* G */
334 { 0, 0, 1, 0, 2 }, /* R */
336 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
338 [AV_PIX_FMT_BGR4] = {
344 { 0, 3, 1, 0, 0 }, /* B */
345 { 0, 3, 2, 0, 1 }, /* G */
346 { 0, 3, 4, 0, 0 }, /* R */
348 .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
350 [AV_PIX_FMT_BGR4_BYTE] = {
356 { 0, 0, 1, 3, 0 }, /* B */
357 { 0, 0, 1, 1, 1 }, /* G */
358 { 0, 0, 1, 0, 0 }, /* R */
360 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
362 [AV_PIX_FMT_RGB8] = {
368 { 0, 0, 1, 6, 1 }, /* R */
369 { 0, 0, 1, 3, 2 }, /* G */
370 { 0, 0, 1, 0, 2 }, /* B */
372 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
374 [AV_PIX_FMT_RGB4] = {
380 { 0, 3, 1, 0, 0 }, /* R */
381 { 0, 3, 2, 0, 1 }, /* G */
382 { 0, 3, 4, 0, 0 }, /* B */
384 .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
386 [AV_PIX_FMT_RGB4_BYTE] = {
392 { 0, 0, 1, 3, 0 }, /* R */
393 { 0, 0, 1, 1, 1 }, /* G */
394 { 0, 0, 1, 0, 0 }, /* B */
396 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
398 [AV_PIX_FMT_NV12] = {
404 { 0, 0, 1, 0, 7 }, /* Y */
405 { 1, 1, 1, 0, 7 }, /* U */
406 { 1, 1, 2, 0, 7 }, /* V */
408 .flags = PIX_FMT_PLANAR,
410 [AV_PIX_FMT_NV21] = {
416 { 0, 0, 1, 0, 7 }, /* Y */
417 { 1, 1, 1, 0, 7 }, /* V */
418 { 1, 1, 2, 0, 7 }, /* U */
420 .flags = PIX_FMT_PLANAR,
422 [AV_PIX_FMT_ARGB] = {
428 { 0, 3, 1, 0, 7 }, /* A */
429 { 0, 3, 2, 0, 7 }, /* R */
430 { 0, 3, 3, 0, 7 }, /* G */
431 { 0, 3, 4, 0, 7 }, /* B */
433 .flags = PIX_FMT_RGB,
435 [AV_PIX_FMT_RGBA] = {
441 { 0, 3, 1, 0, 7 }, /* R */
442 { 0, 3, 2, 0, 7 }, /* G */
443 { 0, 3, 3, 0, 7 }, /* B */
444 { 0, 3, 4, 0, 7 }, /* A */
446 .flags = PIX_FMT_RGB,
448 [AV_PIX_FMT_ABGR] = {
454 { 0, 3, 1, 0, 7 }, /* A */
455 { 0, 3, 2, 0, 7 }, /* B */
456 { 0, 3, 3, 0, 7 }, /* G */
457 { 0, 3, 4, 0, 7 }, /* R */
459 .flags = PIX_FMT_RGB,
461 [AV_PIX_FMT_BGRA] = {
467 { 0, 3, 1, 0, 7 }, /* B */
468 { 0, 3, 2, 0, 7 }, /* G */
469 { 0, 3, 3, 0, 7 }, /* R */
470 { 0, 3, 4, 0, 7 }, /* A */
472 .flags = PIX_FMT_RGB,
474 [AV_PIX_FMT_GRAY16BE] = {
480 { 0, 1, 1, 0, 15 }, /* Y */
484 [AV_PIX_FMT_GRAY16LE] = {
490 { 0, 1, 1, 0, 15 }, /* Y */
493 [AV_PIX_FMT_YUV440P] = {
499 { 0, 0, 1, 0, 7 }, /* Y */
500 { 1, 0, 1, 0, 7 }, /* U */
501 { 2, 0, 1, 0, 7 }, /* V */
503 .flags = PIX_FMT_PLANAR,
505 [AV_PIX_FMT_YUVJ440P] = {
511 { 0, 0, 1, 0, 7 }, /* Y */
512 { 1, 0, 1, 0, 7 }, /* U */
513 { 2, 0, 1, 0, 7 }, /* V */
515 .flags = PIX_FMT_PLANAR,
517 [AV_PIX_FMT_YUVA420P] = {
523 { 0, 0, 1, 0, 7 }, /* Y */
524 { 1, 0, 1, 0, 7 }, /* U */
525 { 2, 0, 1, 0, 7 }, /* V */
526 { 3, 0, 1, 0, 7 }, /* A */
528 .flags = PIX_FMT_PLANAR,
530 [AV_PIX_FMT_VDPAU_H264] = {
531 .name = "vdpau_h264",
534 .flags = PIX_FMT_HWACCEL,
536 [AV_PIX_FMT_VDPAU_MPEG1] = {
537 .name = "vdpau_mpeg1",
540 .flags = PIX_FMT_HWACCEL,
542 [AV_PIX_FMT_VDPAU_MPEG2] = {
543 .name = "vdpau_mpeg2",
546 .flags = PIX_FMT_HWACCEL,
548 [AV_PIX_FMT_VDPAU_WMV3] = {
549 .name = "vdpau_wmv3",
552 .flags = PIX_FMT_HWACCEL,
554 [AV_PIX_FMT_VDPAU_VC1] = {
558 .flags = PIX_FMT_HWACCEL,
560 [AV_PIX_FMT_VDPAU_MPEG4] = {
561 .name = "vdpau_mpeg4",
564 .flags = PIX_FMT_HWACCEL,
566 [AV_PIX_FMT_RGB48BE] = {
572 { 0, 5, 1, 0, 15 }, /* R */
573 { 0, 5, 3, 0, 15 }, /* G */
574 { 0, 5, 5, 0, 15 }, /* B */
576 .flags = PIX_FMT_RGB | PIX_FMT_BE,
578 [AV_PIX_FMT_RGB48LE] = {
584 { 0, 5, 1, 0, 15 }, /* R */
585 { 0, 5, 3, 0, 15 }, /* G */
586 { 0, 5, 5, 0, 15 }, /* B */
588 .flags = PIX_FMT_RGB,
590 [AV_PIX_FMT_RGB565BE] = {
596 { 0, 1, 0, 3, 4 }, /* R */
597 { 0, 1, 1, 5, 5 }, /* G */
598 { 0, 1, 1, 0, 4 }, /* B */
600 .flags = PIX_FMT_BE | PIX_FMT_RGB,
602 [AV_PIX_FMT_RGB565LE] = {
608 { 0, 1, 2, 3, 4 }, /* R */
609 { 0, 1, 1, 5, 5 }, /* G */
610 { 0, 1, 1, 0, 4 }, /* B */
612 .flags = PIX_FMT_RGB,
614 [AV_PIX_FMT_RGB555BE] = {
620 { 0, 1, 0, 2, 4 }, /* R */
621 { 0, 1, 1, 5, 4 }, /* G */
622 { 0, 1, 1, 0, 4 }, /* B */
624 .flags = PIX_FMT_BE | PIX_FMT_RGB,
626 [AV_PIX_FMT_RGB555LE] = {
632 { 0, 1, 2, 2, 4 }, /* R */
633 { 0, 1, 1, 5, 4 }, /* G */
634 { 0, 1, 1, 0, 4 }, /* B */
636 .flags = PIX_FMT_RGB,
638 [AV_PIX_FMT_RGB444BE] = {
644 { 0, 1, 0, 0, 3 }, /* R */
645 { 0, 1, 1, 4, 3 }, /* G */
646 { 0, 1, 1, 0, 3 }, /* B */
648 .flags = PIX_FMT_BE | PIX_FMT_RGB,
650 [AV_PIX_FMT_RGB444LE] = {
656 { 0, 1, 2, 0, 3 }, /* R */
657 { 0, 1, 1, 4, 3 }, /* G */
658 { 0, 1, 1, 0, 3 }, /* B */
660 .flags = PIX_FMT_RGB,
662 [AV_PIX_FMT_BGR48BE] = {
668 { 0, 5, 1, 0, 15 }, /* B */
669 { 0, 5, 3, 0, 15 }, /* G */
670 { 0, 5, 5, 0, 15 }, /* R */
672 .flags = PIX_FMT_BE | PIX_FMT_RGB,
674 [AV_PIX_FMT_BGR48LE] = {
680 { 0, 5, 1, 0, 15 }, /* B */
681 { 0, 5, 3, 0, 15 }, /* G */
682 { 0, 5, 5, 0, 15 }, /* R */
684 .flags = PIX_FMT_RGB,
686 [AV_PIX_FMT_BGR565BE] = {
692 { 0, 1, 0, 3, 4 }, /* B */
693 { 0, 1, 1, 5, 5 }, /* G */
694 { 0, 1, 1, 0, 4 }, /* R */
696 .flags = PIX_FMT_BE | PIX_FMT_RGB,
698 [AV_PIX_FMT_BGR565LE] = {
704 { 0, 1, 2, 3, 4 }, /* B */
705 { 0, 1, 1, 5, 5 }, /* G */
706 { 0, 1, 1, 0, 4 }, /* R */
708 .flags = PIX_FMT_RGB,
710 [AV_PIX_FMT_BGR555BE] = {
716 { 0, 1, 0, 2, 4 }, /* B */
717 { 0, 1, 1, 5, 4 }, /* G */
718 { 0, 1, 1, 0, 4 }, /* R */
720 .flags = PIX_FMT_BE | PIX_FMT_RGB,
722 [AV_PIX_FMT_BGR555LE] = {
728 { 0, 1, 2, 2, 4 }, /* B */
729 { 0, 1, 1, 5, 4 }, /* G */
730 { 0, 1, 1, 0, 4 }, /* R */
732 .flags = PIX_FMT_RGB,
734 [AV_PIX_FMT_BGR444BE] = {
740 { 0, 1, 0, 0, 3 }, /* B */
741 { 0, 1, 1, 4, 3 }, /* G */
742 { 0, 1, 1, 0, 3 }, /* R */
744 .flags = PIX_FMT_BE | PIX_FMT_RGB,
746 [AV_PIX_FMT_BGR444LE] = {
752 { 0, 1, 2, 0, 3 }, /* B */
753 { 0, 1, 1, 4, 3 }, /* G */
754 { 0, 1, 1, 0, 3 }, /* R */
756 .flags = PIX_FMT_RGB,
758 [AV_PIX_FMT_VAAPI_MOCO] = {
759 .name = "vaapi_moco",
762 .flags = PIX_FMT_HWACCEL,
764 [AV_PIX_FMT_VAAPI_IDCT] = {
765 .name = "vaapi_idct",
768 .flags = PIX_FMT_HWACCEL,
770 [AV_PIX_FMT_VAAPI_VLD] = {
774 .flags = PIX_FMT_HWACCEL,
776 [AV_PIX_FMT_VDA_VLD] = {
780 .flags = PIX_FMT_HWACCEL,
782 [AV_PIX_FMT_YUV420P9LE] = {
783 .name = "yuv420p9le",
788 { 0, 1, 1, 0, 8 }, /* Y */
789 { 1, 1, 1, 0, 8 }, /* U */
790 { 2, 1, 1, 0, 8 }, /* V */
792 .flags = PIX_FMT_PLANAR,
794 [AV_PIX_FMT_YUV420P9BE] = {
795 .name = "yuv420p9be",
800 { 0, 1, 1, 0, 8 }, /* Y */
801 { 1, 1, 1, 0, 8 }, /* U */
802 { 2, 1, 1, 0, 8 }, /* V */
804 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
806 [AV_PIX_FMT_YUV420P10LE] = {
807 .name = "yuv420p10le",
812 { 0, 1, 1, 0, 9 }, /* Y */
813 { 1, 1, 1, 0, 9 }, /* U */
814 { 2, 1, 1, 0, 9 }, /* V */
816 .flags = PIX_FMT_PLANAR,
818 [AV_PIX_FMT_YUV420P10BE] = {
819 .name = "yuv420p10be",
824 { 0, 1, 1, 0, 9 }, /* Y */
825 { 1, 1, 1, 0, 9 }, /* U */
826 { 2, 1, 1, 0, 9 }, /* V */
828 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
830 [AV_PIX_FMT_YUV420P16LE] = {
831 .name = "yuv420p16le",
836 { 0, 1, 1, 0, 15 }, /* Y */
837 { 1, 1, 1, 0, 15 }, /* U */
838 { 2, 1, 1, 0, 15 }, /* V */
840 .flags = PIX_FMT_PLANAR,
842 [AV_PIX_FMT_YUV420P16BE] = {
843 .name = "yuv420p16be",
848 { 0, 1, 1, 0, 15 }, /* Y */
849 { 1, 1, 1, 0, 15 }, /* U */
850 { 2, 1, 1, 0, 15 }, /* V */
852 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
854 [AV_PIX_FMT_YUV422P9LE] = {
855 .name = "yuv422p9le",
860 { 0, 1, 1, 0, 8 }, /* Y */
861 { 1, 1, 1, 0, 8 }, /* U */
862 { 2, 1, 1, 0, 8 }, /* V */
864 .flags = PIX_FMT_PLANAR,
866 [AV_PIX_FMT_YUV422P9BE] = {
867 .name = "yuv422p9be",
872 { 0, 1, 1, 0, 8 }, /* Y */
873 { 1, 1, 1, 0, 8 }, /* U */
874 { 2, 1, 1, 0, 8 }, /* V */
876 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
878 [AV_PIX_FMT_YUV422P10LE] = {
879 .name = "yuv422p10le",
884 { 0, 1, 1, 0, 9 }, /* Y */
885 { 1, 1, 1, 0, 9 }, /* U */
886 { 2, 1, 1, 0, 9 }, /* V */
888 .flags = PIX_FMT_PLANAR,
890 [AV_PIX_FMT_YUV422P10BE] = {
891 .name = "yuv422p10be",
896 { 0, 1, 1, 0, 9 }, /* Y */
897 { 1, 1, 1, 0, 9 }, /* U */
898 { 2, 1, 1, 0, 9 }, /* V */
900 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
902 [AV_PIX_FMT_YUV422P16LE] = {
903 .name = "yuv422p16le",
908 { 0, 1, 1, 0, 15 }, /* Y */
909 { 1, 1, 1, 0, 15 }, /* U */
910 { 2, 1, 1, 0, 15 }, /* V */
912 .flags = PIX_FMT_PLANAR,
914 [AV_PIX_FMT_YUV422P16BE] = {
915 .name = "yuv422p16be",
920 { 0, 1, 1, 0, 15 }, /* Y */
921 { 1, 1, 1, 0, 15 }, /* U */
922 { 2, 1, 1, 0, 15 }, /* V */
924 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
926 [AV_PIX_FMT_YUV444P16LE] = {
927 .name = "yuv444p16le",
932 { 0, 1, 1, 0, 15 }, /* Y */
933 { 1, 1, 1, 0, 15 }, /* U */
934 { 2, 1, 1, 0, 15 }, /* V */
936 .flags = PIX_FMT_PLANAR,
938 [AV_PIX_FMT_YUV444P16BE] = {
939 .name = "yuv444p16be",
944 { 0, 1, 1, 0, 15 }, /* Y */
945 { 1, 1, 1, 0, 15 }, /* U */
946 { 2, 1, 1, 0, 15 }, /* V */
948 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
950 [AV_PIX_FMT_YUV444P10LE] = {
951 .name = "yuv444p10le",
956 { 0, 1, 1, 0, 9 }, /* Y */
957 { 1, 1, 1, 0, 9 }, /* U */
958 { 2, 1, 1, 0, 9 }, /* V */
960 .flags = PIX_FMT_PLANAR,
962 [AV_PIX_FMT_YUV444P10BE] = {
963 .name = "yuv444p10be",
968 { 0, 1, 1, 0, 9 }, /* Y */
969 { 1, 1, 1, 0, 9 }, /* U */
970 { 2, 1, 1, 0, 9 }, /* V */
972 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
974 [AV_PIX_FMT_YUV444P9LE] = {
975 .name = "yuv444p9le",
980 { 0, 1, 1, 0, 8 }, /* Y */
981 { 1, 1, 1, 0, 8 }, /* U */
982 { 2, 1, 1, 0, 8 }, /* V */
984 .flags = PIX_FMT_PLANAR,
986 [AV_PIX_FMT_YUV444P9BE] = {
987 .name = "yuv444p9be",
992 { 0, 1, 1, 0, 8 }, /* Y */
993 { 1, 1, 1, 0, 8 }, /* U */
994 { 2, 1, 1, 0, 8 }, /* V */
996 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
998 [AV_PIX_FMT_DXVA2_VLD] = {
1002 .flags = PIX_FMT_HWACCEL,
1004 [AV_PIX_FMT_Y400A] = {
1008 { 0, 1, 1, 0, 7 }, /* Y */
1009 { 0, 1, 2, 0, 7 }, /* A */
1012 [AV_PIX_FMT_GBRP] = {
1018 { 0, 0, 1, 0, 7 }, /* G */
1019 { 1, 0, 1, 0, 7 }, /* B */
1020 { 2, 0, 1, 0, 7 }, /* R */
1022 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1024 [AV_PIX_FMT_GBRP9LE] = {
1030 { 0, 1, 1, 0, 8 }, /* G */
1031 { 1, 1, 1, 0, 8 }, /* B */
1032 { 2, 1, 1, 0, 8 }, /* R */
1034 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1036 [AV_PIX_FMT_GBRP9BE] = {
1042 { 0, 1, 1, 0, 8 }, /* G */
1043 { 1, 1, 1, 0, 8 }, /* B */
1044 { 2, 1, 1, 0, 8 }, /* R */
1046 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1048 [AV_PIX_FMT_GBRP10LE] = {
1054 { 0, 1, 1, 0, 9 }, /* G */
1055 { 1, 1, 1, 0, 9 }, /* B */
1056 { 2, 1, 1, 0, 9 }, /* R */
1058 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1060 [AV_PIX_FMT_GBRP10BE] = {
1066 { 0, 1, 1, 0, 9 }, /* G */
1067 { 1, 1, 1, 0, 9 }, /* B */
1068 { 2, 1, 1, 0, 9 }, /* R */
1070 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1072 [AV_PIX_FMT_GBRP16LE] = {
1078 { 0, 1, 1, 0, 15 }, /* G */
1079 { 1, 1, 1, 0, 15 }, /* B */
1080 { 2, 1, 1, 0, 15 }, /* R */
1082 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1084 [AV_PIX_FMT_GBRP16BE] = {
1090 { 0, 1, 1, 0, 15 }, /* G */
1091 { 1, 1, 1, 0, 15 }, /* B */
1092 { 2, 1, 1, 0, 15 }, /* R */
1094 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1098 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1100 enum AVPixelFormat pix_fmt;
1102 for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1103 if (av_pix_fmt_descriptors[pix_fmt].name &&
1104 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1107 return AV_PIX_FMT_NONE;
1110 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
1112 return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1113 av_pix_fmt_descriptors[pix_fmt].name : NULL;
1117 # define X_NE(be, le) be
1119 # define X_NE(be, le) le
1122 enum AVPixelFormat av_get_pix_fmt(const char *name)
1124 enum AVPixelFormat pix_fmt;
1126 if (!strcmp(name, "rgb32"))
1127 name = X_NE("argb", "bgra");
1128 else if (!strcmp(name, "bgr32"))
1129 name = X_NE("abgr", "rgba");
1131 pix_fmt = get_pix_fmt_internal(name);
1132 if (pix_fmt == AV_PIX_FMT_NONE) {
1135 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1136 pix_fmt = get_pix_fmt_internal(name2);
1141 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1144 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1146 for (c = 0; c < pixdesc->nb_components; c++) {
1147 int s = c == 1 || c == 2 ? 0 : log2_pixels;
1148 bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1151 return bits >> log2_pixels;
1154 char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt)
1158 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1160 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1161 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1162 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));