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
30 #include "intreadwrite.h"
34 void av_read_image_line(uint16_t *dst,
35 const uint8_t *data[4], const int linesize[4],
36 const AVPixFmtDescriptor *desc,
37 int x, int y, int c, int w,
38 int read_pal_component)
40 AVComponentDescriptor comp = desc->comp[c];
41 int plane = comp.plane;
42 int depth = comp.depth_minus1 + 1;
43 int mask = (1 << depth) - 1;
44 int shift = comp.shift;
45 int step = comp.step_minus1 + 1;
46 int flags = desc->flags;
48 if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
49 int skip = x * step + comp.offset_plus1 - 1;
50 const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
51 int shift = 8 - depth - (skip & 7);
54 int val = (*p >> shift) & mask;
55 if (read_pal_component)
56 val = data[1][4*val + c];
63 const uint8_t *p = data[plane] + y * linesize[plane] +
64 x * step + comp.offset_plus1 - 1;
65 int is_8bit = shift + depth <= 8;
68 p += !!(flags & AV_PIX_FMT_FLAG_BE);
71 int val = is_8bit ? *p :
72 flags & AV_PIX_FMT_FLAG_BE ? AV_RB16(p) : AV_RL16(p);
73 val = (val >> shift) & mask;
74 if (read_pal_component)
75 val = data[1][4 * val + c];
82 void av_write_image_line(const uint16_t *src,
83 uint8_t *data[4], const int linesize[4],
84 const AVPixFmtDescriptor *desc,
85 int x, int y, int c, int w)
87 AVComponentDescriptor comp = desc->comp[c];
88 int plane = comp.plane;
89 int depth = comp.depth_minus1 + 1;
90 int step = comp.step_minus1 + 1;
91 int flags = desc->flags;
93 if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
94 int skip = x * step + comp.offset_plus1 - 1;
95 uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
96 int shift = 8 - depth - (skip & 7);
99 *p |= *src++ << shift;
105 int shift = comp.shift;
106 uint8_t *p = data[plane] + y * linesize[plane] +
107 x * step + comp.offset_plus1 - 1;
109 if (shift + depth <= 8) {
110 p += !!(flags & AV_PIX_FMT_FLAG_BE);
112 *p |= (*src++ << shift);
117 if (flags & AV_PIX_FMT_FLAG_BE) {
118 uint16_t val = AV_RB16(p) | (*src++ << shift);
121 uint16_t val = AV_RL16(p) | (*src++ << shift);
130 #if !FF_API_PIX_FMT_DESC
133 const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
134 [AV_PIX_FMT_YUV420P] = {
140 { 0, 0, 1, 0, 7 }, /* Y */
141 { 1, 0, 1, 0, 7 }, /* U */
142 { 2, 0, 1, 0, 7 }, /* V */
144 .flags = AV_PIX_FMT_FLAG_PLANAR,
146 [AV_PIX_FMT_YUYV422] = {
152 { 0, 1, 1, 0, 7 }, /* Y */
153 { 0, 3, 2, 0, 7 }, /* U */
154 { 0, 3, 4, 0, 7 }, /* V */
157 [AV_PIX_FMT_RGB24] = {
163 { 0, 2, 1, 0, 7 }, /* R */
164 { 0, 2, 2, 0, 7 }, /* G */
165 { 0, 2, 3, 0, 7 }, /* B */
167 .flags = AV_PIX_FMT_FLAG_RGB,
169 [AV_PIX_FMT_BGR24] = {
175 { 0, 2, 3, 0, 7 }, /* R */
176 { 0, 2, 2, 0, 7 }, /* G */
177 { 0, 2, 1, 0, 7 }, /* B */
179 .flags = AV_PIX_FMT_FLAG_RGB,
181 [AV_PIX_FMT_YUV422P] = {
187 { 0, 0, 1, 0, 7 }, /* Y */
188 { 1, 0, 1, 0, 7 }, /* U */
189 { 2, 0, 1, 0, 7 }, /* V */
191 .flags = AV_PIX_FMT_FLAG_PLANAR,
193 [AV_PIX_FMT_YUV444P] = {
199 { 0, 0, 1, 0, 7 }, /* Y */
200 { 1, 0, 1, 0, 7 }, /* U */
201 { 2, 0, 1, 0, 7 }, /* V */
203 .flags = AV_PIX_FMT_FLAG_PLANAR,
205 [AV_PIX_FMT_YUV410P] = {
211 { 0, 0, 1, 0, 7 }, /* Y */
212 { 1, 0, 1, 0, 7 }, /* U */
213 { 2, 0, 1, 0, 7 }, /* V */
215 .flags = AV_PIX_FMT_FLAG_PLANAR,
217 [AV_PIX_FMT_YUV411P] = {
223 { 0, 0, 1, 0, 7 }, /* Y */
224 { 1, 0, 1, 0, 7 }, /* U */
225 { 2, 0, 1, 0, 7 }, /* V */
227 .flags = AV_PIX_FMT_FLAG_PLANAR,
229 [AV_PIX_FMT_YUVJ411P] = {
235 { 0, 0, 1, 0, 7 }, /* Y */
236 { 1, 0, 1, 0, 7 }, /* U */
237 { 2, 0, 1, 0, 7 }, /* V */
239 .flags = AV_PIX_FMT_FLAG_PLANAR,
241 [AV_PIX_FMT_GRAY8] = {
247 { 0, 0, 1, 0, 7 }, /* Y */
249 .flags = AV_PIX_FMT_FLAG_PSEUDOPAL,
251 [AV_PIX_FMT_MONOWHITE] = {
257 { 0, 0, 1, 0, 0 }, /* Y */
259 .flags = AV_PIX_FMT_FLAG_BITSTREAM,
261 [AV_PIX_FMT_MONOBLACK] = {
267 { 0, 0, 1, 7, 0 }, /* Y */
269 .flags = AV_PIX_FMT_FLAG_BITSTREAM,
271 [AV_PIX_FMT_PAL8] = {
279 .flags = AV_PIX_FMT_FLAG_PAL,
281 [AV_PIX_FMT_YUVJ420P] = {
287 { 0, 0, 1, 0, 7 }, /* Y */
288 { 1, 0, 1, 0, 7 }, /* U */
289 { 2, 0, 1, 0, 7 }, /* V */
291 .flags = AV_PIX_FMT_FLAG_PLANAR,
293 [AV_PIX_FMT_YUVJ422P] = {
299 { 0, 0, 1, 0, 7 }, /* Y */
300 { 1, 0, 1, 0, 7 }, /* U */
301 { 2, 0, 1, 0, 7 }, /* V */
303 .flags = AV_PIX_FMT_FLAG_PLANAR,
305 [AV_PIX_FMT_YUVJ444P] = {
311 { 0, 0, 1, 0, 7 }, /* Y */
312 { 1, 0, 1, 0, 7 }, /* U */
313 { 2, 0, 1, 0, 7 }, /* V */
315 .flags = AV_PIX_FMT_FLAG_PLANAR,
318 [AV_PIX_FMT_XVMC_MPEG2_MC] = {
320 .flags = AV_PIX_FMT_FLAG_HWACCEL,
322 [AV_PIX_FMT_XVMC_MPEG2_IDCT] = {
324 .flags = AV_PIX_FMT_FLAG_HWACCEL,
326 #endif /* FF_API_XVMC */
327 [AV_PIX_FMT_UYVY422] = {
333 { 0, 1, 2, 0, 7 }, /* Y */
334 { 0, 3, 1, 0, 7 }, /* U */
335 { 0, 3, 3, 0, 7 }, /* V */
338 [AV_PIX_FMT_UYYVYY411] = {
344 { 0, 3, 2, 0, 7 }, /* Y */
345 { 0, 5, 1, 0, 7 }, /* U */
346 { 0, 5, 4, 0, 7 }, /* V */
349 [AV_PIX_FMT_BGR8] = {
355 { 0, 0, 1, 0, 2 }, /* R */
356 { 0, 0, 1, 3, 2 }, /* G */
357 { 0, 0, 1, 6, 1 }, /* B */
359 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
361 [AV_PIX_FMT_BGR4] = {
367 { 0, 3, 4, 0, 0 }, /* R */
368 { 0, 3, 2, 0, 1 }, /* G */
369 { 0, 3, 1, 0, 0 }, /* B */
371 .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
373 [AV_PIX_FMT_BGR4_BYTE] = {
379 { 0, 0, 1, 0, 0 }, /* R */
380 { 0, 0, 1, 1, 1 }, /* G */
381 { 0, 0, 1, 3, 0 }, /* B */
383 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
385 [AV_PIX_FMT_RGB8] = {
391 { 0, 0, 1, 6, 1 }, /* R */
392 { 0, 0, 1, 3, 2 }, /* G */
393 { 0, 0, 1, 0, 2 }, /* B */
395 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
397 [AV_PIX_FMT_RGB4] = {
403 { 0, 3, 1, 0, 0 }, /* R */
404 { 0, 3, 2, 0, 1 }, /* G */
405 { 0, 3, 4, 0, 0 }, /* B */
407 .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
409 [AV_PIX_FMT_RGB4_BYTE] = {
415 { 0, 0, 1, 3, 0 }, /* R */
416 { 0, 0, 1, 1, 1 }, /* G */
417 { 0, 0, 1, 0, 0 }, /* B */
419 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
421 [AV_PIX_FMT_NV12] = {
427 { 0, 0, 1, 0, 7 }, /* Y */
428 { 1, 1, 1, 0, 7 }, /* U */
429 { 1, 1, 2, 0, 7 }, /* V */
431 .flags = AV_PIX_FMT_FLAG_PLANAR,
433 [AV_PIX_FMT_NV21] = {
439 { 0, 0, 1, 0, 7 }, /* Y */
440 { 1, 1, 2, 0, 7 }, /* U */
441 { 1, 1, 1, 0, 7 }, /* V */
443 .flags = AV_PIX_FMT_FLAG_PLANAR,
445 [AV_PIX_FMT_ARGB] = {
451 { 0, 3, 2, 0, 7 }, /* R */
452 { 0, 3, 3, 0, 7 }, /* G */
453 { 0, 3, 4, 0, 7 }, /* B */
454 { 0, 3, 1, 0, 7 }, /* A */
456 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
458 [AV_PIX_FMT_RGBA] = {
464 { 0, 3, 1, 0, 7 }, /* R */
465 { 0, 3, 2, 0, 7 }, /* G */
466 { 0, 3, 3, 0, 7 }, /* B */
467 { 0, 3, 4, 0, 7 }, /* A */
469 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
471 [AV_PIX_FMT_ABGR] = {
477 { 0, 3, 4, 0, 7 }, /* R */
478 { 0, 3, 3, 0, 7 }, /* G */
479 { 0, 3, 2, 0, 7 }, /* B */
480 { 0, 3, 1, 0, 7 }, /* A */
482 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
484 [AV_PIX_FMT_BGRA] = {
490 { 0, 3, 3, 0, 7 }, /* R */
491 { 0, 3, 2, 0, 7 }, /* G */
492 { 0, 3, 1, 0, 7 }, /* B */
493 { 0, 3, 4, 0, 7 }, /* A */
495 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
497 [AV_PIX_FMT_0RGB] = {
503 { 0, 3, 2, 0, 7 }, /* R */
504 { 0, 3, 3, 0, 7 }, /* G */
505 { 0, 3, 4, 0, 7 }, /* B */
507 .flags = AV_PIX_FMT_FLAG_RGB,
509 [AV_PIX_FMT_RGB0] = {
515 { 0, 3, 1, 0, 7 }, /* R */
516 { 0, 3, 2, 0, 7 }, /* G */
517 { 0, 3, 3, 0, 7 }, /* B */
519 .flags = AV_PIX_FMT_FLAG_RGB,
521 [AV_PIX_FMT_0BGR] = {
527 { 0, 3, 4, 0, 7 }, /* R */
528 { 0, 3, 3, 0, 7 }, /* G */
529 { 0, 3, 2, 0, 7 }, /* B */
531 .flags = AV_PIX_FMT_FLAG_RGB,
533 [AV_PIX_FMT_BGR0] = {
539 { 0, 3, 3, 0, 7 }, /* R */
540 { 0, 3, 2, 0, 7 }, /* G */
541 { 0, 3, 1, 0, 7 }, /* B */
543 .flags = AV_PIX_FMT_FLAG_RGB,
545 [AV_PIX_FMT_GRAY16BE] = {
551 { 0, 1, 1, 0, 15 }, /* Y */
553 .flags = AV_PIX_FMT_FLAG_BE,
555 [AV_PIX_FMT_GRAY16LE] = {
561 { 0, 1, 1, 0, 15 }, /* Y */
564 [AV_PIX_FMT_YUV440P] = {
570 { 0, 0, 1, 0, 7 }, /* Y */
571 { 1, 0, 1, 0, 7 }, /* U */
572 { 2, 0, 1, 0, 7 }, /* V */
574 .flags = AV_PIX_FMT_FLAG_PLANAR,
576 [AV_PIX_FMT_YUVJ440P] = {
582 { 0, 0, 1, 0, 7 }, /* Y */
583 { 1, 0, 1, 0, 7 }, /* U */
584 { 2, 0, 1, 0, 7 }, /* V */
586 .flags = AV_PIX_FMT_FLAG_PLANAR,
588 [AV_PIX_FMT_YUVA420P] = {
594 { 0, 0, 1, 0, 7 }, /* Y */
595 { 1, 0, 1, 0, 7 }, /* U */
596 { 2, 0, 1, 0, 7 }, /* V */
597 { 3, 0, 1, 0, 7 }, /* A */
599 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
601 [AV_PIX_FMT_YUVA422P] = {
607 { 0, 0, 1, 0, 7 }, /* Y */
608 { 1, 0, 1, 0, 7 }, /* U */
609 { 2, 0, 1, 0, 7 }, /* V */
610 { 3, 0, 1, 0, 7 }, /* A */
612 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
614 [AV_PIX_FMT_YUVA444P] = {
620 { 0, 0, 1, 0, 7 }, /* Y */
621 { 1, 0, 1, 0, 7 }, /* U */
622 { 2, 0, 1, 0, 7 }, /* V */
623 { 3, 0, 1, 0, 7 }, /* A */
625 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
627 [AV_PIX_FMT_YUVA420P9BE] = {
628 .name = "yuva420p9be",
633 { 0, 1, 1, 0, 8 }, /* Y */
634 { 1, 1, 1, 0, 8 }, /* U */
635 { 2, 1, 1, 0, 8 }, /* V */
636 { 3, 1, 1, 0, 8 }, /* A */
638 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
640 [AV_PIX_FMT_YUVA420P9LE] = {
641 .name = "yuva420p9le",
646 { 0, 1, 1, 0, 8 }, /* Y */
647 { 1, 1, 1, 0, 8 }, /* U */
648 { 2, 1, 1, 0, 8 }, /* V */
649 { 3, 1, 1, 0, 8 }, /* A */
651 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
653 [AV_PIX_FMT_YUVA422P9BE] = {
654 .name = "yuva422p9be",
659 { 0, 1, 1, 0, 8 }, /* Y */
660 { 1, 1, 1, 0, 8 }, /* U */
661 { 2, 1, 1, 0, 8 }, /* V */
662 { 3, 1, 1, 0, 8 }, /* A */
664 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
666 [AV_PIX_FMT_YUVA422P9LE] = {
667 .name = "yuva422p9le",
672 { 0, 1, 1, 0, 8 }, /* Y */
673 { 1, 1, 1, 0, 8 }, /* U */
674 { 2, 1, 1, 0, 8 }, /* V */
675 { 3, 1, 1, 0, 8 }, /* A */
677 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
679 [AV_PIX_FMT_YUVA444P9BE] = {
680 .name = "yuva444p9be",
685 { 0, 1, 1, 0, 8 }, /* Y */
686 { 1, 1, 1, 0, 8 }, /* U */
687 { 2, 1, 1, 0, 8 }, /* V */
688 { 3, 1, 1, 0, 8 }, /* A */
690 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
692 [AV_PIX_FMT_YUVA444P9LE] = {
693 .name = "yuva444p9le",
698 { 0, 1, 1, 0, 8 }, /* Y */
699 { 1, 1, 1, 0, 8 }, /* U */
700 { 2, 1, 1, 0, 8 }, /* V */
701 { 3, 1, 1, 0, 8 }, /* A */
703 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
705 [AV_PIX_FMT_YUVA420P10BE] = {
706 .name = "yuva420p10be",
711 { 0, 1, 1, 0, 9 }, /* Y */
712 { 1, 1, 1, 0, 9 }, /* U */
713 { 2, 1, 1, 0, 9 }, /* V */
714 { 3, 1, 1, 0, 9 }, /* A */
716 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
718 [AV_PIX_FMT_YUVA420P10LE] = {
719 .name = "yuva420p10le",
724 { 0, 1, 1, 0, 9 }, /* Y */
725 { 1, 1, 1, 0, 9 }, /* U */
726 { 2, 1, 1, 0, 9 }, /* V */
727 { 3, 1, 1, 0, 9 }, /* A */
729 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
731 [AV_PIX_FMT_YUVA422P10BE] = {
732 .name = "yuva422p10be",
737 { 0, 1, 1, 0, 9 }, /* Y */
738 { 1, 1, 1, 0, 9 }, /* U */
739 { 2, 1, 1, 0, 9 }, /* V */
740 { 3, 1, 1, 0, 9 }, /* A */
742 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
744 [AV_PIX_FMT_YUVA422P10LE] = {
745 .name = "yuva422p10le",
750 { 0, 1, 1, 0, 9 }, /* Y */
751 { 1, 1, 1, 0, 9 }, /* U */
752 { 2, 1, 1, 0, 9 }, /* V */
753 { 3, 1, 1, 0, 9 }, /* A */
755 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
757 [AV_PIX_FMT_YUVA444P10BE] = {
758 .name = "yuva444p10be",
763 { 0, 1, 1, 0, 9 }, /* Y */
764 { 1, 1, 1, 0, 9 }, /* U */
765 { 2, 1, 1, 0, 9 }, /* V */
766 { 3, 1, 1, 0, 9 }, /* A */
768 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
770 [AV_PIX_FMT_YUVA444P10LE] = {
771 .name = "yuva444p10le",
776 { 0, 1, 1, 0, 9 }, /* Y */
777 { 1, 1, 1, 0, 9 }, /* U */
778 { 2, 1, 1, 0, 9 }, /* V */
779 { 3, 1, 1, 0, 9 }, /* A */
781 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
783 [AV_PIX_FMT_YUVA420P16BE] = {
784 .name = "yuva420p16be",
789 { 0, 1, 1, 0, 15 }, /* Y */
790 { 1, 1, 1, 0, 15 }, /* U */
791 { 2, 1, 1, 0, 15 }, /* V */
792 { 3, 1, 1, 0, 15 }, /* A */
794 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
796 [AV_PIX_FMT_YUVA420P16LE] = {
797 .name = "yuva420p16le",
802 { 0, 1, 1, 0, 15 }, /* Y */
803 { 1, 1, 1, 0, 15 }, /* U */
804 { 2, 1, 1, 0, 15 }, /* V */
805 { 3, 1, 1, 0, 15 }, /* A */
807 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
809 [AV_PIX_FMT_YUVA422P16BE] = {
810 .name = "yuva422p16be",
815 { 0, 1, 1, 0, 15 }, /* Y */
816 { 1, 1, 1, 0, 15 }, /* U */
817 { 2, 1, 1, 0, 15 }, /* V */
818 { 3, 1, 1, 0, 15 }, /* A */
820 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
822 [AV_PIX_FMT_YUVA422P16LE] = {
823 .name = "yuva422p16le",
828 { 0, 1, 1, 0, 15 }, /* Y */
829 { 1, 1, 1, 0, 15 }, /* U */
830 { 2, 1, 1, 0, 15 }, /* V */
831 { 3, 1, 1, 0, 15 }, /* A */
833 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
835 [AV_PIX_FMT_YUVA444P16BE] = {
836 .name = "yuva444p16be",
841 { 0, 1, 1, 0, 15 }, /* Y */
842 { 1, 1, 1, 0, 15 }, /* U */
843 { 2, 1, 1, 0, 15 }, /* V */
844 { 3, 1, 1, 0, 15 }, /* A */
846 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
848 [AV_PIX_FMT_YUVA444P16LE] = {
849 .name = "yuva444p16le",
854 { 0, 1, 1, 0, 15 }, /* Y */
855 { 1, 1, 1, 0, 15 }, /* U */
856 { 2, 1, 1, 0, 15 }, /* V */
857 { 3, 1, 1, 0, 15 }, /* A */
859 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
862 [AV_PIX_FMT_VDPAU_H264] = {
863 .name = "vdpau_h264",
866 .flags = AV_PIX_FMT_FLAG_HWACCEL,
868 [AV_PIX_FMT_VDPAU_MPEG1] = {
869 .name = "vdpau_mpeg1",
872 .flags = AV_PIX_FMT_FLAG_HWACCEL,
874 [AV_PIX_FMT_VDPAU_MPEG2] = {
875 .name = "vdpau_mpeg2",
878 .flags = AV_PIX_FMT_FLAG_HWACCEL,
880 [AV_PIX_FMT_VDPAU_WMV3] = {
881 .name = "vdpau_wmv3",
884 .flags = AV_PIX_FMT_FLAG_HWACCEL,
886 [AV_PIX_FMT_VDPAU_VC1] = {
890 .flags = AV_PIX_FMT_FLAG_HWACCEL,
892 [AV_PIX_FMT_VDPAU_MPEG4] = {
893 .name = "vdpau_mpeg4",
896 .flags = AV_PIX_FMT_FLAG_HWACCEL,
899 [AV_PIX_FMT_RGB48BE] = {
905 { 0, 5, 1, 0, 15 }, /* R */
906 { 0, 5, 3, 0, 15 }, /* G */
907 { 0, 5, 5, 0, 15 }, /* B */
909 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
911 [AV_PIX_FMT_RGB48LE] = {
917 { 0, 5, 1, 0, 15 }, /* R */
918 { 0, 5, 3, 0, 15 }, /* G */
919 { 0, 5, 5, 0, 15 }, /* B */
921 .flags = AV_PIX_FMT_FLAG_RGB,
923 [AV_PIX_FMT_RGBA64BE] = {
929 { 0, 7, 1, 0, 15 }, /* R */
930 { 0, 7, 3, 0, 15 }, /* G */
931 { 0, 7, 5, 0, 15 }, /* B */
932 { 0, 7, 7, 0, 15 }, /* A */
934 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_ALPHA,
936 [AV_PIX_FMT_RGBA64LE] = {
942 { 0, 7, 1, 0, 15 }, /* R */
943 { 0, 7, 3, 0, 15 }, /* G */
944 { 0, 7, 5, 0, 15 }, /* B */
945 { 0, 7, 7, 0, 15 }, /* A */
947 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
949 [AV_PIX_FMT_RGB565BE] = {
955 { 0, 1, 0, 3, 4 }, /* R */
956 { 0, 1, 1, 5, 5 }, /* G */
957 { 0, 1, 1, 0, 4 }, /* B */
959 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
961 [AV_PIX_FMT_RGB565LE] = {
967 { 0, 1, 2, 3, 4 }, /* R */
968 { 0, 1, 1, 5, 5 }, /* G */
969 { 0, 1, 1, 0, 4 }, /* B */
971 .flags = AV_PIX_FMT_FLAG_RGB,
973 [AV_PIX_FMT_RGB555BE] = {
979 { 0, 1, 0, 2, 4 }, /* R */
980 { 0, 1, 1, 5, 4 }, /* G */
981 { 0, 1, 1, 0, 4 }, /* B */
983 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
985 [AV_PIX_FMT_RGB555LE] = {
991 { 0, 1, 2, 2, 4 }, /* R */
992 { 0, 1, 1, 5, 4 }, /* G */
993 { 0, 1, 1, 0, 4 }, /* B */
995 .flags = AV_PIX_FMT_FLAG_RGB,
997 [AV_PIX_FMT_RGB444BE] = {
1003 { 0, 1, 0, 0, 3 }, /* R */
1004 { 0, 1, 1, 4, 3 }, /* G */
1005 { 0, 1, 1, 0, 3 }, /* B */
1007 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1009 [AV_PIX_FMT_RGB444LE] = {
1015 { 0, 1, 2, 0, 3 }, /* R */
1016 { 0, 1, 1, 4, 3 }, /* G */
1017 { 0, 1, 1, 0, 3 }, /* B */
1019 .flags = AV_PIX_FMT_FLAG_RGB,
1021 [AV_PIX_FMT_BGR48BE] = {
1027 { 0, 5, 5, 0, 15 }, /* R */
1028 { 0, 5, 3, 0, 15 }, /* G */
1029 { 0, 5, 1, 0, 15 }, /* B */
1031 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1033 [AV_PIX_FMT_BGR48LE] = {
1039 { 0, 5, 5, 0, 15 }, /* R */
1040 { 0, 5, 3, 0, 15 }, /* G */
1041 { 0, 5, 1, 0, 15 }, /* B */
1043 .flags = AV_PIX_FMT_FLAG_RGB,
1045 [AV_PIX_FMT_BGRA64BE] = {
1051 { 0, 7, 5, 0, 15 }, /* R */
1052 { 0, 7, 3, 0, 15 }, /* G */
1053 { 0, 7, 1, 0, 15 }, /* B */
1054 { 0, 7, 7, 0, 15 }, /* A */
1056 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1058 [AV_PIX_FMT_BGRA64LE] = {
1064 { 0, 7, 5, 0, 15 }, /* R */
1065 { 0, 7, 3, 0, 15 }, /* G */
1066 { 0, 7, 1, 0, 15 }, /* B */
1067 { 0, 7, 7, 0, 15 }, /* A */
1069 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1071 [AV_PIX_FMT_BGR565BE] = {
1077 { 0, 1, 1, 0, 4 }, /* R */
1078 { 0, 1, 1, 5, 5 }, /* G */
1079 { 0, 1, 0, 3, 4 }, /* B */
1081 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1083 [AV_PIX_FMT_BGR565LE] = {
1089 { 0, 1, 1, 0, 4 }, /* R */
1090 { 0, 1, 1, 5, 5 }, /* G */
1091 { 0, 1, 2, 3, 4 }, /* B */
1093 .flags = AV_PIX_FMT_FLAG_RGB,
1095 [AV_PIX_FMT_BGR555BE] = {
1101 { 0, 1, 1, 0, 4 }, /* R */
1102 { 0, 1, 1, 5, 4 }, /* G */
1103 { 0, 1, 0, 2, 4 }, /* B */
1105 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1107 [AV_PIX_FMT_BGR555LE] = {
1113 { 0, 1, 1, 0, 4 }, /* R */
1114 { 0, 1, 1, 5, 4 }, /* G */
1115 { 0, 1, 2, 2, 4 }, /* B */
1117 .flags = AV_PIX_FMT_FLAG_RGB,
1119 [AV_PIX_FMT_BGR444BE] = {
1125 { 0, 1, 1, 0, 3 }, /* R */
1126 { 0, 1, 1, 4, 3 }, /* G */
1127 { 0, 1, 0, 0, 3 }, /* B */
1129 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1131 [AV_PIX_FMT_BGR444LE] = {
1137 { 0, 1, 1, 0, 3 }, /* R */
1138 { 0, 1, 1, 4, 3 }, /* G */
1139 { 0, 1, 2, 0, 3 }, /* B */
1141 .flags = AV_PIX_FMT_FLAG_RGB,
1143 [AV_PIX_FMT_VAAPI_MOCO] = {
1144 .name = "vaapi_moco",
1147 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1149 [AV_PIX_FMT_VAAPI_IDCT] = {
1150 .name = "vaapi_idct",
1153 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1155 [AV_PIX_FMT_VAAPI_VLD] = {
1156 .name = "vaapi_vld",
1159 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1161 [AV_PIX_FMT_YUV420P9LE] = {
1162 .name = "yuv420p9le",
1167 { 0, 1, 1, 0, 8 }, /* Y */
1168 { 1, 1, 1, 0, 8 }, /* U */
1169 { 2, 1, 1, 0, 8 }, /* V */
1171 .flags = AV_PIX_FMT_FLAG_PLANAR,
1173 [AV_PIX_FMT_YUV420P9BE] = {
1174 .name = "yuv420p9be",
1179 { 0, 1, 1, 0, 8 }, /* Y */
1180 { 1, 1, 1, 0, 8 }, /* U */
1181 { 2, 1, 1, 0, 8 }, /* V */
1183 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1185 [AV_PIX_FMT_YUV420P10LE] = {
1186 .name = "yuv420p10le",
1191 { 0, 1, 1, 0, 9 }, /* Y */
1192 { 1, 1, 1, 0, 9 }, /* U */
1193 { 2, 1, 1, 0, 9 }, /* V */
1195 .flags = AV_PIX_FMT_FLAG_PLANAR,
1197 [AV_PIX_FMT_YUV420P10BE] = {
1198 .name = "yuv420p10be",
1203 { 0, 1, 1, 0, 9 }, /* Y */
1204 { 1, 1, 1, 0, 9 }, /* U */
1205 { 2, 1, 1, 0, 9 }, /* V */
1207 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1209 [AV_PIX_FMT_YUV420P12LE] = {
1210 .name = "yuv420p12le",
1215 { 0, 1, 1, 0, 11 }, /* Y */
1216 { 1, 1, 1, 0, 11 }, /* U */
1217 { 2, 1, 1, 0, 11 }, /* V */
1219 .flags = AV_PIX_FMT_FLAG_PLANAR,
1221 [AV_PIX_FMT_YUV420P12BE] = {
1222 .name = "yuv420p12be",
1227 { 0, 1, 1, 0, 11 }, /* Y */
1228 { 1, 1, 1, 0, 11 }, /* U */
1229 { 2, 1, 1, 0, 11 }, /* V */
1231 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1233 [AV_PIX_FMT_YUV420P14LE] = {
1234 .name = "yuv420p14le",
1239 { 0, 1, 1, 0, 13 }, /* Y */
1240 { 1, 1, 1, 0, 13 }, /* U */
1241 { 2, 1, 1, 0, 13 }, /* V */
1243 .flags = AV_PIX_FMT_FLAG_PLANAR,
1245 [AV_PIX_FMT_YUV420P14BE] = {
1246 .name = "yuv420p14be",
1251 { 0, 1, 1, 0, 13 }, /* Y */
1252 { 1, 1, 1, 0, 13 }, /* U */
1253 { 2, 1, 1, 0, 13 }, /* V */
1255 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1257 [AV_PIX_FMT_YUV420P16LE] = {
1258 .name = "yuv420p16le",
1263 { 0, 1, 1, 0, 15 }, /* Y */
1264 { 1, 1, 1, 0, 15 }, /* U */
1265 { 2, 1, 1, 0, 15 }, /* V */
1267 .flags = AV_PIX_FMT_FLAG_PLANAR,
1269 [AV_PIX_FMT_YUV420P16BE] = {
1270 .name = "yuv420p16be",
1275 { 0, 1, 1, 0, 15 }, /* Y */
1276 { 1, 1, 1, 0, 15 }, /* U */
1277 { 2, 1, 1, 0, 15 }, /* V */
1279 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1281 [AV_PIX_FMT_YUV422P9LE] = {
1282 .name = "yuv422p9le",
1287 { 0, 1, 1, 0, 8 }, /* Y */
1288 { 1, 1, 1, 0, 8 }, /* U */
1289 { 2, 1, 1, 0, 8 }, /* V */
1291 .flags = AV_PIX_FMT_FLAG_PLANAR,
1293 [AV_PIX_FMT_YUV422P9BE] = {
1294 .name = "yuv422p9be",
1299 { 0, 1, 1, 0, 8 }, /* Y */
1300 { 1, 1, 1, 0, 8 }, /* U */
1301 { 2, 1, 1, 0, 8 }, /* V */
1303 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1305 [AV_PIX_FMT_YUV422P10LE] = {
1306 .name = "yuv422p10le",
1311 { 0, 1, 1, 0, 9 }, /* Y */
1312 { 1, 1, 1, 0, 9 }, /* U */
1313 { 2, 1, 1, 0, 9 }, /* V */
1315 .flags = AV_PIX_FMT_FLAG_PLANAR,
1317 [AV_PIX_FMT_YUV422P10BE] = {
1318 .name = "yuv422p10be",
1323 { 0, 1, 1, 0, 9 }, /* Y */
1324 { 1, 1, 1, 0, 9 }, /* U */
1325 { 2, 1, 1, 0, 9 }, /* V */
1327 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1329 [AV_PIX_FMT_YUV422P12LE] = {
1330 .name = "yuv422p12le",
1335 { 0, 1, 1, 0, 11 }, /* Y */
1336 { 1, 1, 1, 0, 11 }, /* U */
1337 { 2, 1, 1, 0, 11 }, /* V */
1339 .flags = AV_PIX_FMT_FLAG_PLANAR,
1341 [AV_PIX_FMT_YUV422P12BE] = {
1342 .name = "yuv422p12be",
1347 { 0, 1, 1, 0, 11 }, /* Y */
1348 { 1, 1, 1, 0, 11 }, /* U */
1349 { 2, 1, 1, 0, 11 }, /* V */
1351 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1353 [AV_PIX_FMT_YUV422P14LE] = {
1354 .name = "yuv422p14le",
1359 { 0, 1, 1, 0, 13 }, /* Y */
1360 { 1, 1, 1, 0, 13 }, /* U */
1361 { 2, 1, 1, 0, 13 }, /* V */
1363 .flags = AV_PIX_FMT_FLAG_PLANAR,
1365 [AV_PIX_FMT_YUV422P14BE] = {
1366 .name = "yuv422p14be",
1371 { 0, 1, 1, 0, 13 }, /* Y */
1372 { 1, 1, 1, 0, 13 }, /* U */
1373 { 2, 1, 1, 0, 13 }, /* V */
1375 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1377 [AV_PIX_FMT_YUV422P16LE] = {
1378 .name = "yuv422p16le",
1383 { 0, 1, 1, 0, 15 }, /* Y */
1384 { 1, 1, 1, 0, 15 }, /* U */
1385 { 2, 1, 1, 0, 15 }, /* V */
1387 .flags = AV_PIX_FMT_FLAG_PLANAR,
1389 [AV_PIX_FMT_YUV422P16BE] = {
1390 .name = "yuv422p16be",
1395 { 0, 1, 1, 0, 15 }, /* Y */
1396 { 1, 1, 1, 0, 15 }, /* U */
1397 { 2, 1, 1, 0, 15 }, /* V */
1399 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1401 [AV_PIX_FMT_YUV444P16LE] = {
1402 .name = "yuv444p16le",
1407 { 0, 1, 1, 0, 15 }, /* Y */
1408 { 1, 1, 1, 0, 15 }, /* U */
1409 { 2, 1, 1, 0, 15 }, /* V */
1411 .flags = AV_PIX_FMT_FLAG_PLANAR,
1413 [AV_PIX_FMT_YUV444P16BE] = {
1414 .name = "yuv444p16be",
1419 { 0, 1, 1, 0, 15 }, /* Y */
1420 { 1, 1, 1, 0, 15 }, /* U */
1421 { 2, 1, 1, 0, 15 }, /* V */
1423 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1425 [AV_PIX_FMT_YUV444P10LE] = {
1426 .name = "yuv444p10le",
1431 { 0, 1, 1, 0, 9 }, /* Y */
1432 { 1, 1, 1, 0, 9 }, /* U */
1433 { 2, 1, 1, 0, 9 }, /* V */
1435 .flags = AV_PIX_FMT_FLAG_PLANAR,
1437 [AV_PIX_FMT_YUV444P10BE] = {
1438 .name = "yuv444p10be",
1443 { 0, 1, 1, 0, 9 }, /* Y */
1444 { 1, 1, 1, 0, 9 }, /* U */
1445 { 2, 1, 1, 0, 9 }, /* V */
1447 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1449 [AV_PIX_FMT_YUV444P9LE] = {
1450 .name = "yuv444p9le",
1455 { 0, 1, 1, 0, 8 }, /* Y */
1456 { 1, 1, 1, 0, 8 }, /* U */
1457 { 2, 1, 1, 0, 8 }, /* V */
1459 .flags = AV_PIX_FMT_FLAG_PLANAR,
1461 [AV_PIX_FMT_YUV444P9BE] = {
1462 .name = "yuv444p9be",
1467 { 0, 1, 1, 0, 8 }, /* Y */
1468 { 1, 1, 1, 0, 8 }, /* U */
1469 { 2, 1, 1, 0, 8 }, /* V */
1471 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1473 [AV_PIX_FMT_YUV444P12LE] = {
1474 .name = "yuv444p12le",
1479 { 0, 1, 1, 0, 11 }, /* Y */
1480 { 1, 1, 1, 0, 11 }, /* U */
1481 { 2, 1, 1, 0, 11 }, /* V */
1483 .flags = AV_PIX_FMT_FLAG_PLANAR,
1485 [AV_PIX_FMT_YUV444P12BE] = {
1486 .name = "yuv444p12be",
1491 { 0, 1, 1, 0, 11 }, /* Y */
1492 { 1, 1, 1, 0, 11 }, /* U */
1493 { 2, 1, 1, 0, 11 }, /* V */
1495 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1497 [AV_PIX_FMT_YUV444P14LE] = {
1498 .name = "yuv444p14le",
1503 { 0, 1, 1, 0, 13 }, /* Y */
1504 { 1, 1, 1, 0, 13 }, /* U */
1505 { 2, 1, 1, 0, 13 }, /* V */
1507 .flags = AV_PIX_FMT_FLAG_PLANAR,
1509 [AV_PIX_FMT_YUV444P14BE] = {
1510 .name = "yuv444p14be",
1515 { 0, 1, 1, 0, 13 }, /* Y */
1516 { 1, 1, 1, 0, 13 }, /* U */
1517 { 2, 1, 1, 0, 13 }, /* V */
1519 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1521 [AV_PIX_FMT_DXVA2_VLD] = {
1522 .name = "dxva2_vld",
1525 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1527 [AV_PIX_FMT_VDA_VLD] = {
1531 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1533 [AV_PIX_FMT_GRAY8A] = {
1537 { 0, 1, 1, 0, 7 }, /* Y */
1538 { 0, 1, 2, 0, 7 }, /* A */
1540 .flags = AV_PIX_FMT_FLAG_ALPHA,
1542 [AV_PIX_FMT_GBRP] = {
1548 { 2, 0, 1, 0, 7 }, /* R */
1549 { 0, 0, 1, 0, 7 }, /* G */
1550 { 1, 0, 1, 0, 7 }, /* B */
1552 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1554 [AV_PIX_FMT_GBRP9LE] = {
1560 { 2, 1, 1, 0, 8 }, /* R */
1561 { 0, 1, 1, 0, 8 }, /* G */
1562 { 1, 1, 1, 0, 8 }, /* B */
1564 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1566 [AV_PIX_FMT_GBRP9BE] = {
1572 { 2, 1, 1, 0, 8 }, /* R */
1573 { 0, 1, 1, 0, 8 }, /* G */
1574 { 1, 1, 1, 0, 8 }, /* B */
1576 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1578 [AV_PIX_FMT_GBRP10LE] = {
1584 { 2, 1, 1, 0, 9 }, /* R */
1585 { 0, 1, 1, 0, 9 }, /* G */
1586 { 1, 1, 1, 0, 9 }, /* B */
1588 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1590 [AV_PIX_FMT_GBRP10BE] = {
1596 { 2, 1, 1, 0, 9 }, /* R */
1597 { 0, 1, 1, 0, 9 }, /* G */
1598 { 1, 1, 1, 0, 9 }, /* B */
1600 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1602 [AV_PIX_FMT_GBRP12LE] = {
1608 { 2, 1, 1, 0, 11 }, /* R */
1609 { 0, 1, 1, 0, 11 }, /* G */
1610 { 1, 1, 1, 0, 11 }, /* B */
1612 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1614 [AV_PIX_FMT_GBRP12BE] = {
1620 { 2, 1, 1, 0, 11 }, /* R */
1621 { 0, 1, 1, 0, 11 }, /* G */
1622 { 1, 1, 1, 0, 11 }, /* B */
1624 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1626 [AV_PIX_FMT_GBRP14LE] = {
1632 { 2, 1, 1, 0, 13 }, /* R */
1633 { 0, 1, 1, 0, 13 }, /* G */
1634 { 1, 1, 1, 0, 13 }, /* B */
1636 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1638 [AV_PIX_FMT_GBRP14BE] = {
1644 { 2, 1, 1, 0, 13 }, /* R */
1645 { 0, 1, 1, 0, 13 }, /* G */
1646 { 1, 1, 1, 0, 13 }, /* B */
1648 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1650 [AV_PIX_FMT_GBRP16LE] = {
1656 { 2, 1, 1, 0, 15 }, /* R */
1657 { 0, 1, 1, 0, 15 }, /* G */
1658 { 1, 1, 1, 0, 15 }, /* B */
1660 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1662 [AV_PIX_FMT_GBRP16BE] = {
1668 { 2, 1, 1, 0, 15 }, /* R */
1669 { 0, 1, 1, 0, 15 }, /* G */
1670 { 1, 1, 1, 0, 15 }, /* B */
1672 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1674 [AV_PIX_FMT_GBRAP] = {
1680 { 2, 0, 1, 0, 7 }, /* R */
1681 { 0, 0, 1, 0, 7 }, /* G */
1682 { 1, 0, 1, 0, 7 }, /* B */
1683 { 3, 0, 1, 0, 7 }, /* A */
1685 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1687 [AV_PIX_FMT_GBRAP16LE] = {
1688 .name = "gbrap16le",
1693 { 2, 1, 1, 0, 15 }, /* R */
1694 { 0, 1, 1, 0, 15 }, /* G */
1695 { 1, 1, 1, 0, 15 }, /* B */
1696 { 3, 1, 1, 0, 15 }, /* A */
1698 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1700 [AV_PIX_FMT_GBRAP16BE] = {
1701 .name = "gbrap16be",
1706 { 2, 1, 1, 0, 15 }, /* R */
1707 { 0, 1, 1, 0, 15 }, /* G */
1708 { 1, 1, 1, 0, 15 }, /* B */
1709 { 3, 1, 1, 0, 15 }, /* A */
1711 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1713 [AV_PIX_FMT_VDPAU] = {
1717 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1719 [AV_PIX_FMT_XYZ12LE] = {
1725 { 0, 5, 1, 4, 11 }, /* X */
1726 { 0, 5, 3, 4, 11 }, /* Y */
1727 { 0, 5, 5, 4, 11 }, /* Z */
1729 /*.flags = -- not used*/
1731 [AV_PIX_FMT_XYZ12BE] = {
1737 { 0, 5, 1, 4, 11 }, /* X */
1738 { 0, 5, 3, 4, 11 }, /* Y */
1739 { 0, 5, 5, 4, 11 }, /* Z */
1741 .flags = AV_PIX_FMT_FLAG_BE,
1744 #define BAYER8_DESC_COMMON \
1745 .nb_components= 3, \
1746 .log2_chroma_w= 0, \
1747 .log2_chroma_h= 0, \
1754 #define BAYER16_DESC_COMMON \
1755 .nb_components= 3, \
1756 .log2_chroma_w= 0, \
1757 .log2_chroma_h= 0, \
1764 [AV_PIX_FMT_BAYER_BGGR8] = {
1765 .name = "bayer_bggr8",
1768 [AV_PIX_FMT_BAYER_BGGR16LE] = {
1769 .name = "bayer_bggr16le",
1772 [AV_PIX_FMT_BAYER_BGGR16BE] = {
1773 .name = "bayer_bggr16be",
1776 [AV_PIX_FMT_BAYER_RGGB8] = {
1777 .name = "bayer_rggb8",
1780 [AV_PIX_FMT_BAYER_RGGB16LE] = {
1781 .name = "bayer_rggb16le",
1784 [AV_PIX_FMT_BAYER_RGGB16BE] = {
1785 .name = "bayer_rggb16be",
1788 [AV_PIX_FMT_BAYER_GBRG8] = {
1789 .name = "bayer_gbrg8",
1792 [AV_PIX_FMT_BAYER_GBRG16LE] = {
1793 .name = "bayer_gbrg16le",
1796 [AV_PIX_FMT_BAYER_GBRG16BE] = {
1797 .name = "bayer_gbrg16be",
1800 [AV_PIX_FMT_BAYER_GRBG8] = {
1801 .name = "bayer_grbg8",
1804 [AV_PIX_FMT_BAYER_GRBG16LE] = {
1805 .name = "bayer_grbg16le",
1808 [AV_PIX_FMT_BAYER_GRBG16BE] = {
1809 .name = "bayer_grbg16be",
1812 [AV_PIX_FMT_NV16] = {
1818 { 0, 0, 1, 0, 7 }, /* Y */
1819 { 1, 1, 1, 0, 7 }, /* U */
1820 { 1, 1, 2, 0, 7 }, /* V */
1822 .flags = AV_PIX_FMT_FLAG_PLANAR,
1824 [AV_PIX_FMT_NV20LE] = {
1830 { 0, 1, 1, 0, 9 }, /* Y */
1831 { 1, 3, 1, 0, 9 }, /* U */
1832 { 1, 3, 3, 0, 9 }, /* V */
1834 .flags = AV_PIX_FMT_FLAG_PLANAR,
1836 [AV_PIX_FMT_NV20BE] = {
1842 { 0, 1, 1, 0, 9 }, /* Y */
1843 { 1, 3, 1, 0, 9 }, /* U */
1844 { 1, 3, 3, 0, 9 }, /* V */
1846 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
1850 FF_DISABLE_DEPRECATION_WARNINGS
1851 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1853 enum AVPixelFormat pix_fmt;
1855 for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1856 if (av_pix_fmt_descriptors[pix_fmt].name &&
1857 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1860 return AV_PIX_FMT_NONE;
1863 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
1865 return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1866 av_pix_fmt_descriptors[pix_fmt].name : NULL;
1870 # define X_NE(be, le) be
1872 # define X_NE(be, le) le
1875 enum AVPixelFormat av_get_pix_fmt(const char *name)
1877 enum AVPixelFormat pix_fmt;
1879 if (!strcmp(name, "rgb32"))
1880 name = X_NE("argb", "bgra");
1881 else if (!strcmp(name, "bgr32"))
1882 name = X_NE("abgr", "rgba");
1884 pix_fmt = get_pix_fmt_internal(name);
1885 if (pix_fmt == AV_PIX_FMT_NONE) {
1888 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1889 pix_fmt = get_pix_fmt_internal(name2);
1894 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1897 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1899 for (c = 0; c < pixdesc->nb_components; c++) {
1900 int s = c == 1 || c == 2 ? 0 : log2_pixels;
1901 bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1904 return bits >> log2_pixels;
1907 int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1910 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1913 for (c = 0; c < pixdesc->nb_components; c++) {
1914 const AVComponentDescriptor *comp = &pixdesc->comp[c];
1915 int s = c == 1 || c == 2 ? 0 : log2_pixels;
1916 steps[comp->plane] = (comp->step_minus1 + 1) << s;
1918 for (c = 0; c < 4; c++)
1921 if(!(pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM))
1924 return bits >> log2_pixels;
1927 char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt)
1931 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1933 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1934 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1935 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1941 const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
1943 if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
1945 return &av_pix_fmt_descriptors[pix_fmt];
1948 const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
1951 return &av_pix_fmt_descriptors[0];
1952 while (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1) {
1960 enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
1962 if (desc < av_pix_fmt_descriptors ||
1963 desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
1964 return AV_PIX_FMT_NONE;
1966 return desc - av_pix_fmt_descriptors;
1968 FF_ENABLE_DEPRECATION_WARNINGS
1970 int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
1971 int *h_shift, int *v_shift)
1973 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1975 return AVERROR(ENOSYS);
1976 *h_shift = desc->log2_chroma_w;
1977 *v_shift = desc->log2_chroma_h;
1982 int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
1984 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1985 int i, planes[4] = { 0 }, ret = 0;
1988 return AVERROR(EINVAL);
1990 for (i = 0; i < desc->nb_components; i++)
1991 planes[desc->comp[i].plane] = 1;
1992 for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
1997 void ff_check_pixfmt_descriptors(void){
2000 for (i=0; i<FF_ARRAY_ELEMS(av_pix_fmt_descriptors); i++) {
2001 const AVPixFmtDescriptor *d = &av_pix_fmt_descriptors[i];
2002 uint8_t fill[4][8+6+3] = {{0}};
2003 uint8_t *data[4] = {fill[0], fill[1], fill[2], fill[3]};
2004 int linesize[4] = {0,0,0,0};
2007 if (!d->name && !d->nb_components && !d->log2_chroma_w && !d->log2_chroma_h && !d->flags)
2009 // av_log(NULL, AV_LOG_DEBUG, "Checking: %s\n", d->name);
2010 av_assert0(d->log2_chroma_w <= 3);
2011 av_assert0(d->log2_chroma_h <= 3);
2012 av_assert0(d->nb_components <= 4);
2013 av_assert0(d->name && d->name[0]);
2014 av_assert0((d->nb_components==4 || d->nb_components==2) == !!(d->flags & AV_PIX_FMT_FLAG_ALPHA));
2015 av_assert2(av_get_pix_fmt(d->name) == i);
2017 for (j=0; j<FF_ARRAY_ELEMS(d->comp); j++) {
2018 const AVComponentDescriptor *c = &d->comp[j];
2019 if(j>=d->nb_components) {
2020 av_assert0(!c->plane && !c->step_minus1 && !c->offset_plus1 && !c->shift && !c->depth_minus1);
2023 if (d->flags & AV_PIX_FMT_FLAG_BITSTREAM) {
2024 av_assert0(c->step_minus1 >= c->depth_minus1);
2026 av_assert0(8*(c->step_minus1+1) >= c->depth_minus1+1);
2028 if (!strncmp(d->name, "bayer_", 6))
2030 av_read_image_line(tmp, (void*)data, linesize, d, 0, 0, j, 2, 0);
2031 av_assert0(tmp[0] == 0 && tmp[1] == 0);
2032 tmp[0] = tmp[1] = (1<<(c->depth_minus1 + 1)) - 1;
2033 av_write_image_line(tmp, data, linesize, d, 0, 0, j, 2);
2039 enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
2041 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2045 if (!desc || strlen(desc->name) < 2)
2046 return AV_PIX_FMT_NONE;
2047 av_strlcpy(name, desc->name, sizeof(name));
2048 i = strlen(name) - 2;
2049 if (strcmp(name + i, "be") && strcmp(name + i, "le"))
2050 return AV_PIX_FMT_NONE;
2052 name[i] ^= 'b' ^ 'l';
2054 return get_pix_fmt_internal(name);