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_line2(void *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,
38 AVComponentDescriptor comp = desc->comp[c];
39 int plane = comp.plane;
40 int depth = comp.depth;
41 unsigned mask = (1ULL << depth) - 1;
42 int shift = comp.shift;
44 int flags = desc->flags;
45 uint16_t *dst16 = dst;
46 uint32_t *dst32 = dst;
48 if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
50 // Assume all channels are packed into a 32bit value
51 const uint8_t *byte_p = data[plane] + y * linesize[plane];
52 const uint32_t *p = (uint32_t *)byte_p;
56 val = (val >> comp.offset) & mask;
57 if (read_pal_component)
58 val = data[1][4*val + c];
59 if (dst_element_size == 4) *dst32++ = val;
64 int skip = x * step + comp.offset;
65 const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
66 int shift = 8 - depth - (skip & 7);
69 int val = (*p >> shift) & mask;
70 if (read_pal_component)
71 val = data[1][4*val + c];
75 if (dst_element_size == 4) *dst32++ = val;
80 const uint8_t *p = data[plane] + y * linesize[plane] +
81 x * step + comp.offset;
82 int is_8bit = shift + depth <= 8;
83 int is_16bit= shift + depth <=16;
86 p += !!(flags & AV_PIX_FMT_FLAG_BE);
90 if (is_8bit) val = *p;
91 else if(is_16bit) val = flags & AV_PIX_FMT_FLAG_BE ? AV_RB16(p) : AV_RL16(p);
92 else val = flags & AV_PIX_FMT_FLAG_BE ? AV_RB32(p) : AV_RL32(p);
93 val = (val >> shift) & mask;
94 if (read_pal_component)
95 val = data[1][4 * val + c];
97 if (dst_element_size == 4) *dst32++ = val;
103 void av_read_image_line(uint16_t *dst,
104 const uint8_t *data[4], const int linesize[4],
105 const AVPixFmtDescriptor *desc,
106 int x, int y, int c, int w,
107 int read_pal_component)
109 av_read_image_line2(dst, data, linesize, desc,x, y, c, w,
114 void av_write_image_line2(const void *src,
115 uint8_t *data[4], const int linesize[4],
116 const AVPixFmtDescriptor *desc,
117 int x, int y, int c, int w, int src_element_size)
119 AVComponentDescriptor comp = desc->comp[c];
120 int plane = comp.plane;
121 int depth = comp.depth;
122 int step = comp.step;
123 int flags = desc->flags;
124 const uint32_t *src32 = src;
125 const uint16_t *src16 = src;
127 if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
129 // Assume all channels are packed into a 32bit value
130 const uint8_t *byte_p = data[plane] + y * linesize[plane];
131 uint32_t *p = (uint32_t *)byte_p;
132 int offset = comp.offset;
133 uint32_t mask = ((1ULL << depth) - 1) << offset;
136 uint16_t val = src_element_size == 4 ? *src32++ : *src16++;
137 AV_WB32(p, (AV_RB32(p) & ~mask) | (val << offset));
141 int skip = x * step + comp.offset;
142 uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
143 int shift = 8 - depth - (skip & 7);
146 *p |= (src_element_size == 4 ? *src32++ : *src16++) << shift;
153 int shift = comp.shift;
154 uint8_t *p = data[plane] + y * linesize[plane] +
155 x * step + comp.offset;
157 if (shift + depth <= 8) {
158 p += !!(flags & AV_PIX_FMT_FLAG_BE);
160 *p |= ((src_element_size == 4 ? *src32++ : *src16++) << shift);
165 unsigned s = (src_element_size == 4 ? *src32++ : *src16++);
166 if (shift + depth <= 16) {
167 if (flags & AV_PIX_FMT_FLAG_BE) {
168 uint16_t val = AV_RB16(p) | (s << shift);
171 uint16_t val = AV_RL16(p) | (s << shift);
175 if (flags & AV_PIX_FMT_FLAG_BE) {
176 uint32_t val = AV_RB32(p) | (s << shift);
179 uint32_t val = AV_RL32(p) | (s << shift);
189 void av_write_image_line(const uint16_t *src,
190 uint8_t *data[4], const int linesize[4],
191 const AVPixFmtDescriptor *desc,
192 int x, int y, int c, int w)
194 av_write_image_line2(src, data, linesize, desc, x, y, c, w, 2);
197 static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
198 [AV_PIX_FMT_YUV420P] = {
204 { 0, 1, 0, 0, 8 }, /* Y */
205 { 1, 1, 0, 0, 8 }, /* U */
206 { 2, 1, 0, 0, 8 }, /* V */
208 .flags = AV_PIX_FMT_FLAG_PLANAR,
210 [AV_PIX_FMT_YUYV422] = {
216 { 0, 2, 0, 0, 8 }, /* Y */
217 { 0, 4, 1, 0, 8 }, /* U */
218 { 0, 4, 3, 0, 8 }, /* V */
221 [AV_PIX_FMT_YVYU422] = {
227 { 0, 2, 0, 0, 8 }, /* Y */
228 { 0, 4, 3, 0, 8 }, /* U */
229 { 0, 4, 1, 0, 8 }, /* V */
232 [AV_PIX_FMT_Y210LE] = {
238 { 0, 4, 0, 6, 10 }, /* Y */
239 { 0, 8, 2, 6, 10 }, /* U */
240 { 0, 8, 6, 6, 10 }, /* V */
243 [AV_PIX_FMT_Y210BE] = {
249 { 0, 4, 0, 6, 10 }, /* Y */
250 { 0, 8, 2, 6, 10 }, /* U */
251 { 0, 8, 6, 6, 10 }, /* V */
253 .flags = AV_PIX_FMT_FLAG_BE,
255 [AV_PIX_FMT_RGB24] = {
261 { 0, 3, 0, 0, 8 }, /* R */
262 { 0, 3, 1, 0, 8 }, /* G */
263 { 0, 3, 2, 0, 8 }, /* B */
265 .flags = AV_PIX_FMT_FLAG_RGB,
267 [AV_PIX_FMT_BGR24] = {
273 { 0, 3, 2, 0, 8 }, /* R */
274 { 0, 3, 1, 0, 8 }, /* G */
275 { 0, 3, 0, 0, 8 }, /* B */
277 .flags = AV_PIX_FMT_FLAG_RGB,
279 [AV_PIX_FMT_X2RGB10LE] = {
285 { 0, 4, 2, 4, 10 }, /* R */
286 { 0, 4, 1, 2, 10 }, /* G */
287 { 0, 4, 0, 0, 10 }, /* B */
289 .flags = AV_PIX_FMT_FLAG_RGB,
291 [AV_PIX_FMT_X2RGB10BE] = {
297 { 0, 4, 0, 4, 10 }, /* R */
298 { 0, 4, 1, 2, 10 }, /* G */
299 { 0, 4, 2, 0, 10 }, /* B */
301 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
303 [AV_PIX_FMT_X2BGR10LE] = {
309 { 0, 4, 0, 0, 10 }, /* R */
310 { 0, 4, 1, 2, 10 }, /* G */
311 { 0, 4, 2, 4, 10 }, /* B */
313 .flags = AV_PIX_FMT_FLAG_RGB,
315 [AV_PIX_FMT_X2BGR10BE] = {
321 { 0, 4, 2, 0, 10 }, /* R */
322 { 0, 4, 1, 2, 10 }, /* G */
323 { 0, 4, 0, 4, 10 }, /* B */
325 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
327 [AV_PIX_FMT_YUV422P] = {
333 { 0, 1, 0, 0, 8 }, /* Y */
334 { 1, 1, 0, 0, 8 }, /* U */
335 { 2, 1, 0, 0, 8 }, /* V */
337 .flags = AV_PIX_FMT_FLAG_PLANAR,
339 [AV_PIX_FMT_YUV444P] = {
345 { 0, 1, 0, 0, 8 }, /* Y */
346 { 1, 1, 0, 0, 8 }, /* U */
347 { 2, 1, 0, 0, 8 }, /* V */
349 .flags = AV_PIX_FMT_FLAG_PLANAR,
351 [AV_PIX_FMT_YUV410P] = {
357 { 0, 1, 0, 0, 8 }, /* Y */
358 { 1, 1, 0, 0, 8 }, /* U */
359 { 2, 1, 0, 0, 8 }, /* V */
361 .flags = AV_PIX_FMT_FLAG_PLANAR,
363 [AV_PIX_FMT_YUV411P] = {
369 { 0, 1, 0, 0, 8 }, /* Y */
370 { 1, 1, 0, 0, 8 }, /* U */
371 { 2, 1, 0, 0, 8 }, /* V */
373 .flags = AV_PIX_FMT_FLAG_PLANAR,
375 [AV_PIX_FMT_YUVJ411P] = {
381 { 0, 1, 0, 0, 8 }, /* Y */
382 { 1, 1, 0, 0, 8 }, /* U */
383 { 2, 1, 0, 0, 8 }, /* V */
385 .flags = AV_PIX_FMT_FLAG_PLANAR,
387 [AV_PIX_FMT_GRAY8] = {
393 { 0, 1, 0, 0, 8 }, /* Y */
397 [AV_PIX_FMT_MONOWHITE] = {
403 { 0, 1, 0, 0, 1 }, /* Y */
405 .flags = AV_PIX_FMT_FLAG_BITSTREAM,
407 [AV_PIX_FMT_MONOBLACK] = {
413 { 0, 1, 0, 7, 1 }, /* Y */
415 .flags = AV_PIX_FMT_FLAG_BITSTREAM,
417 [AV_PIX_FMT_PAL8] = {
425 .flags = AV_PIX_FMT_FLAG_PAL | AV_PIX_FMT_FLAG_ALPHA,
427 [AV_PIX_FMT_YUVJ420P] = {
433 { 0, 1, 0, 0, 8 }, /* Y */
434 { 1, 1, 0, 0, 8 }, /* U */
435 { 2, 1, 0, 0, 8 }, /* V */
437 .flags = AV_PIX_FMT_FLAG_PLANAR,
439 [AV_PIX_FMT_YUVJ422P] = {
445 { 0, 1, 0, 0, 8 }, /* Y */
446 { 1, 1, 0, 0, 8 }, /* U */
447 { 2, 1, 0, 0, 8 }, /* V */
449 .flags = AV_PIX_FMT_FLAG_PLANAR,
451 [AV_PIX_FMT_YUVJ444P] = {
457 { 0, 1, 0, 0, 8 }, /* Y */
458 { 1, 1, 0, 0, 8 }, /* U */
459 { 2, 1, 0, 0, 8 }, /* V */
461 .flags = AV_PIX_FMT_FLAG_PLANAR,
464 [AV_PIX_FMT_XVMC] = {
466 .flags = AV_PIX_FMT_FLAG_HWACCEL,
469 [AV_PIX_FMT_UYVY422] = {
475 { 0, 2, 1, 0, 8 }, /* Y */
476 { 0, 4, 0, 0, 8 }, /* U */
477 { 0, 4, 2, 0, 8 }, /* V */
480 [AV_PIX_FMT_UYYVYY411] = {
486 { 0, 4, 1, 0, 8 }, /* Y */
487 { 0, 6, 0, 0, 8 }, /* U */
488 { 0, 6, 3, 0, 8 }, /* V */
491 [AV_PIX_FMT_BGR8] = {
497 { 0, 1, 0, 0, 3 }, /* R */
498 { 0, 1, 0, 3, 3 }, /* G */
499 { 0, 1, 0, 6, 2 }, /* B */
501 .flags = AV_PIX_FMT_FLAG_RGB,
503 [AV_PIX_FMT_BGR4] = {
509 { 0, 4, 3, 0, 1 }, /* R */
510 { 0, 4, 1, 0, 2 }, /* G */
511 { 0, 4, 0, 0, 1 }, /* B */
513 .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
515 [AV_PIX_FMT_BGR4_BYTE] = {
521 { 0, 1, 0, 0, 1 }, /* R */
522 { 0, 1, 0, 1, 2 }, /* G */
523 { 0, 1, 0, 3, 1 }, /* B */
525 .flags = AV_PIX_FMT_FLAG_RGB,
527 [AV_PIX_FMT_RGB8] = {
533 { 0, 1, 0, 6, 2 }, /* R */
534 { 0, 1, 0, 3, 3 }, /* G */
535 { 0, 1, 0, 0, 3 }, /* B */
537 .flags = AV_PIX_FMT_FLAG_RGB,
539 [AV_PIX_FMT_RGB4] = {
545 { 0, 4, 0, 0, 1 }, /* R */
546 { 0, 4, 1, 0, 2 }, /* G */
547 { 0, 4, 3, 0, 1 }, /* B */
549 .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
551 [AV_PIX_FMT_RGB4_BYTE] = {
557 { 0, 1, 0, 3, 1 }, /* R */
558 { 0, 1, 0, 1, 2 }, /* G */
559 { 0, 1, 0, 0, 1 }, /* B */
561 .flags = AV_PIX_FMT_FLAG_RGB,
563 [AV_PIX_FMT_NV12] = {
569 { 0, 1, 0, 0, 8 }, /* Y */
570 { 1, 2, 0, 0, 8 }, /* U */
571 { 1, 2, 1, 0, 8 }, /* V */
573 .flags = AV_PIX_FMT_FLAG_PLANAR,
575 [AV_PIX_FMT_NV21] = {
581 { 0, 1, 0, 0, 8 }, /* Y */
582 { 1, 2, 1, 0, 8 }, /* U */
583 { 1, 2, 0, 0, 8 }, /* V */
585 .flags = AV_PIX_FMT_FLAG_PLANAR,
587 [AV_PIX_FMT_ARGB] = {
593 { 0, 4, 1, 0, 8 }, /* R */
594 { 0, 4, 2, 0, 8 }, /* G */
595 { 0, 4, 3, 0, 8 }, /* B */
596 { 0, 4, 0, 0, 8 }, /* A */
598 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
600 [AV_PIX_FMT_RGBA] = {
606 { 0, 4, 0, 0, 8 }, /* R */
607 { 0, 4, 1, 0, 8 }, /* G */
608 { 0, 4, 2, 0, 8 }, /* B */
609 { 0, 4, 3, 0, 8 }, /* A */
611 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
613 [AV_PIX_FMT_ABGR] = {
619 { 0, 4, 3, 0, 8 }, /* R */
620 { 0, 4, 2, 0, 8 }, /* G */
621 { 0, 4, 1, 0, 8 }, /* B */
622 { 0, 4, 0, 0, 8 }, /* A */
624 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
626 [AV_PIX_FMT_BGRA] = {
632 { 0, 4, 2, 0, 8 }, /* R */
633 { 0, 4, 1, 0, 8 }, /* G */
634 { 0, 4, 0, 0, 8 }, /* B */
635 { 0, 4, 3, 0, 8 }, /* A */
637 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
639 [AV_PIX_FMT_0RGB] = {
645 { 0, 4, 1, 0, 8 }, /* R */
646 { 0, 4, 2, 0, 8 }, /* G */
647 { 0, 4, 3, 0, 8 }, /* B */
649 .flags = AV_PIX_FMT_FLAG_RGB,
651 [AV_PIX_FMT_RGB0] = {
657 { 0, 4, 0, 0, 8 }, /* R */
658 { 0, 4, 1, 0, 8 }, /* G */
659 { 0, 4, 2, 0, 8 }, /* B */
661 .flags = AV_PIX_FMT_FLAG_RGB,
663 [AV_PIX_FMT_0BGR] = {
669 { 0, 4, 3, 0, 8 }, /* R */
670 { 0, 4, 2, 0, 8 }, /* G */
671 { 0, 4, 1, 0, 8 }, /* B */
673 .flags = AV_PIX_FMT_FLAG_RGB,
675 [AV_PIX_FMT_BGR0] = {
681 { 0, 4, 2, 0, 8 }, /* R */
682 { 0, 4, 1, 0, 8 }, /* G */
683 { 0, 4, 0, 0, 8 }, /* B */
685 .flags = AV_PIX_FMT_FLAG_RGB,
687 [AV_PIX_FMT_GRAY9BE] = {
693 { 0, 2, 0, 0, 9 }, /* Y */
695 .flags = AV_PIX_FMT_FLAG_BE,
698 [AV_PIX_FMT_GRAY9LE] = {
704 { 0, 2, 0, 0, 9 }, /* Y */
708 [AV_PIX_FMT_GRAY10BE] = {
714 { 0, 2, 0, 0, 10 }, /* Y */
716 .flags = AV_PIX_FMT_FLAG_BE,
719 [AV_PIX_FMT_GRAY10LE] = {
725 { 0, 2, 0, 0, 10 }, /* Y */
729 [AV_PIX_FMT_GRAY12BE] = {
735 { 0, 2, 0, 0, 12 }, /* Y */
737 .flags = AV_PIX_FMT_FLAG_BE,
740 [AV_PIX_FMT_GRAY12LE] = {
746 { 0, 2, 0, 0, 12 }, /* Y */
750 [AV_PIX_FMT_GRAY14BE] = {
756 { 0, 2, 0, 0, 14 }, /* Y */
758 .flags = AV_PIX_FMT_FLAG_BE,
761 [AV_PIX_FMT_GRAY14LE] = {
767 { 0, 2, 0, 0, 14 }, /* Y */
771 [AV_PIX_FMT_GRAY16BE] = {
777 { 0, 2, 0, 0, 16 }, /* Y */
779 .flags = AV_PIX_FMT_FLAG_BE,
782 [AV_PIX_FMT_GRAY16LE] = {
788 { 0, 2, 0, 0, 16 }, /* Y */
792 [AV_PIX_FMT_YUV440P] = {
798 { 0, 1, 0, 0, 8 }, /* Y */
799 { 1, 1, 0, 0, 8 }, /* U */
800 { 2, 1, 0, 0, 8 }, /* V */
802 .flags = AV_PIX_FMT_FLAG_PLANAR,
804 [AV_PIX_FMT_YUVJ440P] = {
810 { 0, 1, 0, 0, 8 }, /* Y */
811 { 1, 1, 0, 0, 8 }, /* U */
812 { 2, 1, 0, 0, 8 }, /* V */
814 .flags = AV_PIX_FMT_FLAG_PLANAR,
816 [AV_PIX_FMT_YUV440P10LE] = {
817 .name = "yuv440p10le",
822 { 0, 2, 0, 0, 10 }, /* Y */
823 { 1, 2, 0, 0, 10 }, /* U */
824 { 2, 2, 0, 0, 10 }, /* V */
826 .flags = AV_PIX_FMT_FLAG_PLANAR,
828 [AV_PIX_FMT_YUV440P10BE] = {
829 .name = "yuv440p10be",
834 { 0, 2, 0, 0, 10 }, /* Y */
835 { 1, 2, 0, 0, 10 }, /* U */
836 { 2, 2, 0, 0, 10 }, /* V */
838 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
840 [AV_PIX_FMT_YUV440P12LE] = {
841 .name = "yuv440p12le",
846 { 0, 2, 0, 0, 12 }, /* Y */
847 { 1, 2, 0, 0, 12 }, /* U */
848 { 2, 2, 0, 0, 12 }, /* V */
850 .flags = AV_PIX_FMT_FLAG_PLANAR,
852 [AV_PIX_FMT_YUV440P12BE] = {
853 .name = "yuv440p12be",
858 { 0, 2, 0, 0, 12 }, /* Y */
859 { 1, 2, 0, 0, 12 }, /* U */
860 { 2, 2, 0, 0, 12 }, /* V */
862 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
864 [AV_PIX_FMT_YUVA420P] = {
870 { 0, 1, 0, 0, 8 }, /* Y */
871 { 1, 1, 0, 0, 8 }, /* U */
872 { 2, 1, 0, 0, 8 }, /* V */
873 { 3, 1, 0, 0, 8 }, /* A */
875 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
877 [AV_PIX_FMT_YUVA422P] = {
883 { 0, 1, 0, 0, 8 }, /* Y */
884 { 1, 1, 0, 0, 8 }, /* U */
885 { 2, 1, 0, 0, 8 }, /* V */
886 { 3, 1, 0, 0, 8 }, /* A */
888 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
890 [AV_PIX_FMT_YUVA444P] = {
896 { 0, 1, 0, 0, 8 }, /* Y */
897 { 1, 1, 0, 0, 8 }, /* U */
898 { 2, 1, 0, 0, 8 }, /* V */
899 { 3, 1, 0, 0, 8 }, /* A */
901 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
903 [AV_PIX_FMT_YUVA420P9BE] = {
904 .name = "yuva420p9be",
909 { 0, 2, 0, 0, 9 }, /* Y */
910 { 1, 2, 0, 0, 9 }, /* U */
911 { 2, 2, 0, 0, 9 }, /* V */
912 { 3, 2, 0, 0, 9 }, /* A */
914 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
916 [AV_PIX_FMT_YUVA420P9LE] = {
917 .name = "yuva420p9le",
922 { 0, 2, 0, 0, 9 }, /* Y */
923 { 1, 2, 0, 0, 9 }, /* U */
924 { 2, 2, 0, 0, 9 }, /* V */
925 { 3, 2, 0, 0, 9 }, /* A */
927 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
929 [AV_PIX_FMT_YUVA422P9BE] = {
930 .name = "yuva422p9be",
935 { 0, 2, 0, 0, 9 }, /* Y */
936 { 1, 2, 0, 0, 9 }, /* U */
937 { 2, 2, 0, 0, 9 }, /* V */
938 { 3, 2, 0, 0, 9 }, /* A */
940 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
942 [AV_PIX_FMT_YUVA422P9LE] = {
943 .name = "yuva422p9le",
948 { 0, 2, 0, 0, 9 }, /* Y */
949 { 1, 2, 0, 0, 9 }, /* U */
950 { 2, 2, 0, 0, 9 }, /* V */
951 { 3, 2, 0, 0, 9 }, /* A */
953 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
955 [AV_PIX_FMT_YUVA444P9BE] = {
956 .name = "yuva444p9be",
961 { 0, 2, 0, 0, 9 }, /* Y */
962 { 1, 2, 0, 0, 9 }, /* U */
963 { 2, 2, 0, 0, 9 }, /* V */
964 { 3, 2, 0, 0, 9 }, /* A */
966 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
968 [AV_PIX_FMT_YUVA444P9LE] = {
969 .name = "yuva444p9le",
974 { 0, 2, 0, 0, 9 }, /* Y */
975 { 1, 2, 0, 0, 9 }, /* U */
976 { 2, 2, 0, 0, 9 }, /* V */
977 { 3, 2, 0, 0, 9 }, /* A */
979 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
981 [AV_PIX_FMT_YUVA420P10BE] = {
982 .name = "yuva420p10be",
987 { 0, 2, 0, 0, 10 }, /* Y */
988 { 1, 2, 0, 0, 10 }, /* U */
989 { 2, 2, 0, 0, 10 }, /* V */
990 { 3, 2, 0, 0, 10 }, /* A */
992 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
994 [AV_PIX_FMT_YUVA420P10LE] = {
995 .name = "yuva420p10le",
1000 { 0, 2, 0, 0, 10 }, /* Y */
1001 { 1, 2, 0, 0, 10 }, /* U */
1002 { 2, 2, 0, 0, 10 }, /* V */
1003 { 3, 2, 0, 0, 10 }, /* A */
1005 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1007 [AV_PIX_FMT_YUVA422P10BE] = {
1008 .name = "yuva422p10be",
1013 { 0, 2, 0, 0, 10 }, /* Y */
1014 { 1, 2, 0, 0, 10 }, /* U */
1015 { 2, 2, 0, 0, 10 }, /* V */
1016 { 3, 2, 0, 0, 10 }, /* A */
1018 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1020 [AV_PIX_FMT_YUVA422P10LE] = {
1021 .name = "yuva422p10le",
1026 { 0, 2, 0, 0, 10 }, /* Y */
1027 { 1, 2, 0, 0, 10 }, /* U */
1028 { 2, 2, 0, 0, 10 }, /* V */
1029 { 3, 2, 0, 0, 10 }, /* A */
1031 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1033 [AV_PIX_FMT_YUVA444P10BE] = {
1034 .name = "yuva444p10be",
1039 { 0, 2, 0, 0, 10 }, /* Y */
1040 { 1, 2, 0, 0, 10 }, /* U */
1041 { 2, 2, 0, 0, 10 }, /* V */
1042 { 3, 2, 0, 0, 10 }, /* A */
1044 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1046 [AV_PIX_FMT_YUVA444P10LE] = {
1047 .name = "yuva444p10le",
1052 { 0, 2, 0, 0, 10 }, /* Y */
1053 { 1, 2, 0, 0, 10 }, /* U */
1054 { 2, 2, 0, 0, 10 }, /* V */
1055 { 3, 2, 0, 0, 10 }, /* A */
1057 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1059 [AV_PIX_FMT_YUVA420P16BE] = {
1060 .name = "yuva420p16be",
1065 { 0, 2, 0, 0, 16 }, /* Y */
1066 { 1, 2, 0, 0, 16 }, /* U */
1067 { 2, 2, 0, 0, 16 }, /* V */
1068 { 3, 2, 0, 0, 16 }, /* A */
1070 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1072 [AV_PIX_FMT_YUVA420P16LE] = {
1073 .name = "yuva420p16le",
1078 { 0, 2, 0, 0, 16 }, /* Y */
1079 { 1, 2, 0, 0, 16 }, /* U */
1080 { 2, 2, 0, 0, 16 }, /* V */
1081 { 3, 2, 0, 0, 16 }, /* A */
1083 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1085 [AV_PIX_FMT_YUVA422P16BE] = {
1086 .name = "yuva422p16be",
1091 { 0, 2, 0, 0, 16 }, /* Y */
1092 { 1, 2, 0, 0, 16 }, /* U */
1093 { 2, 2, 0, 0, 16 }, /* V */
1094 { 3, 2, 0, 0, 16 }, /* A */
1096 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1098 [AV_PIX_FMT_YUVA422P16LE] = {
1099 .name = "yuva422p16le",
1104 { 0, 2, 0, 0, 16 }, /* Y */
1105 { 1, 2, 0, 0, 16 }, /* U */
1106 { 2, 2, 0, 0, 16 }, /* V */
1107 { 3, 2, 0, 0, 16 }, /* A */
1109 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1111 [AV_PIX_FMT_YUVA444P16BE] = {
1112 .name = "yuva444p16be",
1117 { 0, 2, 0, 0, 16 }, /* Y */
1118 { 1, 2, 0, 0, 16 }, /* U */
1119 { 2, 2, 0, 0, 16 }, /* V */
1120 { 3, 2, 0, 0, 16 }, /* A */
1122 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1124 [AV_PIX_FMT_YUVA444P16LE] = {
1125 .name = "yuva444p16le",
1130 { 0, 2, 0, 0, 16 }, /* Y */
1131 { 1, 2, 0, 0, 16 }, /* U */
1132 { 2, 2, 0, 0, 16 }, /* V */
1133 { 3, 2, 0, 0, 16 }, /* A */
1135 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
1137 [AV_PIX_FMT_RGB48BE] = {
1143 { 0, 6, 0, 0, 16 }, /* R */
1144 { 0, 6, 2, 0, 16 }, /* G */
1145 { 0, 6, 4, 0, 16 }, /* B */
1147 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
1149 [AV_PIX_FMT_RGB48LE] = {
1155 { 0, 6, 0, 0, 16 }, /* R */
1156 { 0, 6, 2, 0, 16 }, /* G */
1157 { 0, 6, 4, 0, 16 }, /* B */
1159 .flags = AV_PIX_FMT_FLAG_RGB,
1161 [AV_PIX_FMT_RGBA64BE] = {
1167 { 0, 8, 0, 0, 16 }, /* R */
1168 { 0, 8, 2, 0, 16 }, /* G */
1169 { 0, 8, 4, 0, 16 }, /* B */
1170 { 0, 8, 6, 0, 16 }, /* A */
1172 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1174 [AV_PIX_FMT_RGBA64LE] = {
1180 { 0, 8, 0, 0, 16 }, /* R */
1181 { 0, 8, 2, 0, 16 }, /* G */
1182 { 0, 8, 4, 0, 16 }, /* B */
1183 { 0, 8, 6, 0, 16 }, /* A */
1185 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1187 [AV_PIX_FMT_RGB565BE] = {
1193 { 0, 2, -1, 3, 5 }, /* R */
1194 { 0, 2, 0, 5, 6 }, /* G */
1195 { 0, 2, 0, 0, 5 }, /* B */
1197 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1199 [AV_PIX_FMT_RGB565LE] = {
1205 { 0, 2, 1, 3, 5 }, /* R */
1206 { 0, 2, 0, 5, 6 }, /* G */
1207 { 0, 2, 0, 0, 5 }, /* B */
1209 .flags = AV_PIX_FMT_FLAG_RGB,
1211 [AV_PIX_FMT_RGB555BE] = {
1217 { 0, 2, -1, 2, 5 }, /* R */
1218 { 0, 2, 0, 5, 5 }, /* G */
1219 { 0, 2, 0, 0, 5 }, /* B */
1221 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1223 [AV_PIX_FMT_RGB555LE] = {
1229 { 0, 2, 1, 2, 5 }, /* R */
1230 { 0, 2, 0, 5, 5 }, /* G */
1231 { 0, 2, 0, 0, 5 }, /* B */
1233 .flags = AV_PIX_FMT_FLAG_RGB,
1235 [AV_PIX_FMT_RGB444BE] = {
1241 { 0, 2, -1, 0, 4 }, /* R */
1242 { 0, 2, 0, 4, 4 }, /* G */
1243 { 0, 2, 0, 0, 4 }, /* B */
1245 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1247 [AV_PIX_FMT_RGB444LE] = {
1253 { 0, 2, 1, 0, 4 }, /* R */
1254 { 0, 2, 0, 4, 4 }, /* G */
1255 { 0, 2, 0, 0, 4 }, /* B */
1257 .flags = AV_PIX_FMT_FLAG_RGB,
1259 [AV_PIX_FMT_BGR48BE] = {
1265 { 0, 6, 4, 0, 16 }, /* R */
1266 { 0, 6, 2, 0, 16 }, /* G */
1267 { 0, 6, 0, 0, 16 }, /* B */
1269 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1271 [AV_PIX_FMT_BGR48LE] = {
1277 { 0, 6, 4, 0, 16 }, /* R */
1278 { 0, 6, 2, 0, 16 }, /* G */
1279 { 0, 6, 0, 0, 16 }, /* B */
1281 .flags = AV_PIX_FMT_FLAG_RGB,
1283 [AV_PIX_FMT_BGRA64BE] = {
1289 { 0, 8, 4, 0, 16 }, /* R */
1290 { 0, 8, 2, 0, 16 }, /* G */
1291 { 0, 8, 0, 0, 16 }, /* B */
1292 { 0, 8, 6, 0, 16 }, /* A */
1294 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1296 [AV_PIX_FMT_BGRA64LE] = {
1302 { 0, 8, 4, 0, 16 }, /* R */
1303 { 0, 8, 2, 0, 16 }, /* G */
1304 { 0, 8, 0, 0, 16 }, /* B */
1305 { 0, 8, 6, 0, 16 }, /* A */
1307 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1309 [AV_PIX_FMT_BGR565BE] = {
1315 { 0, 2, 0, 0, 5 }, /* R */
1316 { 0, 2, 0, 5, 6 }, /* G */
1317 { 0, 2, -1, 3, 5 }, /* B */
1319 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1321 [AV_PIX_FMT_BGR565LE] = {
1327 { 0, 2, 0, 0, 5 }, /* R */
1328 { 0, 2, 0, 5, 6 }, /* G */
1329 { 0, 2, 1, 3, 5 }, /* B */
1331 .flags = AV_PIX_FMT_FLAG_RGB,
1333 [AV_PIX_FMT_BGR555BE] = {
1339 { 0, 2, 0, 0, 5 }, /* R */
1340 { 0, 2, 0, 5, 5 }, /* G */
1341 { 0, 2, -1, 2, 5 }, /* B */
1343 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1345 [AV_PIX_FMT_BGR555LE] = {
1351 { 0, 2, 0, 0, 5 }, /* R */
1352 { 0, 2, 0, 5, 5 }, /* G */
1353 { 0, 2, 1, 2, 5 }, /* B */
1355 .flags = AV_PIX_FMT_FLAG_RGB,
1357 [AV_PIX_FMT_BGR444BE] = {
1363 { 0, 2, 0, 0, 4 }, /* R */
1364 { 0, 2, 0, 4, 4 }, /* G */
1365 { 0, 2, -1, 0, 4 }, /* B */
1367 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1369 [AV_PIX_FMT_BGR444LE] = {
1375 { 0, 2, 0, 0, 4 }, /* R */
1376 { 0, 2, 0, 4, 4 }, /* G */
1377 { 0, 2, 1, 0, 4 }, /* B */
1379 .flags = AV_PIX_FMT_FLAG_RGB,
1381 [AV_PIX_FMT_VAAPI] = {
1385 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1387 [AV_PIX_FMT_YUV420P9LE] = {
1388 .name = "yuv420p9le",
1393 { 0, 2, 0, 0, 9 }, /* Y */
1394 { 1, 2, 0, 0, 9 }, /* U */
1395 { 2, 2, 0, 0, 9 }, /* V */
1397 .flags = AV_PIX_FMT_FLAG_PLANAR,
1399 [AV_PIX_FMT_YUV420P9BE] = {
1400 .name = "yuv420p9be",
1405 { 0, 2, 0, 0, 9 }, /* Y */
1406 { 1, 2, 0, 0, 9 }, /* U */
1407 { 2, 2, 0, 0, 9 }, /* V */
1409 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1411 [AV_PIX_FMT_YUV420P10LE] = {
1412 .name = "yuv420p10le",
1417 { 0, 2, 0, 0, 10 }, /* Y */
1418 { 1, 2, 0, 0, 10 }, /* U */
1419 { 2, 2, 0, 0, 10 }, /* V */
1421 .flags = AV_PIX_FMT_FLAG_PLANAR,
1423 [AV_PIX_FMT_YUV420P10BE] = {
1424 .name = "yuv420p10be",
1429 { 0, 2, 0, 0, 10 }, /* Y */
1430 { 1, 2, 0, 0, 10 }, /* U */
1431 { 2, 2, 0, 0, 10 }, /* V */
1433 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1435 [AV_PIX_FMT_YUV420P12LE] = {
1436 .name = "yuv420p12le",
1441 { 0, 2, 0, 0, 12 }, /* Y */
1442 { 1, 2, 0, 0, 12 }, /* U */
1443 { 2, 2, 0, 0, 12 }, /* V */
1445 .flags = AV_PIX_FMT_FLAG_PLANAR,
1447 [AV_PIX_FMT_YUV420P12BE] = {
1448 .name = "yuv420p12be",
1453 { 0, 2, 0, 0, 12 }, /* Y */
1454 { 1, 2, 0, 0, 12 }, /* U */
1455 { 2, 2, 0, 0, 12 }, /* V */
1457 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1459 [AV_PIX_FMT_YUV420P14LE] = {
1460 .name = "yuv420p14le",
1465 { 0, 2, 0, 0, 14 }, /* Y */
1466 { 1, 2, 0, 0, 14 }, /* U */
1467 { 2, 2, 0, 0, 14 }, /* V */
1469 .flags = AV_PIX_FMT_FLAG_PLANAR,
1471 [AV_PIX_FMT_YUV420P14BE] = {
1472 .name = "yuv420p14be",
1477 { 0, 2, 0, 0, 14 }, /* Y */
1478 { 1, 2, 0, 0, 14 }, /* U */
1479 { 2, 2, 0, 0, 14 }, /* V */
1481 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1483 [AV_PIX_FMT_YUV420P16LE] = {
1484 .name = "yuv420p16le",
1489 { 0, 2, 0, 0, 16 }, /* Y */
1490 { 1, 2, 0, 0, 16 }, /* U */
1491 { 2, 2, 0, 0, 16 }, /* V */
1493 .flags = AV_PIX_FMT_FLAG_PLANAR,
1495 [AV_PIX_FMT_YUV420P16BE] = {
1496 .name = "yuv420p16be",
1501 { 0, 2, 0, 0, 16 }, /* Y */
1502 { 1, 2, 0, 0, 16 }, /* U */
1503 { 2, 2, 0, 0, 16 }, /* V */
1505 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1507 [AV_PIX_FMT_YUV422P9LE] = {
1508 .name = "yuv422p9le",
1513 { 0, 2, 0, 0, 9 }, /* Y */
1514 { 1, 2, 0, 0, 9 }, /* U */
1515 { 2, 2, 0, 0, 9 }, /* V */
1517 .flags = AV_PIX_FMT_FLAG_PLANAR,
1519 [AV_PIX_FMT_YUV422P9BE] = {
1520 .name = "yuv422p9be",
1525 { 0, 2, 0, 0, 9 }, /* Y */
1526 { 1, 2, 0, 0, 9 }, /* U */
1527 { 2, 2, 0, 0, 9 }, /* V */
1529 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1531 [AV_PIX_FMT_YUV422P10LE] = {
1532 .name = "yuv422p10le",
1537 { 0, 2, 0, 0, 10 }, /* Y */
1538 { 1, 2, 0, 0, 10 }, /* U */
1539 { 2, 2, 0, 0, 10 }, /* V */
1541 .flags = AV_PIX_FMT_FLAG_PLANAR,
1543 [AV_PIX_FMT_YUV422P10BE] = {
1544 .name = "yuv422p10be",
1549 { 0, 2, 0, 0, 10 }, /* Y */
1550 { 1, 2, 0, 0, 10 }, /* U */
1551 { 2, 2, 0, 0, 10 }, /* V */
1553 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1555 [AV_PIX_FMT_YUV422P12LE] = {
1556 .name = "yuv422p12le",
1561 { 0, 2, 0, 0, 12 }, /* Y */
1562 { 1, 2, 0, 0, 12 }, /* U */
1563 { 2, 2, 0, 0, 12 }, /* V */
1565 .flags = AV_PIX_FMT_FLAG_PLANAR,
1567 [AV_PIX_FMT_YUV422P12BE] = {
1568 .name = "yuv422p12be",
1573 { 0, 2, 0, 0, 12 }, /* Y */
1574 { 1, 2, 0, 0, 12 }, /* U */
1575 { 2, 2, 0, 0, 12 }, /* V */
1577 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1579 [AV_PIX_FMT_YUV422P14LE] = {
1580 .name = "yuv422p14le",
1585 { 0, 2, 0, 0, 14 }, /* Y */
1586 { 1, 2, 0, 0, 14 }, /* U */
1587 { 2, 2, 0, 0, 14 }, /* V */
1589 .flags = AV_PIX_FMT_FLAG_PLANAR,
1591 [AV_PIX_FMT_YUV422P14BE] = {
1592 .name = "yuv422p14be",
1597 { 0, 2, 0, 0, 14 }, /* Y */
1598 { 1, 2, 0, 0, 14 }, /* U */
1599 { 2, 2, 0, 0, 14 }, /* V */
1601 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1603 [AV_PIX_FMT_YUV422P16LE] = {
1604 .name = "yuv422p16le",
1609 { 0, 2, 0, 0, 16 }, /* Y */
1610 { 1, 2, 0, 0, 16 }, /* U */
1611 { 2, 2, 0, 0, 16 }, /* V */
1613 .flags = AV_PIX_FMT_FLAG_PLANAR,
1615 [AV_PIX_FMT_YUV422P16BE] = {
1616 .name = "yuv422p16be",
1621 { 0, 2, 0, 0, 16 }, /* Y */
1622 { 1, 2, 0, 0, 16 }, /* U */
1623 { 2, 2, 0, 0, 16 }, /* V */
1625 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1627 [AV_PIX_FMT_YUV444P16LE] = {
1628 .name = "yuv444p16le",
1633 { 0, 2, 0, 0, 16 }, /* Y */
1634 { 1, 2, 0, 0, 16 }, /* U */
1635 { 2, 2, 0, 0, 16 }, /* V */
1637 .flags = AV_PIX_FMT_FLAG_PLANAR,
1639 [AV_PIX_FMT_YUV444P16BE] = {
1640 .name = "yuv444p16be",
1645 { 0, 2, 0, 0, 16 }, /* Y */
1646 { 1, 2, 0, 0, 16 }, /* U */
1647 { 2, 2, 0, 0, 16 }, /* V */
1649 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1651 [AV_PIX_FMT_YUV444P10LE] = {
1652 .name = "yuv444p10le",
1657 { 0, 2, 0, 0, 10 }, /* Y */
1658 { 1, 2, 0, 0, 10 }, /* U */
1659 { 2, 2, 0, 0, 10 }, /* V */
1661 .flags = AV_PIX_FMT_FLAG_PLANAR,
1663 [AV_PIX_FMT_YUV444P10BE] = {
1664 .name = "yuv444p10be",
1669 { 0, 2, 0, 0, 10 }, /* Y */
1670 { 1, 2, 0, 0, 10 }, /* U */
1671 { 2, 2, 0, 0, 10 }, /* V */
1673 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1675 [AV_PIX_FMT_YUV444P9LE] = {
1676 .name = "yuv444p9le",
1681 { 0, 2, 0, 0, 9 }, /* Y */
1682 { 1, 2, 0, 0, 9 }, /* U */
1683 { 2, 2, 0, 0, 9 }, /* V */
1685 .flags = AV_PIX_FMT_FLAG_PLANAR,
1687 [AV_PIX_FMT_YUV444P9BE] = {
1688 .name = "yuv444p9be",
1693 { 0, 2, 0, 0, 9 }, /* Y */
1694 { 1, 2, 0, 0, 9 }, /* U */
1695 { 2, 2, 0, 0, 9 }, /* V */
1697 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1699 [AV_PIX_FMT_YUV444P12LE] = {
1700 .name = "yuv444p12le",
1705 { 0, 2, 0, 0, 12 }, /* Y */
1706 { 1, 2, 0, 0, 12 }, /* U */
1707 { 2, 2, 0, 0, 12 }, /* V */
1709 .flags = AV_PIX_FMT_FLAG_PLANAR,
1711 [AV_PIX_FMT_YUV444P12BE] = {
1712 .name = "yuv444p12be",
1717 { 0, 2, 0, 0, 12 }, /* Y */
1718 { 1, 2, 0, 0, 12 }, /* U */
1719 { 2, 2, 0, 0, 12 }, /* V */
1721 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1723 [AV_PIX_FMT_YUV444P14LE] = {
1724 .name = "yuv444p14le",
1729 { 0, 2, 0, 0, 14 }, /* Y */
1730 { 1, 2, 0, 0, 14 }, /* U */
1731 { 2, 2, 0, 0, 14 }, /* V */
1733 .flags = AV_PIX_FMT_FLAG_PLANAR,
1735 [AV_PIX_FMT_YUV444P14BE] = {
1736 .name = "yuv444p14be",
1741 { 0, 2, 0, 0, 14 }, /* Y */
1742 { 1, 2, 0, 0, 14 }, /* U */
1743 { 2, 2, 0, 0, 14 }, /* V */
1745 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1747 [AV_PIX_FMT_D3D11VA_VLD] = {
1748 .name = "d3d11va_vld",
1751 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1753 [AV_PIX_FMT_DXVA2_VLD] = {
1754 .name = "dxva2_vld",
1757 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1759 [AV_PIX_FMT_YA8] = {
1763 { 0, 2, 0, 0, 8 }, /* Y */
1764 { 0, 2, 1, 0, 8 }, /* A */
1766 .flags = AV_PIX_FMT_FLAG_ALPHA,
1769 [AV_PIX_FMT_YA16LE] = {
1773 { 0, 4, 0, 0, 16 }, /* Y */
1774 { 0, 4, 2, 0, 16 }, /* A */
1776 .flags = AV_PIX_FMT_FLAG_ALPHA,
1778 [AV_PIX_FMT_YA16BE] = {
1782 { 0, 4, 0, 0, 16 }, /* Y */
1783 { 0, 4, 2, 0, 16 }, /* A */
1785 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_ALPHA,
1787 [AV_PIX_FMT_VIDEOTOOLBOX] = {
1788 .name = "videotoolbox_vld",
1789 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1791 [AV_PIX_FMT_GBRP] = {
1797 { 2, 1, 0, 0, 8 }, /* R */
1798 { 0, 1, 0, 0, 8 }, /* G */
1799 { 1, 1, 0, 0, 8 }, /* B */
1801 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1803 [AV_PIX_FMT_GBRP9LE] = {
1809 { 2, 2, 0, 0, 9 }, /* R */
1810 { 0, 2, 0, 0, 9 }, /* G */
1811 { 1, 2, 0, 0, 9 }, /* B */
1813 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1815 [AV_PIX_FMT_GBRP9BE] = {
1821 { 2, 2, 0, 0, 9 }, /* R */
1822 { 0, 2, 0, 0, 9 }, /* G */
1823 { 1, 2, 0, 0, 9 }, /* B */
1825 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1827 [AV_PIX_FMT_GBRP10LE] = {
1833 { 2, 2, 0, 0, 10 }, /* R */
1834 { 0, 2, 0, 0, 10 }, /* G */
1835 { 1, 2, 0, 0, 10 }, /* B */
1837 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1839 [AV_PIX_FMT_GBRP10BE] = {
1845 { 2, 2, 0, 0, 10 }, /* R */
1846 { 0, 2, 0, 0, 10 }, /* G */
1847 { 1, 2, 0, 0, 10 }, /* B */
1849 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1851 [AV_PIX_FMT_GBRP12LE] = {
1857 { 2, 2, 0, 0, 12 }, /* R */
1858 { 0, 2, 0, 0, 12 }, /* G */
1859 { 1, 2, 0, 0, 12 }, /* B */
1861 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1863 [AV_PIX_FMT_GBRP12BE] = {
1869 { 2, 2, 0, 0, 12 }, /* R */
1870 { 0, 2, 0, 0, 12 }, /* G */
1871 { 1, 2, 0, 0, 12 }, /* B */
1873 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1875 [AV_PIX_FMT_GBRP14LE] = {
1881 { 2, 2, 0, 0, 14 }, /* R */
1882 { 0, 2, 0, 0, 14 }, /* G */
1883 { 1, 2, 0, 0, 14 }, /* B */
1885 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1887 [AV_PIX_FMT_GBRP14BE] = {
1893 { 2, 2, 0, 0, 14 }, /* R */
1894 { 0, 2, 0, 0, 14 }, /* G */
1895 { 1, 2, 0, 0, 14 }, /* B */
1897 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1899 [AV_PIX_FMT_GBRP16LE] = {
1905 { 2, 2, 0, 0, 16 }, /* R */
1906 { 0, 2, 0, 0, 16 }, /* G */
1907 { 1, 2, 0, 0, 16 }, /* B */
1909 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1911 [AV_PIX_FMT_GBRP16BE] = {
1917 { 2, 2, 0, 0, 16 }, /* R */
1918 { 0, 2, 0, 0, 16 }, /* G */
1919 { 1, 2, 0, 0, 16 }, /* B */
1921 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1923 [AV_PIX_FMT_GBRAP] = {
1929 { 2, 1, 0, 0, 8 }, /* R */
1930 { 0, 1, 0, 0, 8 }, /* G */
1931 { 1, 1, 0, 0, 8 }, /* B */
1932 { 3, 1, 0, 0, 8 }, /* A */
1934 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
1935 AV_PIX_FMT_FLAG_ALPHA,
1937 [AV_PIX_FMT_GBRAP16LE] = {
1938 .name = "gbrap16le",
1943 { 2, 2, 0, 0, 16 }, /* R */
1944 { 0, 2, 0, 0, 16 }, /* G */
1945 { 1, 2, 0, 0, 16 }, /* B */
1946 { 3, 2, 0, 0, 16 }, /* A */
1948 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
1949 AV_PIX_FMT_FLAG_ALPHA,
1951 [AV_PIX_FMT_GBRAP16BE] = {
1952 .name = "gbrap16be",
1957 { 2, 2, 0, 0, 16 }, /* R */
1958 { 0, 2, 0, 0, 16 }, /* G */
1959 { 1, 2, 0, 0, 16 }, /* B */
1960 { 3, 2, 0, 0, 16 }, /* A */
1962 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
1963 AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1965 [AV_PIX_FMT_VDPAU] = {
1969 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1971 [AV_PIX_FMT_XYZ12LE] = {
1977 { 0, 6, 0, 4, 12 }, /* X */
1978 { 0, 6, 2, 4, 12 }, /* Y */
1979 { 0, 6, 4, 4, 12 }, /* Z */
1981 /*.flags = -- not used*/
1983 [AV_PIX_FMT_XYZ12BE] = {
1989 { 0, 6, 0, 4, 12 }, /* X */
1990 { 0, 6, 2, 4, 12 }, /* Y */
1991 { 0, 6, 4, 4, 12 }, /* Z */
1993 .flags = AV_PIX_FMT_FLAG_BE,
1996 #define BAYER8_DESC_COMMON \
1997 .nb_components= 3, \
1998 .log2_chroma_w= 0, \
1999 .log2_chroma_h= 0, \
2001 { 0, 1, 0, 0, 2 }, \
2002 { 0, 1, 0, 0, 4 }, \
2003 { 0, 1, 0, 0, 2 }, \
2006 #define BAYER16_DESC_COMMON \
2007 .nb_components= 3, \
2008 .log2_chroma_w= 0, \
2009 .log2_chroma_h= 0, \
2011 { 0, 2, 0, 0, 4 }, \
2012 { 0, 2, 0, 0, 8 }, \
2013 { 0, 2, 0, 0, 4 }, \
2016 [AV_PIX_FMT_BAYER_BGGR8] = {
2017 .name = "bayer_bggr8",
2019 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2021 [AV_PIX_FMT_BAYER_BGGR16LE] = {
2022 .name = "bayer_bggr16le",
2024 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2026 [AV_PIX_FMT_BAYER_BGGR16BE] = {
2027 .name = "bayer_bggr16be",
2029 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2031 [AV_PIX_FMT_BAYER_RGGB8] = {
2032 .name = "bayer_rggb8",
2034 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2036 [AV_PIX_FMT_BAYER_RGGB16LE] = {
2037 .name = "bayer_rggb16le",
2039 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2041 [AV_PIX_FMT_BAYER_RGGB16BE] = {
2042 .name = "bayer_rggb16be",
2044 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2046 [AV_PIX_FMT_BAYER_GBRG8] = {
2047 .name = "bayer_gbrg8",
2049 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2051 [AV_PIX_FMT_BAYER_GBRG16LE] = {
2052 .name = "bayer_gbrg16le",
2054 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2056 [AV_PIX_FMT_BAYER_GBRG16BE] = {
2057 .name = "bayer_gbrg16be",
2059 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2061 [AV_PIX_FMT_BAYER_GRBG8] = {
2062 .name = "bayer_grbg8",
2064 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2066 [AV_PIX_FMT_BAYER_GRBG16LE] = {
2067 .name = "bayer_grbg16le",
2069 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2071 [AV_PIX_FMT_BAYER_GRBG16BE] = {
2072 .name = "bayer_grbg16be",
2074 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BAYER,
2076 [AV_PIX_FMT_NV16] = {
2082 { 0, 1, 0, 0, 8 }, /* Y */
2083 { 1, 2, 0, 0, 8 }, /* U */
2084 { 1, 2, 1, 0, 8 }, /* V */
2086 .flags = AV_PIX_FMT_FLAG_PLANAR,
2088 [AV_PIX_FMT_NV20LE] = {
2094 { 0, 2, 0, 0, 10 }, /* Y */
2095 { 1, 4, 0, 0, 10 }, /* U */
2096 { 1, 4, 2, 0, 10 }, /* V */
2098 .flags = AV_PIX_FMT_FLAG_PLANAR,
2100 [AV_PIX_FMT_NV20BE] = {
2106 { 0, 2, 0, 0, 10 }, /* Y */
2107 { 1, 4, 0, 0, 10 }, /* U */
2108 { 1, 4, 2, 0, 10 }, /* V */
2110 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2112 [AV_PIX_FMT_QSV] = {
2114 .flags = AV_PIX_FMT_FLAG_HWACCEL,
2116 [AV_PIX_FMT_MEDIACODEC] = {
2117 .name = "mediacodec",
2118 .flags = AV_PIX_FMT_FLAG_HWACCEL,
2120 [AV_PIX_FMT_MMAL] = {
2122 .flags = AV_PIX_FMT_FLAG_HWACCEL,
2124 [AV_PIX_FMT_CUDA] = {
2126 .flags = AV_PIX_FMT_FLAG_HWACCEL,
2128 [AV_PIX_FMT_AYUV64LE] = {
2134 { 0, 8, 2, 0, 16 }, /* Y */
2135 { 0, 8, 4, 0, 16 }, /* U */
2136 { 0, 8, 6, 0, 16 }, /* V */
2137 { 0, 8, 0, 0, 16 }, /* A */
2139 .flags = AV_PIX_FMT_FLAG_ALPHA,
2141 [AV_PIX_FMT_AYUV64BE] = {
2147 { 0, 8, 2, 0, 16 }, /* Y */
2148 { 0, 8, 4, 0, 16 }, /* U */
2149 { 0, 8, 6, 0, 16 }, /* V */
2150 { 0, 8, 0, 0, 16 }, /* A */
2152 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_ALPHA,
2154 [AV_PIX_FMT_P010LE] = {
2160 { 0, 2, 0, 6, 10 }, /* Y */
2161 { 1, 4, 0, 6, 10 }, /* U */
2162 { 1, 4, 2, 6, 10 }, /* V */
2164 .flags = AV_PIX_FMT_FLAG_PLANAR,
2166 [AV_PIX_FMT_P010BE] = {
2172 { 0, 2, 0, 6, 10 }, /* Y */
2173 { 1, 4, 0, 6, 10 }, /* U */
2174 { 1, 4, 2, 6, 10 }, /* V */
2176 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2178 [AV_PIX_FMT_P012LE] = {
2184 { 0, 2, 0, 4, 12 }, /* Y */
2185 { 1, 4, 0, 4, 12 }, /* U */
2186 { 1, 4, 2, 4, 12 }, /* V */
2188 .flags = AV_PIX_FMT_FLAG_PLANAR,
2190 [AV_PIX_FMT_P012BE] = {
2196 { 0, 2, 0, 4, 12 }, /* Y */
2197 { 1, 4, 0, 4, 12 }, /* U */
2198 { 1, 4, 2, 4, 12 }, /* V */
2200 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2202 [AV_PIX_FMT_P016LE] = {
2208 { 0, 2, 0, 0, 16 }, /* Y */
2209 { 1, 4, 0, 0, 16 }, /* U */
2210 { 1, 4, 2, 0, 16 }, /* V */
2212 .flags = AV_PIX_FMT_FLAG_PLANAR,
2214 [AV_PIX_FMT_P016BE] = {
2220 { 0, 2, 0, 0, 16 }, /* Y */
2221 { 1, 4, 0, 0, 16 }, /* U */
2222 { 1, 4, 2, 0, 16 }, /* V */
2224 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2226 [AV_PIX_FMT_GBRAP14LE] = {
2227 .name = "gbrap14le",
2232 { 2, 2, 0, 0, 14 }, /* R */
2233 { 0, 2, 0, 0, 14 }, /* G */
2234 { 1, 2, 0, 0, 14 }, /* B */
2235 { 3, 2, 0, 0, 14 }, /* A */
2237 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
2238 AV_PIX_FMT_FLAG_ALPHA,
2240 [AV_PIX_FMT_GBRAP14BE] = {
2241 .name = "gbrap14be",
2246 { 2, 2, 0, 0, 14 }, /* R */
2247 { 0, 2, 0, 0, 14 }, /* G */
2248 { 1, 2, 0, 0, 14 }, /* B */
2249 { 3, 2, 0, 0, 14 }, /* A */
2251 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2252 AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
2254 [AV_PIX_FMT_GBRAP12LE] = {
2255 .name = "gbrap12le",
2260 { 2, 2, 0, 0, 12 }, /* R */
2261 { 0, 2, 0, 0, 12 }, /* G */
2262 { 1, 2, 0, 0, 12 }, /* B */
2263 { 3, 2, 0, 0, 12 }, /* A */
2265 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
2266 AV_PIX_FMT_FLAG_ALPHA,
2268 [AV_PIX_FMT_GBRAP12BE] = {
2269 .name = "gbrap12be",
2274 { 2, 2, 0, 0, 12 }, /* R */
2275 { 0, 2, 0, 0, 12 }, /* G */
2276 { 1, 2, 0, 0, 12 }, /* B */
2277 { 3, 2, 0, 0, 12 }, /* A */
2279 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2280 AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
2282 [AV_PIX_FMT_GBRAP10LE] = {
2283 .name = "gbrap10le",
2288 { 2, 2, 0, 0, 10 }, /* R */
2289 { 0, 2, 0, 0, 10 }, /* G */
2290 { 1, 2, 0, 0, 10 }, /* B */
2291 { 3, 2, 0, 0, 10 }, /* A */
2293 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB |
2294 AV_PIX_FMT_FLAG_ALPHA,
2296 [AV_PIX_FMT_GBRAP10BE] = {
2297 .name = "gbrap10be",
2302 { 2, 2, 0, 0, 10 }, /* R */
2303 { 0, 2, 0, 0, 10 }, /* G */
2304 { 1, 2, 0, 0, 10 }, /* B */
2305 { 3, 2, 0, 0, 10 }, /* A */
2307 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2308 AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
2310 [AV_PIX_FMT_D3D11] = {
2312 .flags = AV_PIX_FMT_FLAG_HWACCEL,
2314 [AV_PIX_FMT_GBRPF32BE] = {
2315 .name = "gbrpf32be",
2320 { 2, 4, 0, 0, 32 }, /* R */
2321 { 0, 4, 0, 0, 32 }, /* G */
2322 { 1, 4, 0, 0, 32 }, /* B */
2324 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2325 AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_FLOAT,
2327 [AV_PIX_FMT_GBRPF32LE] = {
2328 .name = "gbrpf32le",
2333 { 2, 4, 0, 0, 32 }, /* R */
2334 { 0, 4, 0, 0, 32 }, /* G */
2335 { 1, 4, 0, 0, 32 }, /* B */
2337 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_FLOAT | AV_PIX_FMT_FLAG_RGB,
2339 [AV_PIX_FMT_GBRAPF32BE] = {
2340 .name = "gbrapf32be",
2345 { 2, 4, 0, 0, 32 }, /* R */
2346 { 0, 4, 0, 0, 32 }, /* G */
2347 { 1, 4, 0, 0, 32 }, /* B */
2348 { 3, 4, 0, 0, 32 }, /* A */
2350 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR |
2351 AV_PIX_FMT_FLAG_ALPHA | AV_PIX_FMT_FLAG_RGB |
2352 AV_PIX_FMT_FLAG_FLOAT,
2354 [AV_PIX_FMT_GBRAPF32LE] = {
2355 .name = "gbrapf32le",
2360 { 2, 4, 0, 0, 32 }, /* R */
2361 { 0, 4, 0, 0, 32 }, /* G */
2362 { 1, 4, 0, 0, 32 }, /* B */
2363 { 3, 4, 0, 0, 32 }, /* A */
2365 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA |
2366 AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_FLOAT,
2368 [AV_PIX_FMT_DRM_PRIME] = {
2369 .name = "drm_prime",
2370 .flags = AV_PIX_FMT_FLAG_HWACCEL,
2372 [AV_PIX_FMT_OPENCL] = {
2374 .flags = AV_PIX_FMT_FLAG_HWACCEL,
2376 [AV_PIX_FMT_GRAYF32BE] = {
2377 .name = "grayf32be",
2382 { 0, 4, 0, 0, 32 }, /* Y */
2384 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_FLOAT,
2387 [AV_PIX_FMT_GRAYF32LE] = {
2388 .name = "grayf32le",
2393 { 0, 4, 0, 0, 32 }, /* Y */
2395 .flags = AV_PIX_FMT_FLAG_FLOAT,
2398 [AV_PIX_FMT_YUVA422P12BE] = {
2399 .name = "yuva422p12be",
2404 { 0, 2, 0, 0, 12 }, /* Y */
2405 { 1, 2, 0, 0, 12 }, /* U */
2406 { 2, 2, 0, 0, 12 }, /* V */
2407 { 3, 2, 0, 0, 12 }, /* A */
2409 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
2411 [AV_PIX_FMT_YUVA422P12LE] = {
2412 .name = "yuva422p12le",
2417 { 0, 2, 0, 0, 12 }, /* Y */
2418 { 1, 2, 0, 0, 12 }, /* U */
2419 { 2, 2, 0, 0, 12 }, /* V */
2420 { 3, 2, 0, 0, 12 }, /* A */
2422 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
2424 [AV_PIX_FMT_YUVA444P12BE] = {
2425 .name = "yuva444p12be",
2430 { 0, 2, 0, 0, 12 }, /* Y */
2431 { 1, 2, 0, 0, 12 }, /* U */
2432 { 2, 2, 0, 0, 12 }, /* V */
2433 { 3, 2, 0, 0, 12 }, /* A */
2435 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
2437 [AV_PIX_FMT_YUVA444P12LE] = {
2438 .name = "yuva444p12le",
2443 { 0, 2, 0, 0, 12 }, /* Y */
2444 { 1, 2, 0, 0, 12 }, /* U */
2445 { 2, 2, 0, 0, 12 }, /* V */
2446 { 3, 2, 0, 0, 12 }, /* A */
2448 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
2450 [AV_PIX_FMT_NV24] = {
2456 { 0, 1, 0, 0, 8 }, /* Y */
2457 { 1, 2, 0, 0, 8 }, /* U */
2458 { 1, 2, 1, 0, 8 }, /* V */
2460 .flags = AV_PIX_FMT_FLAG_PLANAR,
2462 [AV_PIX_FMT_NV42] = {
2468 { 0, 1, 0, 0, 8 }, /* Y */
2469 { 1, 2, 1, 0, 8 }, /* U */
2470 { 1, 2, 0, 0, 8 }, /* V */
2472 .flags = AV_PIX_FMT_FLAG_PLANAR,
2474 [AV_PIX_FMT_VULKAN] = {
2476 .flags = AV_PIX_FMT_FLAG_HWACCEL,
2478 [AV_PIX_FMT_P210BE] = {
2484 { 0, 2, 0, 6, 10 }, /* Y */
2485 { 1, 4, 0, 6, 10 }, /* U */
2486 { 1, 4, 2, 6, 10 }, /* V */
2488 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2490 [AV_PIX_FMT_P210LE] = {
2496 { 0, 2, 0, 6, 10 }, /* Y */
2497 { 1, 4, 0, 6, 10 }, /* U */
2498 { 1, 4, 2, 6, 10 }, /* V */
2500 .flags = AV_PIX_FMT_FLAG_PLANAR,
2502 [AV_PIX_FMT_P410BE] = {
2508 { 0, 2, 0, 6, 10 }, /* Y */
2509 { 1, 4, 0, 6, 10 }, /* U */
2510 { 1, 4, 2, 6, 10 }, /* V */
2512 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2514 [AV_PIX_FMT_P410LE] = {
2520 { 0, 2, 0, 6, 10 }, /* Y */
2521 { 1, 4, 0, 6, 10 }, /* U */
2522 { 1, 4, 2, 6, 10 }, /* V */
2524 .flags = AV_PIX_FMT_FLAG_PLANAR,
2526 [AV_PIX_FMT_P216BE] = {
2532 { 0, 2, 0, 0, 16 }, /* Y */
2533 { 1, 4, 0, 0, 16 }, /* U */
2534 { 1, 4, 2, 0, 16 }, /* V */
2536 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2538 [AV_PIX_FMT_P216LE] = {
2544 { 0, 2, 0, 0, 16 }, /* Y */
2545 { 1, 4, 0, 0, 16 }, /* U */
2546 { 1, 4, 2, 0, 16 }, /* V */
2548 .flags = AV_PIX_FMT_FLAG_PLANAR,
2550 [AV_PIX_FMT_P416BE] = {
2556 { 0, 2, 0, 0, 16 }, /* Y */
2557 { 1, 4, 0, 0, 16 }, /* U */
2558 { 1, 4, 2, 0, 16 }, /* V */
2560 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2562 [AV_PIX_FMT_P416LE] = {
2568 { 0, 2, 0, 0, 16 }, /* Y */
2569 { 1, 4, 0, 0, 16 }, /* U */
2570 { 1, 4, 2, 0, 16 }, /* V */
2572 .flags = AV_PIX_FMT_FLAG_PLANAR,
2574 [AV_PIX_FMT_VUYA] = {
2580 { 0, 4, 2, 0, 8 }, /* Y */
2581 { 0, 4, 1, 0, 8 }, /* U */
2582 { 0, 4, 0, 0, 8 }, /* V */
2583 { 0, 4, 3, 0, 8 }, /* A */
2585 .flags = AV_PIX_FMT_FLAG_ALPHA,
2587 [AV_PIX_FMT_VUYX] = {
2593 { 0, 4, 2, 0, 8 }, /* Y */
2594 { 0, 4, 1, 0, 8 }, /* U */
2595 { 0, 4, 0, 0, 8 }, /* V */
2598 [AV_PIX_FMT_RGBAF16BE] = {
2599 .name = "rgbaf16be",
2604 { 0, 8, 0, 0, 16 }, /* R */
2605 { 0, 8, 2, 0, 16 }, /* G */
2606 { 0, 8, 4, 0, 16 }, /* B */
2607 { 0, 8, 6, 0, 16 }, /* A */
2609 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB |
2610 AV_PIX_FMT_FLAG_ALPHA | AV_PIX_FMT_FLAG_FLOAT,
2612 [AV_PIX_FMT_RGBAF16LE] = {
2613 .name = "rgbaf16le",
2618 { 0, 8, 0, 0, 16 }, /* R */
2619 { 0, 8, 2, 0, 16 }, /* G */
2620 { 0, 8, 4, 0, 16 }, /* B */
2621 { 0, 8, 6, 0, 16 }, /* A */
2623 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA |
2624 AV_PIX_FMT_FLAG_FLOAT,
2626 [AV_PIX_FMT_Y212LE] = {
2632 { 0, 4, 0, 4, 12 }, /* Y */
2633 { 0, 8, 2, 4, 12 }, /* U */
2634 { 0, 8, 6, 4, 12 }, /* V */
2637 [AV_PIX_FMT_Y212BE] = {
2643 { 0, 4, 0, 4, 12 }, /* Y */
2644 { 0, 8, 2, 4, 12 }, /* U */
2645 { 0, 8, 6, 4, 12 }, /* V */
2647 .flags = AV_PIX_FMT_FLAG_BE,
2649 [AV_PIX_FMT_XV30LE] = {
2655 { 0, 4, 1, 2, 10 }, /* Y */
2656 { 0, 4, 0, 0, 10 }, /* U */
2657 { 0, 4, 2, 4, 10 }, /* V */
2660 [AV_PIX_FMT_XV30BE] = {
2666 { 0, 32, 10, 0, 10 }, /* Y */
2667 { 0, 32, 0, 0, 10 }, /* U */
2668 { 0, 32, 20, 0, 10 }, /* V */
2670 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_BITSTREAM,
2672 [AV_PIX_FMT_XV36LE] = {
2678 { 0, 8, 2, 4, 12 }, /* Y */
2679 { 0, 8, 0, 4, 12 }, /* U */
2680 { 0, 8, 4, 4, 12 }, /* V */
2683 [AV_PIX_FMT_XV36BE] = {
2689 { 0, 8, 2, 4, 12 }, /* Y */
2690 { 0, 8, 0, 4, 12 }, /* U */
2691 { 0, 8, 4, 4, 12 }, /* V */
2693 .flags = AV_PIX_FMT_FLAG_BE,
2695 [AV_PIX_FMT_RGBF32BE] = {
2701 { 0, 12, 0, 0, 32 }, /* R */
2702 { 0, 12, 4, 0, 32 }, /* G */
2703 { 0, 12, 8, 0, 32 }, /* B */
2705 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB |
2706 AV_PIX_FMT_FLAG_FLOAT,
2708 [AV_PIX_FMT_RGBF32LE] = {
2714 { 0, 12, 0, 0, 32 }, /* R */
2715 { 0, 12, 4, 0, 32 }, /* G */
2716 { 0, 12, 8, 0, 32 }, /* B */
2718 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_FLOAT,
2720 [AV_PIX_FMT_RGBAF32BE] = {
2721 .name = "rgbaf32be",
2726 { 0, 16, 0, 0, 32 }, /* R */
2727 { 0, 16, 4, 0, 32 }, /* G */
2728 { 0, 16, 8, 0, 32 }, /* B */
2729 { 0, 16, 12, 0, 32 }, /* A */
2731 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB |
2732 AV_PIX_FMT_FLAG_FLOAT | AV_PIX_FMT_FLAG_ALPHA,
2734 [AV_PIX_FMT_RGBAF32LE] = {
2735 .name = "rgbaf32le",
2740 { 0, 16, 0, 0, 32 }, /* R */
2741 { 0, 16, 4, 0, 32 }, /* G */
2742 { 0, 16, 8, 0, 32 }, /* B */
2743 { 0, 16, 12, 0, 32 }, /* A */
2745 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_FLOAT |
2746 AV_PIX_FMT_FLAG_ALPHA,
2748 [AV_PIX_FMT_P212BE] = {
2754 { 0, 2, 0, 4, 12 }, /* Y */
2755 { 1, 4, 0, 4, 12 }, /* U */
2756 { 1, 4, 2, 4, 12 }, /* V */
2758 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2760 [AV_PIX_FMT_P212LE] = {
2766 { 0, 2, 0, 4, 12 }, /* Y */
2767 { 1, 4, 0, 4, 12 }, /* U */
2768 { 1, 4, 2, 4, 12 }, /* V */
2770 .flags = AV_PIX_FMT_FLAG_PLANAR,
2772 [AV_PIX_FMT_P412BE] = {
2778 { 0, 2, 0, 4, 12 }, /* Y */
2779 { 1, 4, 0, 4, 12 }, /* U */
2780 { 1, 4, 2, 4, 12 }, /* V */
2782 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
2784 [AV_PIX_FMT_P412LE] = {
2790 { 0, 2, 0, 4, 12 }, /* Y */
2791 { 1, 4, 0, 4, 12 }, /* U */
2792 { 1, 4, 2, 4, 12 }, /* V */
2794 .flags = AV_PIX_FMT_FLAG_PLANAR,
2798 static const char * const color_range_names[] = {
2799 [AVCOL_RANGE_UNSPECIFIED] = "unknown",
2800 [AVCOL_RANGE_MPEG] = "tv",
2801 [AVCOL_RANGE_JPEG] = "pc",
2804 static const char * const color_primaries_names[AVCOL_PRI_NB] = {
2805 [AVCOL_PRI_RESERVED0] = "reserved",
2806 [AVCOL_PRI_BT709] = "bt709",
2807 [AVCOL_PRI_UNSPECIFIED] = "unknown",
2808 [AVCOL_PRI_RESERVED] = "reserved",
2809 [AVCOL_PRI_BT470M] = "bt470m",
2810 [AVCOL_PRI_BT470BG] = "bt470bg",
2811 [AVCOL_PRI_SMPTE170M] = "smpte170m",
2812 [AVCOL_PRI_SMPTE240M] = "smpte240m",
2813 [AVCOL_PRI_FILM] = "film",
2814 [AVCOL_PRI_BT2020] = "bt2020",
2815 [AVCOL_PRI_SMPTE428] = "smpte428",
2816 [AVCOL_PRI_SMPTE431] = "smpte431",
2817 [AVCOL_PRI_SMPTE432] = "smpte432",
2818 [AVCOL_PRI_EBU3213] = "ebu3213",
2821 static const char * const color_transfer_names[] = {
2822 [AVCOL_TRC_RESERVED0] = "reserved",
2823 [AVCOL_TRC_BT709] = "bt709",
2824 [AVCOL_TRC_UNSPECIFIED] = "unknown",
2825 [AVCOL_TRC_RESERVED] = "reserved",
2826 [AVCOL_TRC_GAMMA22] = "bt470m",
2827 [AVCOL_TRC_GAMMA28] = "bt470bg",
2828 [AVCOL_TRC_SMPTE170M] = "smpte170m",
2829 [AVCOL_TRC_SMPTE240M] = "smpte240m",
2830 [AVCOL_TRC_LINEAR] = "linear",
2831 [AVCOL_TRC_LOG] = "log100",
2832 [AVCOL_TRC_LOG_SQRT] = "log316",
2833 [AVCOL_TRC_IEC61966_2_4] = "iec61966-2-4",
2834 [AVCOL_TRC_BT1361_ECG] = "bt1361e",
2835 [AVCOL_TRC_IEC61966_2_1] = "iec61966-2-1",
2836 [AVCOL_TRC_BT2020_10] = "bt2020-10",
2837 [AVCOL_TRC_BT2020_12] = "bt2020-12",
2838 [AVCOL_TRC_SMPTE2084] = "smpte2084",
2839 [AVCOL_TRC_SMPTE428] = "smpte428",
2840 [AVCOL_TRC_ARIB_STD_B67] = "arib-std-b67",
2843 static const char * const color_space_names[] = {
2844 [AVCOL_SPC_RGB] = "gbr",
2845 [AVCOL_SPC_BT709] = "bt709",
2846 [AVCOL_SPC_UNSPECIFIED] = "unknown",
2847 [AVCOL_SPC_RESERVED] = "reserved",
2848 [AVCOL_SPC_FCC] = "fcc",
2849 [AVCOL_SPC_BT470BG] = "bt470bg",
2850 [AVCOL_SPC_SMPTE170M] = "smpte170m",
2851 [AVCOL_SPC_SMPTE240M] = "smpte240m",
2852 [AVCOL_SPC_YCGCO] = "ycgco",
2853 [AVCOL_SPC_BT2020_NCL] = "bt2020nc",
2854 [AVCOL_SPC_BT2020_CL] = "bt2020c",
2855 [AVCOL_SPC_SMPTE2085] = "smpte2085",
2856 [AVCOL_SPC_CHROMA_DERIVED_NCL] = "chroma-derived-nc",
2857 [AVCOL_SPC_CHROMA_DERIVED_CL] = "chroma-derived-c",
2858 [AVCOL_SPC_ICTCP] = "ictcp",
2861 static const char * const chroma_location_names[] = {
2862 [AVCHROMA_LOC_UNSPECIFIED] = "unspecified",
2863 [AVCHROMA_LOC_LEFT] = "left",
2864 [AVCHROMA_LOC_CENTER] = "center",
2865 [AVCHROMA_LOC_TOPLEFT] = "topleft",
2866 [AVCHROMA_LOC_TOP] = "top",
2867 [AVCHROMA_LOC_BOTTOMLEFT] = "bottomleft",
2868 [AVCHROMA_LOC_BOTTOM] = "bottom",
2871 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
2873 enum AVPixelFormat pix_fmt;
2875 for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
2876 if (av_pix_fmt_descriptors[pix_fmt].name &&
2877 (!strcmp(av_pix_fmt_descriptors[pix_fmt].name, name) ||
2878 av_match_name(name, av_pix_fmt_descriptors[pix_fmt].alias)))
2881 return AV_PIX_FMT_NONE;
2884 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
2886 return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
2887 av_pix_fmt_descriptors[pix_fmt].name : NULL;
2891 # define X_NE(be, le) be
2893 # define X_NE(be, le) le
2896 enum AVPixelFormat av_get_pix_fmt(const char *name)
2898 enum AVPixelFormat pix_fmt;
2900 if (!strcmp(name, "rgb32"))
2901 name = X_NE("argb", "bgra");
2902 else if (!strcmp(name, "bgr32"))
2903 name = X_NE("abgr", "rgba");
2905 pix_fmt = get_pix_fmt_internal(name);
2906 if (pix_fmt == AV_PIX_FMT_NONE) {
2909 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
2910 pix_fmt = get_pix_fmt_internal(name2);
2916 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
2919 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
2921 for (c = 0; c < pixdesc->nb_components; c++) {
2922 int s = c == 1 || c == 2 ? 0 : log2_pixels;
2923 bits += pixdesc->comp[c].depth << s;
2926 return bits >> log2_pixels;
2929 int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
2932 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
2935 for (c = 0; c < pixdesc->nb_components; c++) {
2936 const AVComponentDescriptor *comp = &pixdesc->comp[c];
2937 int s = c == 1 || c == 2 ? 0 : log2_pixels;
2938 steps[comp->plane] = comp->step << s;
2940 for (c = 0; c < 4; c++)
2943 if(!(pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM))
2946 return bits >> log2_pixels;
2949 char *av_get_pix_fmt_string(char *buf, int buf_size,
2950 enum AVPixelFormat pix_fmt)
2954 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
2956 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
2957 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
2958 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
2964 const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
2966 if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
2968 return &av_pix_fmt_descriptors[pix_fmt];
2971 const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
2974 return &av_pix_fmt_descriptors[0];
2975 while (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1) {
2983 enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
2985 if (desc < av_pix_fmt_descriptors ||
2986 desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
2987 return AV_PIX_FMT_NONE;
2989 return desc - av_pix_fmt_descriptors;
2992 int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
2993 int *h_shift, int *v_shift)
2995 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2997 return AVERROR(ENOSYS);
2998 *h_shift = desc->log2_chroma_w;
2999 *v_shift = desc->log2_chroma_h;
3004 int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
3006 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
3007 int i, planes[4] = { 0 }, ret = 0;
3010 return AVERROR(EINVAL);
3012 for (i = 0; i < desc->nb_components; i++)
3013 planes[desc->comp[i].plane] = 1;
3014 for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
3019 enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
3021 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
3025 if (!desc || strlen(desc->name) < 2)
3026 return AV_PIX_FMT_NONE;
3027 av_strlcpy(name, desc->name, sizeof(name));
3028 i = strlen(name) - 2;
3029 if (strcmp(name + i, "be") && strcmp(name + i, "le"))
3030 return AV_PIX_FMT_NONE;
3032 name[i] ^= 'b' ^ 'l';
3034 return get_pix_fmt_internal(name);
3037 #define FF_COLOR_NA -1
3038 #define FF_COLOR_RGB 0 /**< RGB color space */
3039 #define FF_COLOR_GRAY 1 /**< gray color space */
3040 #define FF_COLOR_YUV 2 /**< YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */
3041 #define FF_COLOR_YUV_JPEG 3 /**< YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */
3042 #define FF_COLOR_XYZ 4
3044 #define pixdesc_has_alpha(pixdesc) \
3045 ((pixdesc)->flags & AV_PIX_FMT_FLAG_ALPHA)
3048 static int get_color_type(const AVPixFmtDescriptor *desc) {
3049 if (desc->flags & AV_PIX_FMT_FLAG_PAL)
3050 return FF_COLOR_RGB;
3052 if(desc->nb_components == 1 || desc->nb_components == 2)
3053 return FF_COLOR_GRAY;
3056 if (av_strstart(desc->name, "yuvj", NULL))
3057 return FF_COLOR_YUV_JPEG;
3059 if (av_strstart(desc->name, "xyz", NULL))
3060 return FF_COLOR_XYZ;
3063 if(desc->flags & AV_PIX_FMT_FLAG_RGB)
3064 return FF_COLOR_RGB;
3066 if(desc->nb_components == 0)
3069 return FF_COLOR_YUV;
3072 static int get_pix_fmt_depth(int *min, int *max, enum AVPixelFormat pix_fmt)
3074 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
3077 if (!desc || !desc->nb_components) {
3079 return AVERROR(EINVAL);
3082 *min = INT_MAX, *max = -INT_MAX;
3083 for (i = 0; i < desc->nb_components; i++) {
3084 *min = FFMIN(desc->comp[i].depth, *min);
3085 *max = FFMAX(desc->comp[i].depth, *max);
3090 static int get_pix_fmt_score(enum AVPixelFormat dst_pix_fmt,
3091 enum AVPixelFormat src_pix_fmt,
3092 unsigned *lossp, unsigned consider)
3094 const AVPixFmtDescriptor *src_desc = av_pix_fmt_desc_get(src_pix_fmt);
3095 const AVPixFmtDescriptor *dst_desc = av_pix_fmt_desc_get(dst_pix_fmt);
3096 int src_color, dst_color;
3097 int src_min_depth, src_max_depth, dst_min_depth, dst_max_depth;
3098 int ret, loss, i, nb_components;
3099 int score = INT_MAX - 1;
3101 if (!src_desc || !dst_desc)
3104 if ((src_desc->flags & AV_PIX_FMT_FLAG_HWACCEL) ||
3105 (dst_desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
3106 if (dst_pix_fmt == src_pix_fmt)
3115 if (dst_pix_fmt == src_pix_fmt)
3118 if ((ret = get_pix_fmt_depth(&src_min_depth, &src_max_depth, src_pix_fmt)) < 0)
3120 if ((ret = get_pix_fmt_depth(&dst_min_depth, &dst_max_depth, dst_pix_fmt)) < 0)
3123 src_color = get_color_type(src_desc);
3124 dst_color = get_color_type(dst_desc);
3125 if (dst_pix_fmt == AV_PIX_FMT_PAL8)
3126 nb_components = FFMIN(src_desc->nb_components, 4);
3128 nb_components = FFMIN(src_desc->nb_components, dst_desc->nb_components);
3130 for (i = 0; i < nb_components; i++) {
3131 int depth_minus1 = (dst_pix_fmt == AV_PIX_FMT_PAL8) ? 7/nb_components : (dst_desc->comp[i].depth - 1);
3132 int depth_delta = src_desc->comp[i].depth - 1 - depth_minus1;
3133 if (depth_delta > 0 && (consider & FF_LOSS_DEPTH)) {
3134 loss |= FF_LOSS_DEPTH;
3135 score -= 65536 >> depth_minus1;
3136 } else if (depth_delta < 0 && (consider & FF_LOSS_EXCESS_DEPTH)) {
3137 // Favour formats where bit depth exactly matches. If all other
3138 // scoring is equal, we'd rather use the bit depth that most closely
3139 // matches the source.
3140 loss |= FF_LOSS_EXCESS_DEPTH;
3141 score += depth_delta;
3145 if (consider & FF_LOSS_RESOLUTION) {
3146 if (dst_desc->log2_chroma_w > src_desc->log2_chroma_w) {
3147 loss |= FF_LOSS_RESOLUTION;
3148 score -= 256 << dst_desc->log2_chroma_w;
3150 if (dst_desc->log2_chroma_h > src_desc->log2_chroma_h) {
3151 loss |= FF_LOSS_RESOLUTION;
3152 score -= 256 << dst_desc->log2_chroma_h;
3154 // don't favor 422 over 420 if downsampling is needed, because 420 has much better support on the decoder side
3155 if (dst_desc->log2_chroma_w == 1 && src_desc->log2_chroma_w == 0 &&
3156 dst_desc->log2_chroma_h == 1 && src_desc->log2_chroma_h == 0 ) {
3161 if (consider & FF_LOSS_EXCESS_RESOLUTION) {
3162 // Favour formats where chroma subsampling exactly matches. If all other
3163 // scoring is equal, we'd rather use the subsampling that most closely
3164 // matches the source.
3165 if (dst_desc->log2_chroma_w < src_desc->log2_chroma_w) {
3166 loss |= FF_LOSS_EXCESS_RESOLUTION;
3167 score -= 1 << (src_desc->log2_chroma_w - dst_desc->log2_chroma_w);
3170 if (dst_desc->log2_chroma_h < src_desc->log2_chroma_h) {
3171 loss |= FF_LOSS_EXCESS_RESOLUTION;
3172 score -= 1 << (src_desc->log2_chroma_h - dst_desc->log2_chroma_h);
3175 // don't favour 411 over 420, because 420 has much better support on the
3177 if (dst_desc->log2_chroma_w == 1 && src_desc->log2_chroma_w == 2 &&
3178 dst_desc->log2_chroma_h == 1 && src_desc->log2_chroma_h == 2) {
3183 if(consider & FF_LOSS_COLORSPACE)
3186 if (src_color != FF_COLOR_RGB &&
3187 src_color != FF_COLOR_GRAY)
3188 loss |= FF_LOSS_COLORSPACE;
3191 if (src_color != FF_COLOR_GRAY)
3192 loss |= FF_LOSS_COLORSPACE;
3195 if (src_color != FF_COLOR_YUV)
3196 loss |= FF_LOSS_COLORSPACE;
3198 case FF_COLOR_YUV_JPEG:
3199 if (src_color != FF_COLOR_YUV_JPEG &&
3200 src_color != FF_COLOR_YUV &&
3201 src_color != FF_COLOR_GRAY)
3202 loss |= FF_LOSS_COLORSPACE;
3205 /* fail safe test */
3206 if (src_color != dst_color)
3207 loss |= FF_LOSS_COLORSPACE;
3210 if(loss & FF_LOSS_COLORSPACE)
3211 score -= (nb_components * 65536) >> FFMIN(dst_desc->comp[0].depth - 1, src_desc->comp[0].depth - 1);
3213 if (dst_color == FF_COLOR_GRAY &&
3214 src_color != FF_COLOR_GRAY && (consider & FF_LOSS_CHROMA)) {
3215 loss |= FF_LOSS_CHROMA;
3218 if (!pixdesc_has_alpha(dst_desc) && (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))) {
3219 loss |= FF_LOSS_ALPHA;
3222 if (dst_pix_fmt == AV_PIX_FMT_PAL8 && (consider & FF_LOSS_COLORQUANT) &&
3223 (src_pix_fmt != AV_PIX_FMT_PAL8 && (src_color != FF_COLOR_GRAY || (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))))) {
3224 loss |= FF_LOSS_COLORQUANT;
3232 int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,
3233 enum AVPixelFormat src_pix_fmt,
3237 int ret = get_pix_fmt_score(dst_pix_fmt, src_pix_fmt, &loss, has_alpha ? ~0 : ~FF_LOSS_ALPHA);
3243 enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
3244 enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
3246 enum AVPixelFormat dst_pix_fmt;
3247 int loss1, loss2, loss_mask;
3248 const AVPixFmtDescriptor *desc1 = av_pix_fmt_desc_get(dst_pix_fmt1);
3249 const AVPixFmtDescriptor *desc2 = av_pix_fmt_desc_get(dst_pix_fmt2);
3253 dst_pix_fmt = dst_pix_fmt2;
3254 } else if (!desc2) {
3255 dst_pix_fmt = dst_pix_fmt1;
3257 loss_mask= loss_ptr?~*loss_ptr:~0; /* use loss mask if provided */
3259 loss_mask &= ~FF_LOSS_ALPHA;
3261 score1 = get_pix_fmt_score(dst_pix_fmt1, src_pix_fmt, &loss1, loss_mask);
3262 score2 = get_pix_fmt_score(dst_pix_fmt2, src_pix_fmt, &loss2, loss_mask);
3264 if (score1 == score2) {
3265 if(av_get_padded_bits_per_pixel(desc2) != av_get_padded_bits_per_pixel(desc1)) {
3266 dst_pix_fmt = av_get_padded_bits_per_pixel(desc2) < av_get_padded_bits_per_pixel(desc1) ? dst_pix_fmt2 : dst_pix_fmt1;
3268 dst_pix_fmt = desc2->nb_components < desc1->nb_components ? dst_pix_fmt2 : dst_pix_fmt1;
3271 dst_pix_fmt = score1 < score2 ? dst_pix_fmt2 : dst_pix_fmt1;
3276 *loss_ptr = av_get_pix_fmt_loss(dst_pix_fmt, src_pix_fmt, has_alpha);
3280 const char *av_color_range_name(enum AVColorRange range)
3282 return (unsigned) range < AVCOL_RANGE_NB ?
3283 color_range_names[range] : NULL;
3286 int av_color_range_from_name(const char *name)
3290 for (i = 0; i < FF_ARRAY_ELEMS(color_range_names); i++) {
3291 if (av_strstart(name, color_range_names[i], NULL))
3295 return AVERROR(EINVAL);
3298 const char *av_color_primaries_name(enum AVColorPrimaries primaries)
3300 return (unsigned) primaries < AVCOL_PRI_NB ?
3301 color_primaries_names[primaries] : NULL;
3304 int av_color_primaries_from_name(const char *name)
3308 for (i = 0; i < FF_ARRAY_ELEMS(color_primaries_names); i++) {
3309 if (!color_primaries_names[i])
3312 if (av_strstart(name, color_primaries_names[i], NULL))
3316 return AVERROR(EINVAL);
3319 const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
3321 return (unsigned) transfer < AVCOL_TRC_NB ?
3322 color_transfer_names[transfer] : NULL;
3325 int av_color_transfer_from_name(const char *name)
3329 for (i = 0; i < FF_ARRAY_ELEMS(color_transfer_names); i++) {
3330 if (!color_transfer_names[i])
3333 if (av_strstart(name, color_transfer_names[i], NULL))
3337 return AVERROR(EINVAL);
3340 const char *av_color_space_name(enum AVColorSpace space)
3342 return (unsigned) space < AVCOL_SPC_NB ?
3343 color_space_names[space] : NULL;
3346 int av_color_space_from_name(const char *name)
3350 for (i = 0; i < FF_ARRAY_ELEMS(color_space_names); i++) {
3351 if (!color_space_names[i])
3354 if (av_strstart(name, color_space_names[i], NULL))
3358 return AVERROR(EINVAL);
3361 const char *av_chroma_location_name(enum AVChromaLocation location)
3363 return (unsigned) location < AVCHROMA_LOC_NB ?
3364 chroma_location_names[location] : NULL;
3367 int av_chroma_location_from_name(const char *name)
3371 for (i = 0; i < FF_ARRAY_ELEMS(chroma_location_names); i++) {
3372 if (!chroma_location_names[i])
3375 if (av_strstart(name, chroma_location_names[i], NULL))
3379 return AVERROR(EINVAL);
3382 int av_chroma_location_enum_to_pos(int *xpos, int *ypos, enum AVChromaLocation pos)
3384 if (pos <= AVCHROMA_LOC_UNSPECIFIED || pos >= AVCHROMA_LOC_NB)
3385 return AVERROR(EINVAL);
3388 *xpos = (pos&1) * 128;
3389 *ypos = ((pos>>1)^(pos<4)) * 128;
3394 enum AVChromaLocation av_chroma_location_pos_to_enum(int xpos, int ypos)
3396 int pos, xout, yout;
3398 for (pos = AVCHROMA_LOC_UNSPECIFIED + 1; pos < AVCHROMA_LOC_NB; pos++) {
3399 if (av_chroma_location_enum_to_pos(&xout, &yout, pos) == 0 && xout == xpos && yout == ypos)
3402 return AVCHROMA_LOC_UNSPECIFIED;