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_YVYU422] = {
163 { 0, 1, 1, 0, 7 }, /* Y */
164 { 0, 3, 2, 0, 7 }, /* V */
165 { 0, 3, 4, 0, 7 }, /* U */
168 [AV_PIX_FMT_RGB24] = {
174 { 0, 2, 1, 0, 7 }, /* R */
175 { 0, 2, 2, 0, 7 }, /* G */
176 { 0, 2, 3, 0, 7 }, /* B */
178 .flags = AV_PIX_FMT_FLAG_RGB,
180 [AV_PIX_FMT_BGR24] = {
186 { 0, 2, 3, 0, 7 }, /* R */
187 { 0, 2, 2, 0, 7 }, /* G */
188 { 0, 2, 1, 0, 7 }, /* B */
190 .flags = AV_PIX_FMT_FLAG_RGB,
192 [AV_PIX_FMT_YUV422P] = {
198 { 0, 0, 1, 0, 7 }, /* Y */
199 { 1, 0, 1, 0, 7 }, /* U */
200 { 2, 0, 1, 0, 7 }, /* V */
202 .flags = AV_PIX_FMT_FLAG_PLANAR,
204 [AV_PIX_FMT_YUV444P] = {
210 { 0, 0, 1, 0, 7 }, /* Y */
211 { 1, 0, 1, 0, 7 }, /* U */
212 { 2, 0, 1, 0, 7 }, /* V */
214 .flags = AV_PIX_FMT_FLAG_PLANAR,
216 [AV_PIX_FMT_YUV410P] = {
222 { 0, 0, 1, 0, 7 }, /* Y */
223 { 1, 0, 1, 0, 7 }, /* U */
224 { 2, 0, 1, 0, 7 }, /* V */
226 .flags = AV_PIX_FMT_FLAG_PLANAR,
228 [AV_PIX_FMT_YUV411P] = {
234 { 0, 0, 1, 0, 7 }, /* Y */
235 { 1, 0, 1, 0, 7 }, /* U */
236 { 2, 0, 1, 0, 7 }, /* V */
238 .flags = AV_PIX_FMT_FLAG_PLANAR,
240 [AV_PIX_FMT_YUVJ411P] = {
246 { 0, 0, 1, 0, 7 }, /* Y */
247 { 1, 0, 1, 0, 7 }, /* U */
248 { 2, 0, 1, 0, 7 }, /* V */
250 .flags = AV_PIX_FMT_FLAG_PLANAR,
252 [AV_PIX_FMT_GRAY8] = {
258 { 0, 0, 1, 0, 7 }, /* Y */
260 .flags = AV_PIX_FMT_FLAG_PSEUDOPAL,
262 [AV_PIX_FMT_MONOWHITE] = {
268 { 0, 0, 1, 0, 0 }, /* Y */
270 .flags = AV_PIX_FMT_FLAG_BITSTREAM,
272 [AV_PIX_FMT_MONOBLACK] = {
278 { 0, 0, 1, 7, 0 }, /* Y */
280 .flags = AV_PIX_FMT_FLAG_BITSTREAM,
282 [AV_PIX_FMT_PAL8] = {
290 .flags = AV_PIX_FMT_FLAG_PAL,
292 [AV_PIX_FMT_YUVJ420P] = {
298 { 0, 0, 1, 0, 7 }, /* Y */
299 { 1, 0, 1, 0, 7 }, /* U */
300 { 2, 0, 1, 0, 7 }, /* V */
302 .flags = AV_PIX_FMT_FLAG_PLANAR,
304 [AV_PIX_FMT_YUVJ422P] = {
310 { 0, 0, 1, 0, 7 }, /* Y */
311 { 1, 0, 1, 0, 7 }, /* U */
312 { 2, 0, 1, 0, 7 }, /* V */
314 .flags = AV_PIX_FMT_FLAG_PLANAR,
316 [AV_PIX_FMT_YUVJ444P] = {
322 { 0, 0, 1, 0, 7 }, /* Y */
323 { 1, 0, 1, 0, 7 }, /* U */
324 { 2, 0, 1, 0, 7 }, /* V */
326 .flags = AV_PIX_FMT_FLAG_PLANAR,
329 [AV_PIX_FMT_XVMC_MPEG2_MC] = {
331 .flags = AV_PIX_FMT_FLAG_HWACCEL,
333 [AV_PIX_FMT_XVMC_MPEG2_IDCT] = {
335 .flags = AV_PIX_FMT_FLAG_HWACCEL,
337 #endif /* FF_API_XVMC */
339 [AV_PIX_FMT_XVMC] = {
341 .flags = AV_PIX_FMT_FLAG_HWACCEL,
343 #endif /* !FF_API_XVMC */
344 [AV_PIX_FMT_UYVY422] = {
350 { 0, 1, 2, 0, 7 }, /* Y */
351 { 0, 3, 1, 0, 7 }, /* U */
352 { 0, 3, 3, 0, 7 }, /* V */
355 [AV_PIX_FMT_UYYVYY411] = {
361 { 0, 3, 2, 0, 7 }, /* Y */
362 { 0, 5, 1, 0, 7 }, /* U */
363 { 0, 5, 4, 0, 7 }, /* V */
366 [AV_PIX_FMT_BGR8] = {
372 { 0, 0, 1, 0, 2 }, /* R */
373 { 0, 0, 1, 3, 2 }, /* G */
374 { 0, 0, 1, 6, 1 }, /* B */
376 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
378 [AV_PIX_FMT_BGR4] = {
384 { 0, 3, 4, 0, 0 }, /* R */
385 { 0, 3, 2, 0, 1 }, /* G */
386 { 0, 3, 1, 0, 0 }, /* B */
388 .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
390 [AV_PIX_FMT_BGR4_BYTE] = {
396 { 0, 0, 1, 0, 0 }, /* R */
397 { 0, 0, 1, 1, 1 }, /* G */
398 { 0, 0, 1, 3, 0 }, /* B */
400 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
402 [AV_PIX_FMT_RGB8] = {
408 { 0, 0, 1, 6, 1 }, /* R */
409 { 0, 0, 1, 3, 2 }, /* G */
410 { 0, 0, 1, 0, 2 }, /* B */
412 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
414 [AV_PIX_FMT_RGB4] = {
420 { 0, 3, 1, 0, 0 }, /* R */
421 { 0, 3, 2, 0, 1 }, /* G */
422 { 0, 3, 4, 0, 0 }, /* B */
424 .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
426 [AV_PIX_FMT_RGB4_BYTE] = {
432 { 0, 0, 1, 3, 0 }, /* R */
433 { 0, 0, 1, 1, 1 }, /* G */
434 { 0, 0, 1, 0, 0 }, /* B */
436 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
438 [AV_PIX_FMT_NV12] = {
444 { 0, 0, 1, 0, 7 }, /* Y */
445 { 1, 1, 1, 0, 7 }, /* U */
446 { 1, 1, 2, 0, 7 }, /* V */
448 .flags = AV_PIX_FMT_FLAG_PLANAR,
450 [AV_PIX_FMT_NV21] = {
456 { 0, 0, 1, 0, 7 }, /* Y */
457 { 1, 1, 2, 0, 7 }, /* U */
458 { 1, 1, 1, 0, 7 }, /* V */
460 .flags = AV_PIX_FMT_FLAG_PLANAR,
462 [AV_PIX_FMT_ARGB] = {
468 { 0, 3, 2, 0, 7 }, /* R */
469 { 0, 3, 3, 0, 7 }, /* G */
470 { 0, 3, 4, 0, 7 }, /* B */
471 { 0, 3, 1, 0, 7 }, /* A */
473 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
475 [AV_PIX_FMT_RGBA] = {
481 { 0, 3, 1, 0, 7 }, /* R */
482 { 0, 3, 2, 0, 7 }, /* G */
483 { 0, 3, 3, 0, 7 }, /* B */
484 { 0, 3, 4, 0, 7 }, /* A */
486 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
488 [AV_PIX_FMT_ABGR] = {
494 { 0, 3, 4, 0, 7 }, /* R */
495 { 0, 3, 3, 0, 7 }, /* G */
496 { 0, 3, 2, 0, 7 }, /* B */
497 { 0, 3, 1, 0, 7 }, /* A */
499 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
501 [AV_PIX_FMT_BGRA] = {
507 { 0, 3, 3, 0, 7 }, /* R */
508 { 0, 3, 2, 0, 7 }, /* G */
509 { 0, 3, 1, 0, 7 }, /* B */
510 { 0, 3, 4, 0, 7 }, /* A */
512 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
514 [AV_PIX_FMT_0RGB] = {
520 { 0, 3, 2, 0, 7 }, /* R */
521 { 0, 3, 3, 0, 7 }, /* G */
522 { 0, 3, 4, 0, 7 }, /* B */
524 .flags = AV_PIX_FMT_FLAG_RGB,
526 [AV_PIX_FMT_RGB0] = {
532 { 0, 3, 1, 0, 7 }, /* R */
533 { 0, 3, 2, 0, 7 }, /* G */
534 { 0, 3, 3, 0, 7 }, /* B */
536 .flags = AV_PIX_FMT_FLAG_RGB,
538 [AV_PIX_FMT_0BGR] = {
544 { 0, 3, 4, 0, 7 }, /* R */
545 { 0, 3, 3, 0, 7 }, /* G */
546 { 0, 3, 2, 0, 7 }, /* B */
548 .flags = AV_PIX_FMT_FLAG_RGB,
550 [AV_PIX_FMT_BGR0] = {
556 { 0, 3, 3, 0, 7 }, /* R */
557 { 0, 3, 2, 0, 7 }, /* G */
558 { 0, 3, 1, 0, 7 }, /* B */
560 .flags = AV_PIX_FMT_FLAG_RGB,
562 [AV_PIX_FMT_GRAY16BE] = {
568 { 0, 1, 1, 0, 15 }, /* Y */
570 .flags = AV_PIX_FMT_FLAG_BE,
572 [AV_PIX_FMT_GRAY16LE] = {
578 { 0, 1, 1, 0, 15 }, /* Y */
581 [AV_PIX_FMT_YUV440P] = {
587 { 0, 0, 1, 0, 7 }, /* Y */
588 { 1, 0, 1, 0, 7 }, /* U */
589 { 2, 0, 1, 0, 7 }, /* V */
591 .flags = AV_PIX_FMT_FLAG_PLANAR,
593 [AV_PIX_FMT_YUVJ440P] = {
599 { 0, 0, 1, 0, 7 }, /* Y */
600 { 1, 0, 1, 0, 7 }, /* U */
601 { 2, 0, 1, 0, 7 }, /* V */
603 .flags = AV_PIX_FMT_FLAG_PLANAR,
605 [AV_PIX_FMT_YUVA420P] = {
611 { 0, 0, 1, 0, 7 }, /* Y */
612 { 1, 0, 1, 0, 7 }, /* U */
613 { 2, 0, 1, 0, 7 }, /* V */
614 { 3, 0, 1, 0, 7 }, /* A */
616 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
618 [AV_PIX_FMT_YUVA422P] = {
624 { 0, 0, 1, 0, 7 }, /* Y */
625 { 1, 0, 1, 0, 7 }, /* U */
626 { 2, 0, 1, 0, 7 }, /* V */
627 { 3, 0, 1, 0, 7 }, /* A */
629 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
631 [AV_PIX_FMT_YUVA444P] = {
637 { 0, 0, 1, 0, 7 }, /* Y */
638 { 1, 0, 1, 0, 7 }, /* U */
639 { 2, 0, 1, 0, 7 }, /* V */
640 { 3, 0, 1, 0, 7 }, /* A */
642 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
644 [AV_PIX_FMT_YUVA420P9BE] = {
645 .name = "yuva420p9be",
650 { 0, 1, 1, 0, 8 }, /* Y */
651 { 1, 1, 1, 0, 8 }, /* U */
652 { 2, 1, 1, 0, 8 }, /* V */
653 { 3, 1, 1, 0, 8 }, /* A */
655 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
657 [AV_PIX_FMT_YUVA420P9LE] = {
658 .name = "yuva420p9le",
663 { 0, 1, 1, 0, 8 }, /* Y */
664 { 1, 1, 1, 0, 8 }, /* U */
665 { 2, 1, 1, 0, 8 }, /* V */
666 { 3, 1, 1, 0, 8 }, /* A */
668 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
670 [AV_PIX_FMT_YUVA422P9BE] = {
671 .name = "yuva422p9be",
676 { 0, 1, 1, 0, 8 }, /* Y */
677 { 1, 1, 1, 0, 8 }, /* U */
678 { 2, 1, 1, 0, 8 }, /* V */
679 { 3, 1, 1, 0, 8 }, /* A */
681 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
683 [AV_PIX_FMT_YUVA422P9LE] = {
684 .name = "yuva422p9le",
689 { 0, 1, 1, 0, 8 }, /* Y */
690 { 1, 1, 1, 0, 8 }, /* U */
691 { 2, 1, 1, 0, 8 }, /* V */
692 { 3, 1, 1, 0, 8 }, /* A */
694 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
696 [AV_PIX_FMT_YUVA444P9BE] = {
697 .name = "yuva444p9be",
702 { 0, 1, 1, 0, 8 }, /* Y */
703 { 1, 1, 1, 0, 8 }, /* U */
704 { 2, 1, 1, 0, 8 }, /* V */
705 { 3, 1, 1, 0, 8 }, /* A */
707 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
709 [AV_PIX_FMT_YUVA444P9LE] = {
710 .name = "yuva444p9le",
715 { 0, 1, 1, 0, 8 }, /* Y */
716 { 1, 1, 1, 0, 8 }, /* U */
717 { 2, 1, 1, 0, 8 }, /* V */
718 { 3, 1, 1, 0, 8 }, /* A */
720 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
722 [AV_PIX_FMT_YUVA420P10BE] = {
723 .name = "yuva420p10be",
728 { 0, 1, 1, 0, 9 }, /* Y */
729 { 1, 1, 1, 0, 9 }, /* U */
730 { 2, 1, 1, 0, 9 }, /* V */
731 { 3, 1, 1, 0, 9 }, /* A */
733 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
735 [AV_PIX_FMT_YUVA420P10LE] = {
736 .name = "yuva420p10le",
741 { 0, 1, 1, 0, 9 }, /* Y */
742 { 1, 1, 1, 0, 9 }, /* U */
743 { 2, 1, 1, 0, 9 }, /* V */
744 { 3, 1, 1, 0, 9 }, /* A */
746 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
748 [AV_PIX_FMT_YUVA422P10BE] = {
749 .name = "yuva422p10be",
754 { 0, 1, 1, 0, 9 }, /* Y */
755 { 1, 1, 1, 0, 9 }, /* U */
756 { 2, 1, 1, 0, 9 }, /* V */
757 { 3, 1, 1, 0, 9 }, /* A */
759 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
761 [AV_PIX_FMT_YUVA422P10LE] = {
762 .name = "yuva422p10le",
767 { 0, 1, 1, 0, 9 }, /* Y */
768 { 1, 1, 1, 0, 9 }, /* U */
769 { 2, 1, 1, 0, 9 }, /* V */
770 { 3, 1, 1, 0, 9 }, /* A */
772 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
774 [AV_PIX_FMT_YUVA444P10BE] = {
775 .name = "yuva444p10be",
780 { 0, 1, 1, 0, 9 }, /* Y */
781 { 1, 1, 1, 0, 9 }, /* U */
782 { 2, 1, 1, 0, 9 }, /* V */
783 { 3, 1, 1, 0, 9 }, /* A */
785 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
787 [AV_PIX_FMT_YUVA444P10LE] = {
788 .name = "yuva444p10le",
793 { 0, 1, 1, 0, 9 }, /* Y */
794 { 1, 1, 1, 0, 9 }, /* U */
795 { 2, 1, 1, 0, 9 }, /* V */
796 { 3, 1, 1, 0, 9 }, /* A */
798 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
800 [AV_PIX_FMT_YUVA420P16BE] = {
801 .name = "yuva420p16be",
806 { 0, 1, 1, 0, 15 }, /* Y */
807 { 1, 1, 1, 0, 15 }, /* U */
808 { 2, 1, 1, 0, 15 }, /* V */
809 { 3, 1, 1, 0, 15 }, /* A */
811 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
813 [AV_PIX_FMT_YUVA420P16LE] = {
814 .name = "yuva420p16le",
819 { 0, 1, 1, 0, 15 }, /* Y */
820 { 1, 1, 1, 0, 15 }, /* U */
821 { 2, 1, 1, 0, 15 }, /* V */
822 { 3, 1, 1, 0, 15 }, /* A */
824 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
826 [AV_PIX_FMT_YUVA422P16BE] = {
827 .name = "yuva422p16be",
832 { 0, 1, 1, 0, 15 }, /* Y */
833 { 1, 1, 1, 0, 15 }, /* U */
834 { 2, 1, 1, 0, 15 }, /* V */
835 { 3, 1, 1, 0, 15 }, /* A */
837 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
839 [AV_PIX_FMT_YUVA422P16LE] = {
840 .name = "yuva422p16le",
845 { 0, 1, 1, 0, 15 }, /* Y */
846 { 1, 1, 1, 0, 15 }, /* U */
847 { 2, 1, 1, 0, 15 }, /* V */
848 { 3, 1, 1, 0, 15 }, /* A */
850 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
852 [AV_PIX_FMT_YUVA444P16BE] = {
853 .name = "yuva444p16be",
858 { 0, 1, 1, 0, 15 }, /* Y */
859 { 1, 1, 1, 0, 15 }, /* U */
860 { 2, 1, 1, 0, 15 }, /* V */
861 { 3, 1, 1, 0, 15 }, /* A */
863 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
865 [AV_PIX_FMT_YUVA444P16LE] = {
866 .name = "yuva444p16le",
871 { 0, 1, 1, 0, 15 }, /* Y */
872 { 1, 1, 1, 0, 15 }, /* U */
873 { 2, 1, 1, 0, 15 }, /* V */
874 { 3, 1, 1, 0, 15 }, /* A */
876 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
879 [AV_PIX_FMT_VDPAU_H264] = {
880 .name = "vdpau_h264",
883 .flags = AV_PIX_FMT_FLAG_HWACCEL,
885 [AV_PIX_FMT_VDPAU_MPEG1] = {
886 .name = "vdpau_mpeg1",
889 .flags = AV_PIX_FMT_FLAG_HWACCEL,
891 [AV_PIX_FMT_VDPAU_MPEG2] = {
892 .name = "vdpau_mpeg2",
895 .flags = AV_PIX_FMT_FLAG_HWACCEL,
897 [AV_PIX_FMT_VDPAU_WMV3] = {
898 .name = "vdpau_wmv3",
901 .flags = AV_PIX_FMT_FLAG_HWACCEL,
903 [AV_PIX_FMT_VDPAU_VC1] = {
907 .flags = AV_PIX_FMT_FLAG_HWACCEL,
909 [AV_PIX_FMT_VDPAU_MPEG4] = {
910 .name = "vdpau_mpeg4",
913 .flags = AV_PIX_FMT_FLAG_HWACCEL,
916 [AV_PIX_FMT_RGB48BE] = {
922 { 0, 5, 1, 0, 15 }, /* R */
923 { 0, 5, 3, 0, 15 }, /* G */
924 { 0, 5, 5, 0, 15 }, /* B */
926 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
928 [AV_PIX_FMT_RGB48LE] = {
934 { 0, 5, 1, 0, 15 }, /* R */
935 { 0, 5, 3, 0, 15 }, /* G */
936 { 0, 5, 5, 0, 15 }, /* B */
938 .flags = AV_PIX_FMT_FLAG_RGB,
940 [AV_PIX_FMT_RGBA64BE] = {
946 { 0, 7, 1, 0, 15 }, /* R */
947 { 0, 7, 3, 0, 15 }, /* G */
948 { 0, 7, 5, 0, 15 }, /* B */
949 { 0, 7, 7, 0, 15 }, /* A */
951 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
953 [AV_PIX_FMT_RGBA64LE] = {
959 { 0, 7, 1, 0, 15 }, /* R */
960 { 0, 7, 3, 0, 15 }, /* G */
961 { 0, 7, 5, 0, 15 }, /* B */
962 { 0, 7, 7, 0, 15 }, /* A */
964 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
966 [AV_PIX_FMT_RGB565BE] = {
972 { 0, 1, 0, 3, 4 }, /* R */
973 { 0, 1, 1, 5, 5 }, /* G */
974 { 0, 1, 1, 0, 4 }, /* B */
976 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
978 [AV_PIX_FMT_RGB565LE] = {
984 { 0, 1, 2, 3, 4 }, /* R */
985 { 0, 1, 1, 5, 5 }, /* G */
986 { 0, 1, 1, 0, 4 }, /* B */
988 .flags = AV_PIX_FMT_FLAG_RGB,
990 [AV_PIX_FMT_RGB555BE] = {
996 { 0, 1, 0, 2, 4 }, /* R */
997 { 0, 1, 1, 5, 4 }, /* G */
998 { 0, 1, 1, 0, 4 }, /* B */
1000 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1002 [AV_PIX_FMT_RGB555LE] = {
1008 { 0, 1, 2, 2, 4 }, /* R */
1009 { 0, 1, 1, 5, 4 }, /* G */
1010 { 0, 1, 1, 0, 4 }, /* B */
1012 .flags = AV_PIX_FMT_FLAG_RGB,
1014 [AV_PIX_FMT_RGB444BE] = {
1020 { 0, 1, 0, 0, 3 }, /* R */
1021 { 0, 1, 1, 4, 3 }, /* G */
1022 { 0, 1, 1, 0, 3 }, /* B */
1024 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1026 [AV_PIX_FMT_RGB444LE] = {
1032 { 0, 1, 2, 0, 3 }, /* R */
1033 { 0, 1, 1, 4, 3 }, /* G */
1034 { 0, 1, 1, 0, 3 }, /* B */
1036 .flags = AV_PIX_FMT_FLAG_RGB,
1038 [AV_PIX_FMT_BGR48BE] = {
1044 { 0, 5, 5, 0, 15 }, /* R */
1045 { 0, 5, 3, 0, 15 }, /* G */
1046 { 0, 5, 1, 0, 15 }, /* B */
1048 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1050 [AV_PIX_FMT_BGR48LE] = {
1056 { 0, 5, 5, 0, 15 }, /* R */
1057 { 0, 5, 3, 0, 15 }, /* G */
1058 { 0, 5, 1, 0, 15 }, /* B */
1060 .flags = AV_PIX_FMT_FLAG_RGB,
1062 [AV_PIX_FMT_BGRA64BE] = {
1068 { 0, 7, 5, 0, 15 }, /* R */
1069 { 0, 7, 3, 0, 15 }, /* G */
1070 { 0, 7, 1, 0, 15 }, /* B */
1071 { 0, 7, 7, 0, 15 }, /* A */
1073 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1075 [AV_PIX_FMT_BGRA64LE] = {
1081 { 0, 7, 5, 0, 15 }, /* R */
1082 { 0, 7, 3, 0, 15 }, /* G */
1083 { 0, 7, 1, 0, 15 }, /* B */
1084 { 0, 7, 7, 0, 15 }, /* A */
1086 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1088 [AV_PIX_FMT_BGR565BE] = {
1094 { 0, 1, 1, 0, 4 }, /* R */
1095 { 0, 1, 1, 5, 5 }, /* G */
1096 { 0, 1, 0, 3, 4 }, /* B */
1098 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1100 [AV_PIX_FMT_BGR565LE] = {
1106 { 0, 1, 1, 0, 4 }, /* R */
1107 { 0, 1, 1, 5, 5 }, /* G */
1108 { 0, 1, 2, 3, 4 }, /* B */
1110 .flags = AV_PIX_FMT_FLAG_RGB,
1112 [AV_PIX_FMT_BGR555BE] = {
1118 { 0, 1, 1, 0, 4 }, /* R */
1119 { 0, 1, 1, 5, 4 }, /* G */
1120 { 0, 1, 0, 2, 4 }, /* B */
1122 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1124 [AV_PIX_FMT_BGR555LE] = {
1130 { 0, 1, 1, 0, 4 }, /* R */
1131 { 0, 1, 1, 5, 4 }, /* G */
1132 { 0, 1, 2, 2, 4 }, /* B */
1134 .flags = AV_PIX_FMT_FLAG_RGB,
1136 [AV_PIX_FMT_BGR444BE] = {
1142 { 0, 1, 1, 0, 3 }, /* R */
1143 { 0, 1, 1, 4, 3 }, /* G */
1144 { 0, 1, 0, 0, 3 }, /* B */
1146 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1148 [AV_PIX_FMT_BGR444LE] = {
1154 { 0, 1, 1, 0, 3 }, /* R */
1155 { 0, 1, 1, 4, 3 }, /* G */
1156 { 0, 1, 2, 0, 3 }, /* B */
1158 .flags = AV_PIX_FMT_FLAG_RGB,
1160 [AV_PIX_FMT_VAAPI_MOCO] = {
1161 .name = "vaapi_moco",
1164 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1166 [AV_PIX_FMT_VAAPI_IDCT] = {
1167 .name = "vaapi_idct",
1170 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1172 [AV_PIX_FMT_VAAPI_VLD] = {
1173 .name = "vaapi_vld",
1176 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1178 [AV_PIX_FMT_YUV420P9LE] = {
1179 .name = "yuv420p9le",
1184 { 0, 1, 1, 0, 8 }, /* Y */
1185 { 1, 1, 1, 0, 8 }, /* U */
1186 { 2, 1, 1, 0, 8 }, /* V */
1188 .flags = AV_PIX_FMT_FLAG_PLANAR,
1190 [AV_PIX_FMT_YUV420P9BE] = {
1191 .name = "yuv420p9be",
1196 { 0, 1, 1, 0, 8 }, /* Y */
1197 { 1, 1, 1, 0, 8 }, /* U */
1198 { 2, 1, 1, 0, 8 }, /* V */
1200 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1202 [AV_PIX_FMT_YUV420P10LE] = {
1203 .name = "yuv420p10le",
1208 { 0, 1, 1, 0, 9 }, /* Y */
1209 { 1, 1, 1, 0, 9 }, /* U */
1210 { 2, 1, 1, 0, 9 }, /* V */
1212 .flags = AV_PIX_FMT_FLAG_PLANAR,
1214 [AV_PIX_FMT_YUV420P10BE] = {
1215 .name = "yuv420p10be",
1220 { 0, 1, 1, 0, 9 }, /* Y */
1221 { 1, 1, 1, 0, 9 }, /* U */
1222 { 2, 1, 1, 0, 9 }, /* V */
1224 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1226 [AV_PIX_FMT_YUV420P12LE] = {
1227 .name = "yuv420p12le",
1232 { 0, 1, 1, 0, 11 }, /* Y */
1233 { 1, 1, 1, 0, 11 }, /* U */
1234 { 2, 1, 1, 0, 11 }, /* V */
1236 .flags = AV_PIX_FMT_FLAG_PLANAR,
1238 [AV_PIX_FMT_YUV420P12BE] = {
1239 .name = "yuv420p12be",
1244 { 0, 1, 1, 0, 11 }, /* Y */
1245 { 1, 1, 1, 0, 11 }, /* U */
1246 { 2, 1, 1, 0, 11 }, /* V */
1248 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1250 [AV_PIX_FMT_YUV420P14LE] = {
1251 .name = "yuv420p14le",
1256 { 0, 1, 1, 0, 13 }, /* Y */
1257 { 1, 1, 1, 0, 13 }, /* U */
1258 { 2, 1, 1, 0, 13 }, /* V */
1260 .flags = AV_PIX_FMT_FLAG_PLANAR,
1262 [AV_PIX_FMT_YUV420P14BE] = {
1263 .name = "yuv420p14be",
1268 { 0, 1, 1, 0, 13 }, /* Y */
1269 { 1, 1, 1, 0, 13 }, /* U */
1270 { 2, 1, 1, 0, 13 }, /* V */
1272 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1274 [AV_PIX_FMT_YUV420P16LE] = {
1275 .name = "yuv420p16le",
1280 { 0, 1, 1, 0, 15 }, /* Y */
1281 { 1, 1, 1, 0, 15 }, /* U */
1282 { 2, 1, 1, 0, 15 }, /* V */
1284 .flags = AV_PIX_FMT_FLAG_PLANAR,
1286 [AV_PIX_FMT_YUV420P16BE] = {
1287 .name = "yuv420p16be",
1292 { 0, 1, 1, 0, 15 }, /* Y */
1293 { 1, 1, 1, 0, 15 }, /* U */
1294 { 2, 1, 1, 0, 15 }, /* V */
1296 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1298 [AV_PIX_FMT_YUV422P9LE] = {
1299 .name = "yuv422p9le",
1304 { 0, 1, 1, 0, 8 }, /* Y */
1305 { 1, 1, 1, 0, 8 }, /* U */
1306 { 2, 1, 1, 0, 8 }, /* V */
1308 .flags = AV_PIX_FMT_FLAG_PLANAR,
1310 [AV_PIX_FMT_YUV422P9BE] = {
1311 .name = "yuv422p9be",
1316 { 0, 1, 1, 0, 8 }, /* Y */
1317 { 1, 1, 1, 0, 8 }, /* U */
1318 { 2, 1, 1, 0, 8 }, /* V */
1320 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1322 [AV_PIX_FMT_YUV422P10LE] = {
1323 .name = "yuv422p10le",
1328 { 0, 1, 1, 0, 9 }, /* Y */
1329 { 1, 1, 1, 0, 9 }, /* U */
1330 { 2, 1, 1, 0, 9 }, /* V */
1332 .flags = AV_PIX_FMT_FLAG_PLANAR,
1334 [AV_PIX_FMT_YUV422P10BE] = {
1335 .name = "yuv422p10be",
1340 { 0, 1, 1, 0, 9 }, /* Y */
1341 { 1, 1, 1, 0, 9 }, /* U */
1342 { 2, 1, 1, 0, 9 }, /* V */
1344 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1346 [AV_PIX_FMT_YUV422P12LE] = {
1347 .name = "yuv422p12le",
1352 { 0, 1, 1, 0, 11 }, /* Y */
1353 { 1, 1, 1, 0, 11 }, /* U */
1354 { 2, 1, 1, 0, 11 }, /* V */
1356 .flags = AV_PIX_FMT_FLAG_PLANAR,
1358 [AV_PIX_FMT_YUV422P12BE] = {
1359 .name = "yuv422p12be",
1364 { 0, 1, 1, 0, 11 }, /* Y */
1365 { 1, 1, 1, 0, 11 }, /* U */
1366 { 2, 1, 1, 0, 11 }, /* V */
1368 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1370 [AV_PIX_FMT_YUV422P14LE] = {
1371 .name = "yuv422p14le",
1376 { 0, 1, 1, 0, 13 }, /* Y */
1377 { 1, 1, 1, 0, 13 }, /* U */
1378 { 2, 1, 1, 0, 13 }, /* V */
1380 .flags = AV_PIX_FMT_FLAG_PLANAR,
1382 [AV_PIX_FMT_YUV422P14BE] = {
1383 .name = "yuv422p14be",
1388 { 0, 1, 1, 0, 13 }, /* Y */
1389 { 1, 1, 1, 0, 13 }, /* U */
1390 { 2, 1, 1, 0, 13 }, /* V */
1392 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1394 [AV_PIX_FMT_YUV422P16LE] = {
1395 .name = "yuv422p16le",
1400 { 0, 1, 1, 0, 15 }, /* Y */
1401 { 1, 1, 1, 0, 15 }, /* U */
1402 { 2, 1, 1, 0, 15 }, /* V */
1404 .flags = AV_PIX_FMT_FLAG_PLANAR,
1406 [AV_PIX_FMT_YUV422P16BE] = {
1407 .name = "yuv422p16be",
1412 { 0, 1, 1, 0, 15 }, /* Y */
1413 { 1, 1, 1, 0, 15 }, /* U */
1414 { 2, 1, 1, 0, 15 }, /* V */
1416 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1418 [AV_PIX_FMT_YUV444P16LE] = {
1419 .name = "yuv444p16le",
1424 { 0, 1, 1, 0, 15 }, /* Y */
1425 { 1, 1, 1, 0, 15 }, /* U */
1426 { 2, 1, 1, 0, 15 }, /* V */
1428 .flags = AV_PIX_FMT_FLAG_PLANAR,
1430 [AV_PIX_FMT_YUV444P16BE] = {
1431 .name = "yuv444p16be",
1436 { 0, 1, 1, 0, 15 }, /* Y */
1437 { 1, 1, 1, 0, 15 }, /* U */
1438 { 2, 1, 1, 0, 15 }, /* V */
1440 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1442 [AV_PIX_FMT_YUV444P10LE] = {
1443 .name = "yuv444p10le",
1448 { 0, 1, 1, 0, 9 }, /* Y */
1449 { 1, 1, 1, 0, 9 }, /* U */
1450 { 2, 1, 1, 0, 9 }, /* V */
1452 .flags = AV_PIX_FMT_FLAG_PLANAR,
1454 [AV_PIX_FMT_YUV444P10BE] = {
1455 .name = "yuv444p10be",
1460 { 0, 1, 1, 0, 9 }, /* Y */
1461 { 1, 1, 1, 0, 9 }, /* U */
1462 { 2, 1, 1, 0, 9 }, /* V */
1464 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1466 [AV_PIX_FMT_YUV444P9LE] = {
1467 .name = "yuv444p9le",
1472 { 0, 1, 1, 0, 8 }, /* Y */
1473 { 1, 1, 1, 0, 8 }, /* U */
1474 { 2, 1, 1, 0, 8 }, /* V */
1476 .flags = AV_PIX_FMT_FLAG_PLANAR,
1478 [AV_PIX_FMT_YUV444P9BE] = {
1479 .name = "yuv444p9be",
1484 { 0, 1, 1, 0, 8 }, /* Y */
1485 { 1, 1, 1, 0, 8 }, /* U */
1486 { 2, 1, 1, 0, 8 }, /* V */
1488 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1490 [AV_PIX_FMT_YUV444P12LE] = {
1491 .name = "yuv444p12le",
1496 { 0, 1, 1, 0, 11 }, /* Y */
1497 { 1, 1, 1, 0, 11 }, /* U */
1498 { 2, 1, 1, 0, 11 }, /* V */
1500 .flags = AV_PIX_FMT_FLAG_PLANAR,
1502 [AV_PIX_FMT_YUV444P12BE] = {
1503 .name = "yuv444p12be",
1508 { 0, 1, 1, 0, 11 }, /* Y */
1509 { 1, 1, 1, 0, 11 }, /* U */
1510 { 2, 1, 1, 0, 11 }, /* V */
1512 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1514 [AV_PIX_FMT_YUV444P14LE] = {
1515 .name = "yuv444p14le",
1520 { 0, 1, 1, 0, 13 }, /* Y */
1521 { 1, 1, 1, 0, 13 }, /* U */
1522 { 2, 1, 1, 0, 13 }, /* V */
1524 .flags = AV_PIX_FMT_FLAG_PLANAR,
1526 [AV_PIX_FMT_YUV444P14BE] = {
1527 .name = "yuv444p14be",
1532 { 0, 1, 1, 0, 13 }, /* Y */
1533 { 1, 1, 1, 0, 13 }, /* U */
1534 { 2, 1, 1, 0, 13 }, /* V */
1536 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1538 [AV_PIX_FMT_DXVA2_VLD] = {
1539 .name = "dxva2_vld",
1542 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1544 [AV_PIX_FMT_VDA_VLD] = {
1548 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1550 [AV_PIX_FMT_GRAY8A] = {
1554 { 0, 1, 1, 0, 7 }, /* Y */
1555 { 0, 1, 2, 0, 7 }, /* A */
1557 .flags = AV_PIX_FMT_FLAG_ALPHA,
1559 [AV_PIX_FMT_GBRP] = {
1565 { 2, 0, 1, 0, 7 }, /* R */
1566 { 0, 0, 1, 0, 7 }, /* G */
1567 { 1, 0, 1, 0, 7 }, /* B */
1569 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1571 [AV_PIX_FMT_GBRP9LE] = {
1577 { 2, 1, 1, 0, 8 }, /* R */
1578 { 0, 1, 1, 0, 8 }, /* G */
1579 { 1, 1, 1, 0, 8 }, /* B */
1581 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1583 [AV_PIX_FMT_GBRP9BE] = {
1589 { 2, 1, 1, 0, 8 }, /* R */
1590 { 0, 1, 1, 0, 8 }, /* G */
1591 { 1, 1, 1, 0, 8 }, /* B */
1593 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1595 [AV_PIX_FMT_GBRP10LE] = {
1601 { 2, 1, 1, 0, 9 }, /* R */
1602 { 0, 1, 1, 0, 9 }, /* G */
1603 { 1, 1, 1, 0, 9 }, /* B */
1605 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1607 [AV_PIX_FMT_GBRP10BE] = {
1613 { 2, 1, 1, 0, 9 }, /* R */
1614 { 0, 1, 1, 0, 9 }, /* G */
1615 { 1, 1, 1, 0, 9 }, /* B */
1617 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1619 [AV_PIX_FMT_GBRP12LE] = {
1625 { 2, 1, 1, 0, 11 }, /* R */
1626 { 0, 1, 1, 0, 11 }, /* G */
1627 { 1, 1, 1, 0, 11 }, /* B */
1629 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1631 [AV_PIX_FMT_GBRP12BE] = {
1637 { 2, 1, 1, 0, 11 }, /* R */
1638 { 0, 1, 1, 0, 11 }, /* G */
1639 { 1, 1, 1, 0, 11 }, /* B */
1641 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1643 [AV_PIX_FMT_GBRP14LE] = {
1649 { 2, 1, 1, 0, 13 }, /* R */
1650 { 0, 1, 1, 0, 13 }, /* G */
1651 { 1, 1, 1, 0, 13 }, /* B */
1653 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1655 [AV_PIX_FMT_GBRP14BE] = {
1661 { 2, 1, 1, 0, 13 }, /* R */
1662 { 0, 1, 1, 0, 13 }, /* G */
1663 { 1, 1, 1, 0, 13 }, /* B */
1665 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1667 [AV_PIX_FMT_GBRP16LE] = {
1673 { 2, 1, 1, 0, 15 }, /* R */
1674 { 0, 1, 1, 0, 15 }, /* G */
1675 { 1, 1, 1, 0, 15 }, /* B */
1677 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1679 [AV_PIX_FMT_GBRP16BE] = {
1685 { 2, 1, 1, 0, 15 }, /* R */
1686 { 0, 1, 1, 0, 15 }, /* G */
1687 { 1, 1, 1, 0, 15 }, /* B */
1689 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1691 [AV_PIX_FMT_GBRAP] = {
1697 { 2, 0, 1, 0, 7 }, /* R */
1698 { 0, 0, 1, 0, 7 }, /* G */
1699 { 1, 0, 1, 0, 7 }, /* B */
1700 { 3, 0, 1, 0, 7 }, /* A */
1702 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1704 [AV_PIX_FMT_GBRAP16LE] = {
1705 .name = "gbrap16le",
1710 { 2, 1, 1, 0, 15 }, /* R */
1711 { 0, 1, 1, 0, 15 }, /* G */
1712 { 1, 1, 1, 0, 15 }, /* B */
1713 { 3, 1, 1, 0, 15 }, /* A */
1715 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1717 [AV_PIX_FMT_GBRAP16BE] = {
1718 .name = "gbrap16be",
1723 { 2, 1, 1, 0, 15 }, /* R */
1724 { 0, 1, 1, 0, 15 }, /* G */
1725 { 1, 1, 1, 0, 15 }, /* B */
1726 { 3, 1, 1, 0, 15 }, /* A */
1728 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
1730 [AV_PIX_FMT_VDPAU] = {
1734 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1736 [AV_PIX_FMT_XYZ12LE] = {
1742 { 0, 5, 1, 4, 11 }, /* X */
1743 { 0, 5, 3, 4, 11 }, /* Y */
1744 { 0, 5, 5, 4, 11 }, /* Z */
1746 /*.flags = -- not used*/
1748 [AV_PIX_FMT_XYZ12BE] = {
1754 { 0, 5, 1, 4, 11 }, /* X */
1755 { 0, 5, 3, 4, 11 }, /* Y */
1756 { 0, 5, 5, 4, 11 }, /* Z */
1758 .flags = AV_PIX_FMT_FLAG_BE,
1761 #define BAYER8_DESC_COMMON \
1762 .nb_components= 3, \
1763 .log2_chroma_w= 0, \
1764 .log2_chroma_h= 0, \
1771 #define BAYER16_DESC_COMMON \
1772 .nb_components= 3, \
1773 .log2_chroma_w= 0, \
1774 .log2_chroma_h= 0, \
1781 [AV_PIX_FMT_BAYER_BGGR8] = {
1782 .name = "bayer_bggr8",
1784 .flags = AV_PIX_FMT_FLAG_RGB,
1786 [AV_PIX_FMT_BAYER_BGGR16LE] = {
1787 .name = "bayer_bggr16le",
1789 .flags = AV_PIX_FMT_FLAG_RGB,
1791 [AV_PIX_FMT_BAYER_BGGR16BE] = {
1792 .name = "bayer_bggr16be",
1794 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1796 [AV_PIX_FMT_BAYER_RGGB8] = {
1797 .name = "bayer_rggb8",
1799 .flags = AV_PIX_FMT_FLAG_RGB,
1801 [AV_PIX_FMT_BAYER_RGGB16LE] = {
1802 .name = "bayer_rggb16le",
1804 .flags = AV_PIX_FMT_FLAG_RGB,
1806 [AV_PIX_FMT_BAYER_RGGB16BE] = {
1807 .name = "bayer_rggb16be",
1809 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1811 [AV_PIX_FMT_BAYER_GBRG8] = {
1812 .name = "bayer_gbrg8",
1814 .flags = AV_PIX_FMT_FLAG_RGB,
1816 [AV_PIX_FMT_BAYER_GBRG16LE] = {
1817 .name = "bayer_gbrg16le",
1819 .flags = AV_PIX_FMT_FLAG_RGB,
1821 [AV_PIX_FMT_BAYER_GBRG16BE] = {
1822 .name = "bayer_gbrg16be",
1824 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1826 [AV_PIX_FMT_BAYER_GRBG8] = {
1827 .name = "bayer_grbg8",
1829 .flags = AV_PIX_FMT_FLAG_RGB,
1831 [AV_PIX_FMT_BAYER_GRBG16LE] = {
1832 .name = "bayer_grbg16le",
1834 .flags = AV_PIX_FMT_FLAG_RGB,
1836 [AV_PIX_FMT_BAYER_GRBG16BE] = {
1837 .name = "bayer_grbg16be",
1839 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1841 [AV_PIX_FMT_NV16] = {
1847 { 0, 0, 1, 0, 7 }, /* Y */
1848 { 1, 1, 1, 0, 7 }, /* U */
1849 { 1, 1, 2, 0, 7 }, /* V */
1851 .flags = AV_PIX_FMT_FLAG_PLANAR,
1853 [AV_PIX_FMT_NV20LE] = {
1859 { 0, 1, 1, 0, 9 }, /* Y */
1860 { 1, 3, 1, 0, 9 }, /* U */
1861 { 1, 3, 3, 0, 9 }, /* V */
1863 .flags = AV_PIX_FMT_FLAG_PLANAR,
1865 [AV_PIX_FMT_NV20BE] = {
1871 { 0, 1, 1, 0, 9 }, /* Y */
1872 { 1, 3, 1, 0, 9 }, /* U */
1873 { 1, 3, 3, 0, 9 }, /* V */
1875 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
1877 [AV_PIX_FMT_VDA] = {
1879 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1883 FF_DISABLE_DEPRECATION_WARNINGS
1884 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1886 enum AVPixelFormat pix_fmt;
1888 for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1889 if (av_pix_fmt_descriptors[pix_fmt].name &&
1890 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1893 return AV_PIX_FMT_NONE;
1896 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
1898 return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1899 av_pix_fmt_descriptors[pix_fmt].name : NULL;
1903 # define X_NE(be, le) be
1905 # define X_NE(be, le) le
1908 enum AVPixelFormat av_get_pix_fmt(const char *name)
1910 enum AVPixelFormat pix_fmt;
1912 if (!strcmp(name, "rgb32"))
1913 name = X_NE("argb", "bgra");
1914 else if (!strcmp(name, "bgr32"))
1915 name = X_NE("abgr", "rgba");
1917 pix_fmt = get_pix_fmt_internal(name);
1918 if (pix_fmt == AV_PIX_FMT_NONE) {
1921 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1922 pix_fmt = get_pix_fmt_internal(name2);
1927 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1930 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1932 for (c = 0; c < pixdesc->nb_components; c++) {
1933 int s = c == 1 || c == 2 ? 0 : log2_pixels;
1934 bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1937 return bits >> log2_pixels;
1940 int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1943 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1946 for (c = 0; c < pixdesc->nb_components; c++) {
1947 const AVComponentDescriptor *comp = &pixdesc->comp[c];
1948 int s = c == 1 || c == 2 ? 0 : log2_pixels;
1949 steps[comp->plane] = (comp->step_minus1 + 1) << s;
1951 for (c = 0; c < 4; c++)
1954 if(!(pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM))
1957 return bits >> log2_pixels;
1960 char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt)
1964 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1966 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1967 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1968 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1974 const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
1976 if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
1978 return &av_pix_fmt_descriptors[pix_fmt];
1981 const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
1984 return &av_pix_fmt_descriptors[0];
1985 while (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1) {
1993 enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
1995 if (desc < av_pix_fmt_descriptors ||
1996 desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
1997 return AV_PIX_FMT_NONE;
1999 return desc - av_pix_fmt_descriptors;
2001 FF_ENABLE_DEPRECATION_WARNINGS
2003 int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
2004 int *h_shift, int *v_shift)
2006 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2008 return AVERROR(ENOSYS);
2009 *h_shift = desc->log2_chroma_w;
2010 *v_shift = desc->log2_chroma_h;
2015 int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
2017 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2018 int i, planes[4] = { 0 }, ret = 0;
2021 return AVERROR(EINVAL);
2023 for (i = 0; i < desc->nb_components; i++)
2024 planes[desc->comp[i].plane] = 1;
2025 for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
2030 void ff_check_pixfmt_descriptors(void){
2033 for (i=0; i<FF_ARRAY_ELEMS(av_pix_fmt_descriptors); i++) {
2034 const AVPixFmtDescriptor *d = &av_pix_fmt_descriptors[i];
2035 uint8_t fill[4][8+6+3] = {{0}};
2036 uint8_t *data[4] = {fill[0], fill[1], fill[2], fill[3]};
2037 int linesize[4] = {0,0,0,0};
2040 if (!d->name && !d->nb_components && !d->log2_chroma_w && !d->log2_chroma_h && !d->flags)
2042 // av_log(NULL, AV_LOG_DEBUG, "Checking: %s\n", d->name);
2043 av_assert0(d->log2_chroma_w <= 3);
2044 av_assert0(d->log2_chroma_h <= 3);
2045 av_assert0(d->nb_components <= 4);
2046 av_assert0(d->name && d->name[0]);
2047 av_assert0((d->nb_components==4 || d->nb_components==2) == !!(d->flags & AV_PIX_FMT_FLAG_ALPHA));
2048 av_assert2(av_get_pix_fmt(d->name) == i);
2050 for (j=0; j<FF_ARRAY_ELEMS(d->comp); j++) {
2051 const AVComponentDescriptor *c = &d->comp[j];
2052 if(j>=d->nb_components) {
2053 av_assert0(!c->plane && !c->step_minus1 && !c->offset_plus1 && !c->shift && !c->depth_minus1);
2056 if (d->flags & AV_PIX_FMT_FLAG_BITSTREAM) {
2057 av_assert0(c->step_minus1 >= c->depth_minus1);
2059 av_assert0(8*(c->step_minus1+1) >= c->depth_minus1+1);
2061 if (!strncmp(d->name, "bayer_", 6))
2063 av_read_image_line(tmp, (void*)data, linesize, d, 0, 0, j, 2, 0);
2064 av_assert0(tmp[0] == 0 && tmp[1] == 0);
2065 tmp[0] = tmp[1] = (1<<(c->depth_minus1 + 1)) - 1;
2066 av_write_image_line(tmp, data, linesize, d, 0, 0, j, 2);
2072 enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
2074 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2078 if (!desc || strlen(desc->name) < 2)
2079 return AV_PIX_FMT_NONE;
2080 av_strlcpy(name, desc->name, sizeof(name));
2081 i = strlen(name) - 2;
2082 if (strcmp(name + i, "be") && strcmp(name + i, "le"))
2083 return AV_PIX_FMT_NONE;
2085 name[i] ^= 'b' ^ 'l';
2087 return get_pix_fmt_internal(name);
2090 #define FF_COLOR_NA -1
2091 #define FF_COLOR_RGB 0 /**< RGB color space */
2092 #define FF_COLOR_GRAY 1 /**< gray color space */
2093 #define FF_COLOR_YUV 2 /**< YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */
2094 #define FF_COLOR_YUV_JPEG 3 /**< YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */
2096 #define pixdesc_has_alpha(pixdesc) \
2097 ((pixdesc)->nb_components == 2 || (pixdesc)->nb_components == 4 || (pixdesc)->flags & AV_PIX_FMT_FLAG_PAL)
2100 static int get_color_type(const AVPixFmtDescriptor *desc) {
2101 if (desc->flags & AV_PIX_FMT_FLAG_PAL)
2102 return FF_COLOR_RGB;
2104 if(desc->nb_components == 1 || desc->nb_components == 2)
2105 return FF_COLOR_GRAY;
2107 if(desc->name && !strncmp(desc->name, "yuvj", 4))
2108 return FF_COLOR_YUV_JPEG;
2110 if(desc->flags & AV_PIX_FMT_FLAG_RGB)
2111 return FF_COLOR_RGB;
2113 if(desc->nb_components == 0)
2116 return FF_COLOR_YUV;
2119 static int get_pix_fmt_depth(int *min, int *max, enum AVPixelFormat pix_fmt)
2121 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2124 if (!desc || !desc->nb_components) {
2126 return AVERROR(EINVAL);
2129 *min = INT_MAX, *max = -INT_MAX;
2130 for (i = 0; i < desc->nb_components; i++) {
2131 *min = FFMIN(desc->comp[i].depth_minus1+1, *min);
2132 *max = FFMAX(desc->comp[i].depth_minus1+1, *max);
2137 static int get_pix_fmt_score(enum AVPixelFormat dst_pix_fmt,
2138 enum AVPixelFormat src_pix_fmt,
2139 unsigned *lossp, unsigned consider)
2141 const AVPixFmtDescriptor *src_desc = av_pix_fmt_desc_get(src_pix_fmt);
2142 const AVPixFmtDescriptor *dst_desc = av_pix_fmt_desc_get(dst_pix_fmt);
2143 int src_color, dst_color;
2144 int src_min_depth, src_max_depth, dst_min_depth, dst_max_depth;
2145 int ret, loss, i, nb_components;
2146 int score = INT_MAX - 1;
2148 if (dst_pix_fmt >= AV_PIX_FMT_NB || dst_pix_fmt <= AV_PIX_FMT_NONE)
2154 if (dst_pix_fmt == src_pix_fmt)
2157 if ((ret = get_pix_fmt_depth(&src_min_depth, &src_max_depth, src_pix_fmt)) < 0)
2159 if ((ret = get_pix_fmt_depth(&dst_min_depth, &dst_max_depth, dst_pix_fmt)) < 0)
2162 src_color = get_color_type(src_desc);
2163 dst_color = get_color_type(dst_desc);
2164 if (dst_pix_fmt == AV_PIX_FMT_PAL8)
2165 nb_components = FFMIN(src_desc->nb_components, 4);
2167 nb_components = FFMIN(src_desc->nb_components, dst_desc->nb_components);
2169 for (i = 0; i < nb_components; i++) {
2170 int depth_minus1 = (dst_pix_fmt == AV_PIX_FMT_PAL8) ? 7/nb_components : dst_desc->comp[i].depth_minus1;
2171 if (src_desc->comp[i].depth_minus1 > depth_minus1 && (consider & FF_LOSS_DEPTH)) {
2172 loss |= FF_LOSS_DEPTH;
2173 score -= 65536 >> depth_minus1;
2177 if (consider & FF_LOSS_RESOLUTION) {
2178 if (dst_desc->log2_chroma_w > src_desc->log2_chroma_w) {
2179 loss |= FF_LOSS_RESOLUTION;
2180 score -= 256 << dst_desc->log2_chroma_w;
2182 if (dst_desc->log2_chroma_h > src_desc->log2_chroma_h) {
2183 loss |= FF_LOSS_RESOLUTION;
2184 score -= 256 << dst_desc->log2_chroma_h;
2186 // don't favor 422 over 420 if downsampling is needed, because 420 has much better support on the decoder side
2187 if (dst_desc->log2_chroma_w == 1 && src_desc->log2_chroma_w == 0 &&
2188 dst_desc->log2_chroma_h == 1 && src_desc->log2_chroma_h == 0 ) {
2193 if(consider & FF_LOSS_COLORSPACE)
2196 if (src_color != FF_COLOR_RGB &&
2197 src_color != FF_COLOR_GRAY)
2198 loss |= FF_LOSS_COLORSPACE;
2201 if (src_color != FF_COLOR_GRAY)
2202 loss |= FF_LOSS_COLORSPACE;
2205 if (src_color != FF_COLOR_YUV)
2206 loss |= FF_LOSS_COLORSPACE;
2208 case FF_COLOR_YUV_JPEG:
2209 if (src_color != FF_COLOR_YUV_JPEG &&
2210 src_color != FF_COLOR_YUV &&
2211 src_color != FF_COLOR_GRAY)
2212 loss |= FF_LOSS_COLORSPACE;
2215 /* fail safe test */
2216 if (src_color != dst_color)
2217 loss |= FF_LOSS_COLORSPACE;
2220 if(loss & FF_LOSS_COLORSPACE)
2221 score -= (nb_components * 65536) >> FFMIN(dst_desc->comp[0].depth_minus1, src_desc->comp[0].depth_minus1);
2223 if (dst_color == FF_COLOR_GRAY &&
2224 src_color != FF_COLOR_GRAY && (consider & FF_LOSS_CHROMA)) {
2225 loss |= FF_LOSS_CHROMA;
2228 if (!pixdesc_has_alpha(dst_desc) && (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))) {
2229 loss |= FF_LOSS_ALPHA;
2232 if (dst_pix_fmt == AV_PIX_FMT_PAL8 && (consider & FF_LOSS_COLORQUANT) &&
2233 (src_pix_fmt != AV_PIX_FMT_PAL8 && (src_color != FF_COLOR_GRAY || (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))))) {
2234 loss |= FF_LOSS_COLORQUANT;
2242 int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,
2243 enum AVPixelFormat src_pix_fmt,
2247 int ret = get_pix_fmt_score(dst_pix_fmt, src_pix_fmt, &loss, has_alpha ? ~0 : ~FF_LOSS_ALPHA);
2253 enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
2254 enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
2256 enum AVPixelFormat dst_pix_fmt;
2257 int loss1, loss2, loss_mask;
2258 const AVPixFmtDescriptor *desc1 = av_pix_fmt_desc_get(dst_pix_fmt1);
2259 const AVPixFmtDescriptor *desc2 = av_pix_fmt_desc_get(dst_pix_fmt2);
2262 loss_mask= loss_ptr?~*loss_ptr:~0; /* use loss mask if provided */
2264 loss_mask &= ~FF_LOSS_ALPHA;
2266 score1 = get_pix_fmt_score(dst_pix_fmt1, src_pix_fmt, &loss1, loss_mask);
2267 score2 = get_pix_fmt_score(dst_pix_fmt2, src_pix_fmt, &loss2, loss_mask);
2269 if (score1 == score2) {
2270 if(av_get_padded_bits_per_pixel(desc2) != av_get_padded_bits_per_pixel(desc1)) {
2271 dst_pix_fmt = av_get_padded_bits_per_pixel(desc2) < av_get_padded_bits_per_pixel(desc1) ? dst_pix_fmt2 : dst_pix_fmt1;
2273 dst_pix_fmt = desc2->nb_components < desc1->nb_components ? dst_pix_fmt2 : dst_pix_fmt1;
2276 dst_pix_fmt = score1 < score2 ? dst_pix_fmt2 : dst_pix_fmt1;
2280 *loss_ptr = av_get_pix_fmt_loss(dst_pix_fmt, src_pix_fmt, has_alpha);
2291 for (i=0; i<AV_PIX_FMT_NB*2; i++) {
2292 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(i);
2293 if(!desc || !desc->name) {
2298 av_log(NULL, AV_LOG_INFO, "%3d unused pixel format values\n", skip);
2301 av_log(NULL, AV_LOG_INFO, "pix fmt %s avg_bpp:%d colortype:%d\n", desc->name, av_get_padded_bits_per_pixel(desc), get_color_type(desc));
2302 if ((!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)) != (desc->nb_components != 2 && desc->nb_components != 4)) {
2303 av_log(NULL, AV_LOG_ERROR, "Alpha flag mismatch\n");