2 * pixel format descriptor
3 * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
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.
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.
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
29 #include "intreadwrite.h"
31 void av_read_image_line(uint16_t *dst,
32 const uint8_t *data[4], const int linesize[4],
33 const AVPixFmtDescriptor *desc,
34 int x, int y, int c, int w,
35 int read_pal_component)
37 AVComponentDescriptor comp = desc->comp[c];
38 int plane = comp.plane;
39 int depth = comp.depth_minus1 + 1;
40 int mask = (1 << depth) - 1;
41 int shift = comp.shift;
42 int step = comp.step_minus1 + 1;
43 int flags = desc->flags;
45 if (flags & PIX_FMT_BITSTREAM) {
46 int skip = x * step + comp.offset_plus1 - 1;
47 const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
48 int shift = 8 - depth - (skip & 7);
51 int val = (*p >> shift) & mask;
52 if (read_pal_component)
53 val = data[1][4*val + c];
60 const uint8_t *p = data[plane] + y * linesize[plane] +
61 x * step + comp.offset_plus1 - 1;
62 int is_8bit = shift + depth <= 8;
65 p += !!(flags & PIX_FMT_BE);
68 int val = is_8bit ? *p :
69 flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
70 val = (val >> shift) & mask;
71 if (read_pal_component)
72 val = data[1][4 * val + c];
79 void av_write_image_line(const uint16_t *src,
80 uint8_t *data[4], const int linesize[4],
81 const AVPixFmtDescriptor *desc,
82 int x, int y, int c, int w)
84 AVComponentDescriptor comp = desc->comp[c];
85 int plane = comp.plane;
86 int depth = comp.depth_minus1 + 1;
87 int step = comp.step_minus1 + 1;
88 int flags = desc->flags;
90 if (flags & PIX_FMT_BITSTREAM) {
91 int skip = x * step + comp.offset_plus1 - 1;
92 uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
93 int shift = 8 - depth - (skip & 7);
96 *p |= *src++ << shift;
102 int shift = comp.shift;
103 uint8_t *p = data[plane] + y * linesize[plane] +
104 x * step + comp.offset_plus1 - 1;
106 if (shift + depth <= 8) {
107 p += !!(flags & PIX_FMT_BE);
109 *p |= (*src++ << shift);
114 if (flags & PIX_FMT_BE) {
115 uint16_t val = AV_RB16(p) | (*src++ << shift);
118 uint16_t val = AV_RL16(p) | (*src++ << shift);
127 #if !FF_API_PIX_FMT_DESC
130 const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
131 [AV_PIX_FMT_YUV420P] = {
137 { 0, 0, 1, 0, 7 }, /* Y */
138 { 1, 0, 1, 0, 7 }, /* U */
139 { 2, 0, 1, 0, 7 }, /* V */
141 .flags = PIX_FMT_PLANAR,
143 [AV_PIX_FMT_YUYV422] = {
149 { 0, 1, 1, 0, 7 }, /* Y */
150 { 0, 3, 2, 0, 7 }, /* U */
151 { 0, 3, 4, 0, 7 }, /* V */
154 [AV_PIX_FMT_RGB24] = {
160 { 0, 2, 1, 0, 7 }, /* R */
161 { 0, 2, 2, 0, 7 }, /* G */
162 { 0, 2, 3, 0, 7 }, /* B */
164 .flags = PIX_FMT_RGB,
166 [AV_PIX_FMT_BGR24] = {
172 { 0, 2, 3, 0, 7 }, /* R */
173 { 0, 2, 2, 0, 7 }, /* G */
174 { 0, 2, 1, 0, 7 }, /* B */
176 .flags = PIX_FMT_RGB,
178 [AV_PIX_FMT_YUV422P] = {
184 { 0, 0, 1, 0, 7 }, /* Y */
185 { 1, 0, 1, 0, 7 }, /* U */
186 { 2, 0, 1, 0, 7 }, /* V */
188 .flags = PIX_FMT_PLANAR,
190 [AV_PIX_FMT_YUV444P] = {
196 { 0, 0, 1, 0, 7 }, /* Y */
197 { 1, 0, 1, 0, 7 }, /* U */
198 { 2, 0, 1, 0, 7 }, /* V */
200 .flags = PIX_FMT_PLANAR,
202 [AV_PIX_FMT_YUV410P] = {
208 { 0, 0, 1, 0, 7 }, /* Y */
209 { 1, 0, 1, 0, 7 }, /* U */
210 { 2, 0, 1, 0, 7 }, /* V */
212 .flags = PIX_FMT_PLANAR,
214 [AV_PIX_FMT_YUV411P] = {
220 { 0, 0, 1, 0, 7 }, /* Y */
221 { 1, 0, 1, 0, 7 }, /* U */
222 { 2, 0, 1, 0, 7 }, /* V */
224 .flags = PIX_FMT_PLANAR,
226 [AV_PIX_FMT_GRAY8] = {
232 { 0, 0, 1, 0, 7 }, /* Y */
234 .flags = PIX_FMT_PSEUDOPAL,
236 [AV_PIX_FMT_MONOWHITE] = {
242 { 0, 0, 1, 0, 0 }, /* Y */
244 .flags = PIX_FMT_BITSTREAM,
246 [AV_PIX_FMT_MONOBLACK] = {
252 { 0, 0, 1, 7, 0 }, /* Y */
254 .flags = PIX_FMT_BITSTREAM,
256 [AV_PIX_FMT_PAL8] = {
264 .flags = PIX_FMT_PAL,
266 [AV_PIX_FMT_YUVJ420P] = {
272 { 0, 0, 1, 0, 7 }, /* Y */
273 { 1, 0, 1, 0, 7 }, /* U */
274 { 2, 0, 1, 0, 7 }, /* V */
276 .flags = PIX_FMT_PLANAR,
278 [AV_PIX_FMT_YUVJ422P] = {
284 { 0, 0, 1, 0, 7 }, /* Y */
285 { 1, 0, 1, 0, 7 }, /* U */
286 { 2, 0, 1, 0, 7 }, /* V */
288 .flags = PIX_FMT_PLANAR,
290 [AV_PIX_FMT_YUVJ444P] = {
296 { 0, 0, 1, 0, 7 }, /* Y */
297 { 1, 0, 1, 0, 7 }, /* U */
298 { 2, 0, 1, 0, 7 }, /* V */
300 .flags = PIX_FMT_PLANAR,
302 [AV_PIX_FMT_XVMC_MPEG2_MC] = {
304 .flags = PIX_FMT_HWACCEL,
306 [AV_PIX_FMT_XVMC_MPEG2_IDCT] = {
308 .flags = PIX_FMT_HWACCEL,
310 [AV_PIX_FMT_UYVY422] = {
316 { 0, 1, 2, 0, 7 }, /* Y */
317 { 0, 3, 1, 0, 7 }, /* U */
318 { 0, 3, 3, 0, 7 }, /* V */
321 [AV_PIX_FMT_UYYVYY411] = {
327 { 0, 3, 2, 0, 7 }, /* Y */
328 { 0, 5, 1, 0, 7 }, /* U */
329 { 0, 5, 4, 0, 7 }, /* V */
332 [AV_PIX_FMT_BGR8] = {
338 { 0, 0, 1, 0, 2 }, /* R */
339 { 0, 0, 1, 3, 2 }, /* G */
340 { 0, 0, 1, 6, 1 }, /* B */
342 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
344 [AV_PIX_FMT_BGR4] = {
350 { 0, 3, 4, 0, 0 }, /* R */
351 { 0, 3, 2, 0, 1 }, /* G */
352 { 0, 3, 1, 0, 0 }, /* B */
354 .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
356 [AV_PIX_FMT_BGR4_BYTE] = {
362 { 0, 0, 1, 0, 0 }, /* R */
363 { 0, 0, 1, 1, 1 }, /* G */
364 { 0, 0, 1, 3, 0 }, /* B */
366 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
368 [AV_PIX_FMT_RGB8] = {
374 { 0, 0, 1, 6, 1 }, /* R */
375 { 0, 0, 1, 3, 2 }, /* G */
376 { 0, 0, 1, 0, 2 }, /* B */
378 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
380 [AV_PIX_FMT_RGB4] = {
386 { 0, 3, 1, 0, 0 }, /* R */
387 { 0, 3, 2, 0, 1 }, /* G */
388 { 0, 3, 4, 0, 0 }, /* B */
390 .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
392 [AV_PIX_FMT_RGB4_BYTE] = {
398 { 0, 0, 1, 3, 0 }, /* R */
399 { 0, 0, 1, 1, 1 }, /* G */
400 { 0, 0, 1, 0, 0 }, /* B */
402 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
404 [AV_PIX_FMT_NV12] = {
410 { 0, 0, 1, 0, 7 }, /* Y */
411 { 1, 1, 1, 0, 7 }, /* U */
412 { 1, 1, 2, 0, 7 }, /* V */
414 .flags = PIX_FMT_PLANAR,
416 [AV_PIX_FMT_NV21] = {
422 { 0, 0, 1, 0, 7 }, /* Y */
423 { 1, 1, 2, 0, 7 }, /* U */
424 { 1, 1, 1, 0, 7 }, /* V */
426 .flags = PIX_FMT_PLANAR,
428 [AV_PIX_FMT_ARGB] = {
434 { 0, 3, 2, 0, 7 }, /* R */
435 { 0, 3, 3, 0, 7 }, /* G */
436 { 0, 3, 4, 0, 7 }, /* B */
437 { 0, 3, 1, 0, 7 }, /* A */
439 .flags = PIX_FMT_RGB,
441 [AV_PIX_FMT_RGBA] = {
447 { 0, 3, 1, 0, 7 }, /* R */
448 { 0, 3, 2, 0, 7 }, /* G */
449 { 0, 3, 3, 0, 7 }, /* B */
450 { 0, 3, 4, 0, 7 }, /* A */
452 .flags = PIX_FMT_RGB,
454 [AV_PIX_FMT_ABGR] = {
460 { 0, 3, 4, 0, 7 }, /* R */
461 { 0, 3, 3, 0, 7 }, /* G */
462 { 0, 3, 2, 0, 7 }, /* B */
463 { 0, 3, 1, 0, 7 }, /* A */
465 .flags = PIX_FMT_RGB,
467 [AV_PIX_FMT_BGRA] = {
473 { 0, 3, 3, 0, 7 }, /* R */
474 { 0, 3, 2, 0, 7 }, /* G */
475 { 0, 3, 1, 0, 7 }, /* B */
476 { 0, 3, 4, 0, 7 }, /* A */
478 .flags = PIX_FMT_RGB,
480 [AV_PIX_FMT_0RGB] = {
486 { 0, 3, 2, 0, 7 }, /* R */
487 { 0, 3, 3, 0, 7 }, /* G */
488 { 0, 3, 4, 0, 7 }, /* B */
490 .flags = PIX_FMT_RGB,
492 [AV_PIX_FMT_RGB0] = {
498 { 0, 3, 1, 0, 7 }, /* R */
499 { 0, 3, 2, 0, 7 }, /* G */
500 { 0, 3, 3, 0, 7 }, /* B */
501 { 0, 3, 4, 0, 7 }, /* A */
503 .flags = PIX_FMT_RGB,
505 [AV_PIX_FMT_0BGR] = {
511 { 0, 3, 4, 0, 7 }, /* R */
512 { 0, 3, 3, 0, 7 }, /* G */
513 { 0, 3, 2, 0, 7 }, /* B */
515 .flags = PIX_FMT_RGB,
517 [AV_PIX_FMT_BGR0] = {
523 { 0, 3, 3, 0, 7 }, /* R */
524 { 0, 3, 2, 0, 7 }, /* G */
525 { 0, 3, 1, 0, 7 }, /* B */
526 { 0, 3, 4, 0, 7 }, /* A */
528 .flags = PIX_FMT_RGB,
530 [AV_PIX_FMT_GRAY16BE] = {
536 { 0, 1, 1, 0, 15 }, /* Y */
540 [AV_PIX_FMT_GRAY16LE] = {
546 { 0, 1, 1, 0, 15 }, /* Y */
549 [AV_PIX_FMT_YUV440P] = {
555 { 0, 0, 1, 0, 7 }, /* Y */
556 { 1, 0, 1, 0, 7 }, /* U */
557 { 2, 0, 1, 0, 7 }, /* V */
559 .flags = PIX_FMT_PLANAR,
561 [AV_PIX_FMT_YUVJ440P] = {
567 { 0, 0, 1, 0, 7 }, /* Y */
568 { 1, 0, 1, 0, 7 }, /* U */
569 { 2, 0, 1, 0, 7 }, /* V */
571 .flags = PIX_FMT_PLANAR,
573 [AV_PIX_FMT_YUVA420P] = {
579 { 0, 0, 1, 0, 7 }, /* Y */
580 { 1, 0, 1, 0, 7 }, /* U */
581 { 2, 0, 1, 0, 7 }, /* V */
582 { 3, 0, 1, 0, 7 }, /* A */
584 .flags = PIX_FMT_PLANAR,
586 [AV_PIX_FMT_YUVA422P] = {
592 { 0, 0, 1, 0, 7 }, /* Y */
593 { 1, 0, 1, 0, 7 }, /* U */
594 { 2, 0, 1, 0, 7 }, /* V */
595 { 3, 0, 1, 0, 7 }, /* A */
597 .flags = PIX_FMT_PLANAR,
599 [AV_PIX_FMT_YUVA444P] = {
605 { 0, 0, 1, 0, 7 }, /* Y */
606 { 1, 0, 1, 0, 7 }, /* U */
607 { 2, 0, 1, 0, 7 }, /* V */
608 { 3, 0, 1, 0, 7 }, /* A */
610 .flags = PIX_FMT_PLANAR,
612 [AV_PIX_FMT_VDPAU_H264] = {
613 .name = "vdpau_h264",
616 .flags = PIX_FMT_HWACCEL,
618 [AV_PIX_FMT_VDPAU_MPEG1] = {
619 .name = "vdpau_mpeg1",
622 .flags = PIX_FMT_HWACCEL,
624 [AV_PIX_FMT_VDPAU_MPEG2] = {
625 .name = "vdpau_mpeg2",
628 .flags = PIX_FMT_HWACCEL,
630 [AV_PIX_FMT_VDPAU_WMV3] = {
631 .name = "vdpau_wmv3",
634 .flags = PIX_FMT_HWACCEL,
636 [AV_PIX_FMT_VDPAU_VC1] = {
640 .flags = PIX_FMT_HWACCEL,
642 [AV_PIX_FMT_VDPAU_MPEG4] = {
643 .name = "vdpau_mpeg4",
646 .flags = PIX_FMT_HWACCEL,
648 [AV_PIX_FMT_RGB48BE] = {
654 { 0, 5, 1, 0, 15 }, /* R */
655 { 0, 5, 3, 0, 15 }, /* G */
656 { 0, 5, 5, 0, 15 }, /* B */
658 .flags = PIX_FMT_RGB | PIX_FMT_BE,
660 [AV_PIX_FMT_RGB48LE] = {
666 { 0, 5, 1, 0, 15 }, /* R */
667 { 0, 5, 3, 0, 15 }, /* G */
668 { 0, 5, 5, 0, 15 }, /* B */
670 .flags = PIX_FMT_RGB,
672 [AV_PIX_FMT_RGBA64BE] = {
678 { 0, 7, 1, 0, 15 }, /* R */
679 { 0, 7, 3, 0, 15 }, /* G */
680 { 0, 7, 5, 0, 15 }, /* B */
681 { 0, 7, 7, 0, 15 }, /* A */
683 .flags = PIX_FMT_RGB | PIX_FMT_BE,
685 [AV_PIX_FMT_RGBA64LE] = {
691 { 0, 7, 1, 0, 15 }, /* R */
692 { 0, 7, 3, 0, 15 }, /* G */
693 { 0, 7, 5, 0, 15 }, /* B */
694 { 0, 7, 7, 0, 15 }, /* A */
696 .flags = PIX_FMT_RGB,
698 [AV_PIX_FMT_RGB565BE] = {
704 { 0, 1, 0, 3, 4 }, /* R */
705 { 0, 1, 1, 5, 5 }, /* G */
706 { 0, 1, 1, 0, 4 }, /* B */
708 .flags = PIX_FMT_BE | PIX_FMT_RGB,
710 [AV_PIX_FMT_RGB565LE] = {
716 { 0, 1, 2, 3, 4 }, /* R */
717 { 0, 1, 1, 5, 5 }, /* G */
718 { 0, 1, 1, 0, 4 }, /* B */
720 .flags = PIX_FMT_RGB,
722 [AV_PIX_FMT_RGB555BE] = {
728 { 0, 1, 0, 2, 4 }, /* R */
729 { 0, 1, 1, 5, 4 }, /* G */
730 { 0, 1, 1, 0, 4 }, /* B */
732 .flags = PIX_FMT_BE | PIX_FMT_RGB,
734 [AV_PIX_FMT_RGB555LE] = {
740 { 0, 1, 2, 2, 4 }, /* R */
741 { 0, 1, 1, 5, 4 }, /* G */
742 { 0, 1, 1, 0, 4 }, /* B */
744 .flags = PIX_FMT_RGB,
746 [AV_PIX_FMT_RGB444BE] = {
752 { 0, 1, 0, 0, 3 }, /* R */
753 { 0, 1, 1, 4, 3 }, /* G */
754 { 0, 1, 1, 0, 3 }, /* B */
756 .flags = PIX_FMT_BE | PIX_FMT_RGB,
758 [AV_PIX_FMT_RGB444LE] = {
764 { 0, 1, 2, 0, 3 }, /* R */
765 { 0, 1, 1, 4, 3 }, /* G */
766 { 0, 1, 1, 0, 3 }, /* B */
768 .flags = PIX_FMT_RGB,
770 [AV_PIX_FMT_BGR48BE] = {
776 { 0, 5, 5, 0, 15 }, /* R */
777 { 0, 5, 3, 0, 15 }, /* G */
778 { 0, 5, 1, 0, 15 }, /* B */
780 .flags = PIX_FMT_BE | PIX_FMT_RGB,
782 [AV_PIX_FMT_BGR48LE] = {
788 { 0, 5, 5, 0, 15 }, /* R */
789 { 0, 5, 3, 0, 15 }, /* G */
790 { 0, 5, 1, 0, 15 }, /* B */
792 .flags = PIX_FMT_RGB,
794 [AV_PIX_FMT_BGRA64BE] = {
800 { 0, 7, 5, 0, 15 }, /* R */
801 { 0, 7, 3, 0, 15 }, /* G */
802 { 0, 7, 1, 0, 15 }, /* B */
803 { 0, 7, 7, 0, 15 }, /* A */
805 .flags = PIX_FMT_BE | PIX_FMT_RGB,
807 [AV_PIX_FMT_BGRA64LE] = {
813 { 0, 7, 5, 0, 15 }, /* R */
814 { 0, 7, 3, 0, 15 }, /* G */
815 { 0, 7, 1, 0, 15 }, /* B */
816 { 0, 7, 7, 0, 15 }, /* A */
818 .flags = PIX_FMT_RGB,
820 [AV_PIX_FMT_BGR565BE] = {
826 { 0, 1, 1, 0, 4 }, /* R */
827 { 0, 1, 1, 5, 5 }, /* G */
828 { 0, 1, 0, 3, 4 }, /* B */
830 .flags = PIX_FMT_BE | PIX_FMT_RGB,
832 [AV_PIX_FMT_BGR565LE] = {
838 { 0, 1, 1, 0, 4 }, /* R */
839 { 0, 1, 1, 5, 5 }, /* G */
840 { 0, 1, 2, 3, 4 }, /* B */
842 .flags = PIX_FMT_RGB,
844 [AV_PIX_FMT_BGR555BE] = {
850 { 0, 1, 1, 0, 4 }, /* R */
851 { 0, 1, 1, 5, 4 }, /* G */
852 { 0, 1, 0, 2, 4 }, /* B */
854 .flags = PIX_FMT_BE | PIX_FMT_RGB,
856 [AV_PIX_FMT_BGR555LE] = {
862 { 0, 1, 1, 0, 4 }, /* R */
863 { 0, 1, 1, 5, 4 }, /* G */
864 { 0, 1, 2, 2, 4 }, /* B */
866 .flags = PIX_FMT_RGB,
868 [AV_PIX_FMT_BGR444BE] = {
874 { 0, 1, 1, 0, 3 }, /* R */
875 { 0, 1, 1, 4, 3 }, /* G */
876 { 0, 1, 0, 0, 3 }, /* B */
878 .flags = PIX_FMT_BE | PIX_FMT_RGB,
880 [AV_PIX_FMT_BGR444LE] = {
886 { 0, 1, 1, 0, 3 }, /* R */
887 { 0, 1, 1, 4, 3 }, /* G */
888 { 0, 1, 2, 0, 3 }, /* B */
890 .flags = PIX_FMT_RGB,
892 [AV_PIX_FMT_VAAPI_MOCO] = {
893 .name = "vaapi_moco",
896 .flags = PIX_FMT_HWACCEL,
898 [AV_PIX_FMT_VAAPI_IDCT] = {
899 .name = "vaapi_idct",
902 .flags = PIX_FMT_HWACCEL,
904 [AV_PIX_FMT_VAAPI_VLD] = {
908 .flags = PIX_FMT_HWACCEL,
910 [AV_PIX_FMT_YUV420P9LE] = {
911 .name = "yuv420p9le",
916 { 0, 1, 1, 0, 8 }, /* Y */
917 { 1, 1, 1, 0, 8 }, /* U */
918 { 2, 1, 1, 0, 8 }, /* V */
920 .flags = PIX_FMT_PLANAR,
922 [AV_PIX_FMT_YUV420P9BE] = {
923 .name = "yuv420p9be",
928 { 0, 1, 1, 0, 8 }, /* Y */
929 { 1, 1, 1, 0, 8 }, /* U */
930 { 2, 1, 1, 0, 8 }, /* V */
932 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
934 [AV_PIX_FMT_YUV420P10LE] = {
935 .name = "yuv420p10le",
940 { 0, 1, 1, 0, 9 }, /* Y */
941 { 1, 1, 1, 0, 9 }, /* U */
942 { 2, 1, 1, 0, 9 }, /* V */
944 .flags = PIX_FMT_PLANAR,
946 [AV_PIX_FMT_YUV420P10BE] = {
947 .name = "yuv420p10be",
952 { 0, 1, 1, 0, 9 }, /* Y */
953 { 1, 1, 1, 0, 9 }, /* U */
954 { 2, 1, 1, 0, 9 }, /* V */
956 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
958 [AV_PIX_FMT_YUV420P12LE] = {
959 .name = "yuv420p12le",
964 { 0, 1, 1, 0, 11 }, /* Y */
965 { 1, 1, 1, 0, 11 }, /* U */
966 { 2, 1, 1, 0, 11 }, /* V */
968 .flags = PIX_FMT_PLANAR,
970 [AV_PIX_FMT_YUV420P12BE] = {
971 .name = "yuv420p12be",
976 { 0, 1, 1, 0, 11 }, /* Y */
977 { 1, 1, 1, 0, 11 }, /* U */
978 { 2, 1, 1, 0, 11 }, /* V */
980 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
982 [AV_PIX_FMT_YUV420P14LE] = {
983 .name = "yuv420p14le",
988 { 0, 1, 1, 0, 13 }, /* Y */
989 { 1, 1, 1, 0, 13 }, /* U */
990 { 2, 1, 1, 0, 13 }, /* V */
992 .flags = PIX_FMT_PLANAR,
994 [AV_PIX_FMT_YUV420P14BE] = {
995 .name = "yuv420p14be",
1000 { 0, 1, 1, 0, 13 }, /* Y */
1001 { 1, 1, 1, 0, 13 }, /* U */
1002 { 2, 1, 1, 0, 13 }, /* V */
1004 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1006 [AV_PIX_FMT_YUV420P16LE] = {
1007 .name = "yuv420p16le",
1012 { 0, 1, 1, 0, 15 }, /* Y */
1013 { 1, 1, 1, 0, 15 }, /* U */
1014 { 2, 1, 1, 0, 15 }, /* V */
1016 .flags = PIX_FMT_PLANAR,
1018 [AV_PIX_FMT_YUV420P16BE] = {
1019 .name = "yuv420p16be",
1024 { 0, 1, 1, 0, 15 }, /* Y */
1025 { 1, 1, 1, 0, 15 }, /* U */
1026 { 2, 1, 1, 0, 15 }, /* V */
1028 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1030 [AV_PIX_FMT_YUV422P9LE] = {
1031 .name = "yuv422p9le",
1036 { 0, 1, 1, 0, 8 }, /* Y */
1037 { 1, 1, 1, 0, 8 }, /* U */
1038 { 2, 1, 1, 0, 8 }, /* V */
1040 .flags = PIX_FMT_PLANAR,
1042 [AV_PIX_FMT_YUV422P9BE] = {
1043 .name = "yuv422p9be",
1048 { 0, 1, 1, 0, 8 }, /* Y */
1049 { 1, 1, 1, 0, 8 }, /* U */
1050 { 2, 1, 1, 0, 8 }, /* V */
1052 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1054 [AV_PIX_FMT_YUV422P10LE] = {
1055 .name = "yuv422p10le",
1060 { 0, 1, 1, 0, 9 }, /* Y */
1061 { 1, 1, 1, 0, 9 }, /* U */
1062 { 2, 1, 1, 0, 9 }, /* V */
1064 .flags = PIX_FMT_PLANAR,
1066 [AV_PIX_FMT_YUV422P10BE] = {
1067 .name = "yuv422p10be",
1072 { 0, 1, 1, 0, 9 }, /* Y */
1073 { 1, 1, 1, 0, 9 }, /* U */
1074 { 2, 1, 1, 0, 9 }, /* V */
1076 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1078 [AV_PIX_FMT_YUV422P12LE] = {
1079 .name = "yuv422p12le",
1084 { 0, 1, 1, 0, 11 }, /* Y */
1085 { 1, 1, 1, 0, 11 }, /* U */
1086 { 2, 1, 1, 0, 11 }, /* V */
1088 .flags = PIX_FMT_PLANAR,
1090 [AV_PIX_FMT_YUV422P12BE] = {
1091 .name = "yuv422p12be",
1096 { 0, 1, 1, 0, 11 }, /* Y */
1097 { 1, 1, 1, 0, 11 }, /* U */
1098 { 2, 1, 1, 0, 11 }, /* V */
1100 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1102 [AV_PIX_FMT_YUV422P14LE] = {
1103 .name = "yuv422p14le",
1108 { 0, 1, 1, 0, 13 }, /* Y */
1109 { 1, 1, 1, 0, 13 }, /* U */
1110 { 2, 1, 1, 0, 13 }, /* V */
1112 .flags = PIX_FMT_PLANAR,
1114 [AV_PIX_FMT_YUV422P14BE] = {
1115 .name = "yuv422p14be",
1120 { 0, 1, 1, 0, 13 }, /* Y */
1121 { 1, 1, 1, 0, 13 }, /* U */
1122 { 2, 1, 1, 0, 13 }, /* V */
1124 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1126 [AV_PIX_FMT_YUV422P16LE] = {
1127 .name = "yuv422p16le",
1132 { 0, 1, 1, 0, 15 }, /* Y */
1133 { 1, 1, 1, 0, 15 }, /* U */
1134 { 2, 1, 1, 0, 15 }, /* V */
1136 .flags = PIX_FMT_PLANAR,
1138 [AV_PIX_FMT_YUV422P16BE] = {
1139 .name = "yuv422p16be",
1144 { 0, 1, 1, 0, 15 }, /* Y */
1145 { 1, 1, 1, 0, 15 }, /* U */
1146 { 2, 1, 1, 0, 15 }, /* V */
1148 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1150 [AV_PIX_FMT_YUV444P16LE] = {
1151 .name = "yuv444p16le",
1156 { 0, 1, 1, 0, 15 }, /* Y */
1157 { 1, 1, 1, 0, 15 }, /* U */
1158 { 2, 1, 1, 0, 15 }, /* V */
1160 .flags = PIX_FMT_PLANAR,
1162 [AV_PIX_FMT_YUV444P16BE] = {
1163 .name = "yuv444p16be",
1168 { 0, 1, 1, 0, 15 }, /* Y */
1169 { 1, 1, 1, 0, 15 }, /* U */
1170 { 2, 1, 1, 0, 15 }, /* V */
1172 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1174 [AV_PIX_FMT_YUV444P10LE] = {
1175 .name = "yuv444p10le",
1180 { 0, 1, 1, 0, 9 }, /* Y */
1181 { 1, 1, 1, 0, 9 }, /* U */
1182 { 2, 1, 1, 0, 9 }, /* V */
1184 .flags = PIX_FMT_PLANAR,
1186 [AV_PIX_FMT_YUV444P10BE] = {
1187 .name = "yuv444p10be",
1192 { 0, 1, 1, 0, 9 }, /* Y */
1193 { 1, 1, 1, 0, 9 }, /* U */
1194 { 2, 1, 1, 0, 9 }, /* V */
1196 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1198 [AV_PIX_FMT_YUV444P9LE] = {
1199 .name = "yuv444p9le",
1204 { 0, 1, 1, 0, 8 }, /* Y */
1205 { 1, 1, 1, 0, 8 }, /* U */
1206 { 2, 1, 1, 0, 8 }, /* V */
1208 .flags = PIX_FMT_PLANAR,
1210 [AV_PIX_FMT_YUV444P9BE] = {
1211 .name = "yuv444p9be",
1216 { 0, 1, 1, 0, 8 }, /* Y */
1217 { 1, 1, 1, 0, 8 }, /* U */
1218 { 2, 1, 1, 0, 8 }, /* V */
1220 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1222 [AV_PIX_FMT_YUV444P12LE] = {
1223 .name = "yuv444p12le",
1228 { 0, 1, 1, 0, 11 }, /* Y */
1229 { 1, 1, 1, 0, 11 }, /* U */
1230 { 2, 1, 1, 0, 11 }, /* V */
1232 .flags = PIX_FMT_PLANAR,
1234 [AV_PIX_FMT_YUV444P12BE] = {
1235 .name = "yuv444p12be",
1240 { 0, 1, 1, 0, 11 }, /* Y */
1241 { 1, 1, 1, 0, 11 }, /* U */
1242 { 2, 1, 1, 0, 11 }, /* V */
1244 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1246 [AV_PIX_FMT_YUV444P14LE] = {
1247 .name = "yuv444p14le",
1252 { 0, 1, 1, 0, 13 }, /* Y */
1253 { 1, 1, 1, 0, 13 }, /* U */
1254 { 2, 1, 1, 0, 13 }, /* V */
1256 .flags = PIX_FMT_PLANAR,
1258 [AV_PIX_FMT_YUV444P14BE] = {
1259 .name = "yuv444p14be",
1264 { 0, 1, 1, 0, 13 }, /* Y */
1265 { 1, 1, 1, 0, 13 }, /* U */
1266 { 2, 1, 1, 0, 13 }, /* V */
1268 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
1270 [AV_PIX_FMT_DXVA2_VLD] = {
1271 .name = "dxva2_vld",
1274 .flags = PIX_FMT_HWACCEL,
1276 [AV_PIX_FMT_VDA_VLD] = {
1280 .flags = PIX_FMT_HWACCEL,
1282 [AV_PIX_FMT_GRAY8A] = {
1286 { 0, 1, 1, 0, 7 }, /* Y */
1287 { 0, 1, 2, 0, 7 }, /* A */
1290 [AV_PIX_FMT_GBRP] = {
1296 { 2, 0, 1, 0, 7 }, /* R */
1297 { 0, 0, 1, 0, 7 }, /* G */
1298 { 1, 0, 1, 0, 7 }, /* B */
1300 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1302 [AV_PIX_FMT_GBRP9LE] = {
1308 { 2, 1, 1, 0, 8 }, /* R */
1309 { 0, 1, 1, 0, 8 }, /* G */
1310 { 1, 1, 1, 0, 8 }, /* B */
1312 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1314 [AV_PIX_FMT_GBRP9BE] = {
1320 { 2, 1, 1, 0, 8 }, /* R */
1321 { 0, 1, 1, 0, 8 }, /* G */
1322 { 1, 1, 1, 0, 8 }, /* B */
1324 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1326 [AV_PIX_FMT_GBRP10LE] = {
1332 { 2, 1, 1, 0, 9 }, /* R */
1333 { 0, 1, 1, 0, 9 }, /* G */
1334 { 1, 1, 1, 0, 9 }, /* B */
1336 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1338 [AV_PIX_FMT_GBRP10BE] = {
1344 { 2, 1, 1, 0, 9 }, /* R */
1345 { 0, 1, 1, 0, 9 }, /* G */
1346 { 1, 1, 1, 0, 9 }, /* B */
1348 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1350 [AV_PIX_FMT_GBRP12LE] = {
1356 { 2, 1, 1, 0, 11 }, /* R */
1357 { 0, 1, 1, 0, 11 }, /* G */
1358 { 1, 1, 1, 0, 11 }, /* B */
1360 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1362 [AV_PIX_FMT_GBRP12BE] = {
1368 { 2, 1, 1, 0, 11 }, /* R */
1369 { 0, 1, 1, 0, 11 }, /* G */
1370 { 1, 1, 1, 0, 11 }, /* B */
1372 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1374 [AV_PIX_FMT_GBRP14LE] = {
1380 { 2, 1, 1, 0, 13 }, /* R */
1381 { 0, 1, 1, 0, 13 }, /* G */
1382 { 1, 1, 1, 0, 13 }, /* B */
1384 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1386 [AV_PIX_FMT_GBRP14BE] = {
1392 { 2, 1, 1, 0, 13 }, /* R */
1393 { 0, 1, 1, 0, 13 }, /* G */
1394 { 1, 1, 1, 0, 13 }, /* B */
1396 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1398 [AV_PIX_FMT_GBRP16LE] = {
1404 { 2, 1, 1, 0, 15 }, /* R */
1405 { 0, 1, 1, 0, 15 }, /* G */
1406 { 1, 1, 1, 0, 15 }, /* B */
1408 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1410 [AV_PIX_FMT_GBRP16BE] = {
1416 { 2, 1, 1, 0, 15 }, /* R */
1417 { 0, 1, 1, 0, 15 }, /* G */
1418 { 1, 1, 1, 0, 15 }, /* B */
1420 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1424 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1426 enum AVPixelFormat pix_fmt;
1428 for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1429 if (av_pix_fmt_descriptors[pix_fmt].name &&
1430 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1433 return AV_PIX_FMT_NONE;
1436 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
1438 return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1439 av_pix_fmt_descriptors[pix_fmt].name : NULL;
1443 # define X_NE(be, le) be
1445 # define X_NE(be, le) le
1448 enum AVPixelFormat av_get_pix_fmt(const char *name)
1450 enum AVPixelFormat pix_fmt;
1452 if (!strcmp(name, "rgb32"))
1453 name = X_NE("argb", "bgra");
1454 else if (!strcmp(name, "bgr32"))
1455 name = X_NE("abgr", "rgba");
1457 pix_fmt = get_pix_fmt_internal(name);
1458 if (pix_fmt == AV_PIX_FMT_NONE) {
1461 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1462 pix_fmt = get_pix_fmt_internal(name2);
1467 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1470 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1472 for (c = 0; c < pixdesc->nb_components; c++) {
1473 int s = c == 1 || c == 2 ? 0 : log2_pixels;
1474 bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1477 return bits >> log2_pixels;
1480 char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt)
1484 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1486 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1487 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1488 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1494 const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
1496 if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
1498 return &av_pix_fmt_descriptors[pix_fmt];
1501 const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
1504 return &av_pix_fmt_descriptors[0];
1505 if (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1)
1510 enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
1512 if (desc < av_pix_fmt_descriptors ||
1513 desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
1514 return AV_PIX_FMT_NONE;
1516 return desc - av_pix_fmt_descriptors;