2 * pixel format descriptor
3 * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "intreadwrite.h"
31 void av_read_image_line(uint16_t *dst,
32 const uint8_t *data[4], const int linesize[4],
33 const AVPixFmtDescriptor *desc,
34 int x, int y, int c, int w,
35 int read_pal_component)
37 AVComponentDescriptor comp = desc->comp[c];
38 int plane = comp.plane;
39 int depth = comp.depth_minus1 + 1;
40 int mask = (1 << depth) - 1;
41 int shift = comp.shift;
42 int step = comp.step_minus1 + 1;
43 int flags = desc->flags;
45 if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
46 int skip = x * step + comp.offset_plus1 - 1;
47 const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
48 int shift = 8 - depth - (skip & 7);
51 int val = (*p >> shift) & mask;
52 if (read_pal_component)
53 val = data[1][4*val + c];
60 const uint8_t *p = data[plane] + y * linesize[plane] +
61 x * step + comp.offset_plus1 - 1;
62 int is_8bit = shift + depth <= 8;
65 p += !!(flags & AV_PIX_FMT_FLAG_BE);
68 int val = is_8bit ? *p :
69 flags & AV_PIX_FMT_FLAG_BE ? AV_RB16(p) : AV_RL16(p);
70 val = (val >> shift) & mask;
71 if (read_pal_component)
72 val = data[1][4 * val + c];
79 void av_write_image_line(const uint16_t *src,
80 uint8_t *data[4], const int linesize[4],
81 const AVPixFmtDescriptor *desc,
82 int x, int y, int c, int w)
84 AVComponentDescriptor comp = desc->comp[c];
85 int plane = comp.plane;
86 int depth = comp.depth_minus1 + 1;
87 int step = comp.step_minus1 + 1;
88 int flags = desc->flags;
90 if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
91 int skip = x * step + comp.offset_plus1 - 1;
92 uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
93 int shift = 8 - depth - (skip & 7);
96 *p |= *src++ << shift;
102 int shift = comp.shift;
103 uint8_t *p = data[plane] + y * linesize[plane] +
104 x * step + comp.offset_plus1 - 1;
106 if (shift + depth <= 8) {
107 p += !!(flags & AV_PIX_FMT_FLAG_BE);
109 *p |= (*src++ << shift);
114 if (flags & AV_PIX_FMT_FLAG_BE) {
115 uint16_t val = AV_RB16(p) | (*src++ << shift);
118 uint16_t val = AV_RL16(p) | (*src++ << shift);
127 #if !FF_API_PIX_FMT_DESC
130 const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
131 [AV_PIX_FMT_YUV420P] = {
137 { 0, 0, 1, 0, 7 }, /* Y */
138 { 1, 0, 1, 0, 7 }, /* U */
139 { 2, 0, 1, 0, 7 }, /* V */
141 .flags = AV_PIX_FMT_FLAG_PLANAR,
143 [AV_PIX_FMT_YUYV422] = {
149 { 0, 1, 1, 0, 7 }, /* Y */
150 { 0, 3, 2, 0, 7 }, /* U */
151 { 0, 3, 4, 0, 7 }, /* V */
154 [AV_PIX_FMT_RGB24] = {
160 { 0, 2, 1, 0, 7 }, /* R */
161 { 0, 2, 2, 0, 7 }, /* G */
162 { 0, 2, 3, 0, 7 }, /* B */
164 .flags = AV_PIX_FMT_FLAG_RGB,
166 [AV_PIX_FMT_BGR24] = {
172 { 0, 2, 1, 0, 7 }, /* B */
173 { 0, 2, 2, 0, 7 }, /* G */
174 { 0, 2, 3, 0, 7 }, /* R */
176 .flags = AV_PIX_FMT_FLAG_RGB,
178 [AV_PIX_FMT_YUV422P] = {
184 { 0, 0, 1, 0, 7 }, /* Y */
185 { 1, 0, 1, 0, 7 }, /* U */
186 { 2, 0, 1, 0, 7 }, /* V */
188 .flags = AV_PIX_FMT_FLAG_PLANAR,
190 [AV_PIX_FMT_YUV444P] = {
196 { 0, 0, 1, 0, 7 }, /* Y */
197 { 1, 0, 1, 0, 7 }, /* U */
198 { 2, 0, 1, 0, 7 }, /* V */
200 .flags = AV_PIX_FMT_FLAG_PLANAR,
202 [AV_PIX_FMT_YUV410P] = {
208 { 0, 0, 1, 0, 7 }, /* Y */
209 { 1, 0, 1, 0, 7 }, /* U */
210 { 2, 0, 1, 0, 7 }, /* V */
212 .flags = AV_PIX_FMT_FLAG_PLANAR,
214 [AV_PIX_FMT_YUV411P] = {
220 { 0, 0, 1, 0, 7 }, /* Y */
221 { 1, 0, 1, 0, 7 }, /* U */
222 { 2, 0, 1, 0, 7 }, /* V */
224 .flags = AV_PIX_FMT_FLAG_PLANAR,
226 [AV_PIX_FMT_GRAY8] = {
232 { 0, 0, 1, 0, 7 }, /* Y */
234 .flags = AV_PIX_FMT_FLAG_PSEUDOPAL,
236 [AV_PIX_FMT_MONOWHITE] = {
242 { 0, 0, 1, 0, 0 }, /* Y */
244 .flags = AV_PIX_FMT_FLAG_BITSTREAM,
246 [AV_PIX_FMT_MONOBLACK] = {
252 { 0, 0, 1, 7, 0 }, /* Y */
254 .flags = AV_PIX_FMT_FLAG_BITSTREAM,
256 [AV_PIX_FMT_PAL8] = {
264 .flags = AV_PIX_FMT_FLAG_PAL,
266 [AV_PIX_FMT_YUVJ420P] = {
272 { 0, 0, 1, 0, 7 }, /* Y */
273 { 1, 0, 1, 0, 7 }, /* U */
274 { 2, 0, 1, 0, 7 }, /* V */
276 .flags = AV_PIX_FMT_FLAG_PLANAR,
278 [AV_PIX_FMT_YUVJ422P] = {
284 { 0, 0, 1, 0, 7 }, /* Y */
285 { 1, 0, 1, 0, 7 }, /* U */
286 { 2, 0, 1, 0, 7 }, /* V */
288 .flags = AV_PIX_FMT_FLAG_PLANAR,
290 [AV_PIX_FMT_YUVJ444P] = {
296 {0, 0, 1, 0, 7}, /* Y */
297 {1, 0, 1, 0, 7}, /* U */
298 {2, 0, 1, 0, 7}, /* V */
300 .flags = AV_PIX_FMT_FLAG_PLANAR,
302 [AV_PIX_FMT_XVMC_MPEG2_MC] = {
304 .flags = AV_PIX_FMT_FLAG_HWACCEL,
306 [AV_PIX_FMT_XVMC_MPEG2_IDCT] = {
308 .flags = AV_PIX_FMT_FLAG_HWACCEL,
310 [AV_PIX_FMT_UYVY422] = {
316 { 0, 1, 2, 0, 7 }, /* Y */
317 { 0, 3, 1, 0, 7 }, /* U */
318 { 0, 3, 3, 0, 7 }, /* V */
321 [AV_PIX_FMT_UYYVYY411] = {
327 { 0, 3, 2, 0, 7 }, /* Y */
328 { 0, 5, 1, 0, 7 }, /* U */
329 { 0, 5, 4, 0, 7 }, /* V */
332 [AV_PIX_FMT_BGR8] = {
338 { 0, 0, 1, 6, 1 }, /* B */
339 { 0, 0, 1, 3, 2 }, /* G */
340 { 0, 0, 1, 0, 2 }, /* R */
342 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
344 [AV_PIX_FMT_BGR4] = {
350 { 0, 3, 1, 0, 0 }, /* B */
351 { 0, 3, 2, 0, 1 }, /* G */
352 { 0, 3, 4, 0, 0 }, /* R */
354 .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
356 [AV_PIX_FMT_BGR4_BYTE] = {
362 { 0, 0, 1, 3, 0 }, /* B */
363 { 0, 0, 1, 1, 1 }, /* G */
364 { 0, 0, 1, 0, 0 }, /* R */
366 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
368 [AV_PIX_FMT_RGB8] = {
374 { 0, 0, 1, 6, 1 }, /* R */
375 { 0, 0, 1, 3, 2 }, /* G */
376 { 0, 0, 1, 0, 2 }, /* B */
378 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
380 [AV_PIX_FMT_RGB4] = {
386 { 0, 3, 1, 0, 0 }, /* R */
387 { 0, 3, 2, 0, 1 }, /* G */
388 { 0, 3, 4, 0, 0 }, /* B */
390 .flags = AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_RGB,
392 [AV_PIX_FMT_RGB4_BYTE] = {
398 { 0, 0, 1, 3, 0 }, /* R */
399 { 0, 0, 1, 1, 1 }, /* G */
400 { 0, 0, 1, 0, 0 }, /* B */
402 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PSEUDOPAL,
404 [AV_PIX_FMT_NV12] = {
410 { 0, 0, 1, 0, 7 }, /* Y */
411 { 1, 1, 1, 0, 7 }, /* U */
412 { 1, 1, 2, 0, 7 }, /* V */
414 .flags = AV_PIX_FMT_FLAG_PLANAR,
416 [AV_PIX_FMT_NV21] = {
422 { 0, 0, 1, 0, 7 }, /* Y */
423 { 1, 1, 1, 0, 7 }, /* V */
424 { 1, 1, 2, 0, 7 }, /* U */
426 .flags = AV_PIX_FMT_FLAG_PLANAR,
428 [AV_PIX_FMT_ARGB] = {
434 { 0, 3, 1, 0, 7 }, /* A */
435 { 0, 3, 2, 0, 7 }, /* R */
436 { 0, 3, 3, 0, 7 }, /* G */
437 { 0, 3, 4, 0, 7 }, /* B */
439 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
441 [AV_PIX_FMT_RGBA] = {
447 { 0, 3, 1, 0, 7 }, /* R */
448 { 0, 3, 2, 0, 7 }, /* G */
449 { 0, 3, 3, 0, 7 }, /* B */
450 { 0, 3, 4, 0, 7 }, /* A */
452 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
454 [AV_PIX_FMT_ABGR] = {
460 { 0, 3, 1, 0, 7 }, /* A */
461 { 0, 3, 2, 0, 7 }, /* B */
462 { 0, 3, 3, 0, 7 }, /* G */
463 { 0, 3, 4, 0, 7 }, /* R */
465 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
467 [AV_PIX_FMT_BGRA] = {
473 { 0, 3, 1, 0, 7 }, /* B */
474 { 0, 3, 2, 0, 7 }, /* G */
475 { 0, 3, 3, 0, 7 }, /* R */
476 { 0, 3, 4, 0, 7 }, /* A */
478 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_ALPHA,
480 [AV_PIX_FMT_GRAY16BE] = {
486 { 0, 1, 1, 0, 15 }, /* Y */
488 .flags = AV_PIX_FMT_FLAG_BE,
490 [AV_PIX_FMT_GRAY16LE] = {
496 { 0, 1, 1, 0, 15 }, /* Y */
499 [AV_PIX_FMT_YUV440P] = {
505 { 0, 0, 1, 0, 7 }, /* Y */
506 { 1, 0, 1, 0, 7 }, /* U */
507 { 2, 0, 1, 0, 7 }, /* V */
509 .flags = AV_PIX_FMT_FLAG_PLANAR,
511 [AV_PIX_FMT_YUVJ440P] = {
517 { 0, 0, 1, 0, 7 }, /* Y */
518 { 1, 0, 1, 0, 7 }, /* U */
519 { 2, 0, 1, 0, 7 }, /* V */
521 .flags = AV_PIX_FMT_FLAG_PLANAR,
523 [AV_PIX_FMT_YUVA420P] = {
529 { 0, 0, 1, 0, 7 }, /* Y */
530 { 1, 0, 1, 0, 7 }, /* U */
531 { 2, 0, 1, 0, 7 }, /* V */
532 { 3, 0, 1, 0, 7 }, /* A */
534 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
536 [AV_PIX_FMT_YUVA422P] = {
542 { 0, 0, 1, 0, 7 }, /* Y */
543 { 1, 0, 1, 0, 7 }, /* U */
544 { 2, 0, 1, 0, 7 }, /* V */
545 { 3, 0, 1, 0, 7 }, /* A */
547 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
549 [AV_PIX_FMT_YUVA444P] = {
555 { 0, 0, 1, 0, 7 }, /* Y */
556 { 1, 0, 1, 0, 7 }, /* U */
557 { 2, 0, 1, 0, 7 }, /* V */
558 { 3, 0, 1, 0, 7 }, /* A */
560 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
562 [AV_PIX_FMT_YUVA420P9BE] = {
563 .name = "yuva420p9be",
568 { 0, 1, 1, 0, 8 }, /* Y */
569 { 1, 1, 1, 0, 8 }, /* U */
570 { 2, 1, 1, 0, 8 }, /* V */
571 { 3, 1, 1, 0, 8 }, /* A */
573 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
575 [AV_PIX_FMT_YUVA420P9LE] = {
576 .name = "yuva420p9le",
581 { 0, 1, 1, 0, 8 }, /* Y */
582 { 1, 1, 1, 0, 8 }, /* U */
583 { 2, 1, 1, 0, 8 }, /* V */
584 { 3, 1, 1, 0, 8 }, /* A */
586 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
588 [AV_PIX_FMT_YUVA422P9BE] = {
589 .name = "yuva422p9be",
594 { 0, 1, 1, 0, 8 }, /* Y */
595 { 1, 1, 1, 0, 8 }, /* U */
596 { 2, 1, 1, 0, 8 }, /* V */
597 { 3, 1, 1, 0, 8 }, /* A */
599 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
601 [AV_PIX_FMT_YUVA422P9LE] = {
602 .name = "yuva422p9le",
607 { 0, 1, 1, 0, 8 }, /* Y */
608 { 1, 1, 1, 0, 8 }, /* U */
609 { 2, 1, 1, 0, 8 }, /* V */
610 { 3, 1, 1, 0, 8 }, /* A */
612 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
614 [AV_PIX_FMT_YUVA444P9BE] = {
615 .name = "yuva444p9be",
620 { 0, 1, 1, 0, 8 }, /* Y */
621 { 1, 1, 1, 0, 8 }, /* U */
622 { 2, 1, 1, 0, 8 }, /* V */
623 { 3, 1, 1, 0, 8 }, /* A */
625 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
627 [AV_PIX_FMT_YUVA444P9LE] = {
628 .name = "yuva444p9le",
633 { 0, 1, 1, 0, 8 }, /* Y */
634 { 1, 1, 1, 0, 8 }, /* U */
635 { 2, 1, 1, 0, 8 }, /* V */
636 { 3, 1, 1, 0, 8 }, /* A */
638 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
640 [AV_PIX_FMT_YUVA420P10BE] = {
641 .name = "yuva420p10be",
646 { 0, 1, 1, 0, 9 }, /* Y */
647 { 1, 1, 1, 0, 9 }, /* U */
648 { 2, 1, 1, 0, 9 }, /* V */
649 { 3, 1, 1, 0, 9 }, /* A */
651 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
653 [AV_PIX_FMT_YUVA420P10LE] = {
654 .name = "yuva420p10le",
659 { 0, 1, 1, 0, 9 }, /* Y */
660 { 1, 1, 1, 0, 9 }, /* U */
661 { 2, 1, 1, 0, 9 }, /* V */
662 { 3, 1, 1, 0, 9 }, /* A */
664 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
666 [AV_PIX_FMT_YUVA422P10BE] = {
667 .name = "yuva422p10be",
672 { 0, 1, 1, 0, 9 }, /* Y */
673 { 1, 1, 1, 0, 9 }, /* U */
674 { 2, 1, 1, 0, 9 }, /* V */
675 { 3, 1, 1, 0, 9 }, /* A */
677 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
679 [AV_PIX_FMT_YUVA422P10LE] = {
680 .name = "yuva422p10le",
685 { 0, 1, 1, 0, 9 }, /* Y */
686 { 1, 1, 1, 0, 9 }, /* U */
687 { 2, 1, 1, 0, 9 }, /* V */
688 { 3, 1, 1, 0, 9 }, /* A */
690 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
692 [AV_PIX_FMT_YUVA444P10BE] = {
693 .name = "yuva444p10be",
698 { 0, 1, 1, 0, 9 }, /* Y */
699 { 1, 1, 1, 0, 9 }, /* U */
700 { 2, 1, 1, 0, 9 }, /* V */
701 { 3, 1, 1, 0, 9 }, /* A */
703 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
705 [AV_PIX_FMT_YUVA444P10LE] = {
706 .name = "yuva444p10le",
711 { 0, 1, 1, 0, 9 }, /* Y */
712 { 1, 1, 1, 0, 9 }, /* U */
713 { 2, 1, 1, 0, 9 }, /* V */
714 { 3, 1, 1, 0, 9 }, /* A */
716 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
718 [AV_PIX_FMT_YUVA420P16BE] = {
719 .name = "yuva420p16be",
724 { 0, 1, 1, 0, 15 }, /* Y */
725 { 1, 1, 1, 0, 15 }, /* U */
726 { 2, 1, 1, 0, 15 }, /* V */
727 { 3, 1, 1, 0, 15 }, /* A */
729 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
731 [AV_PIX_FMT_YUVA420P16LE] = {
732 .name = "yuva420p16le",
737 { 0, 1, 1, 0, 15 }, /* Y */
738 { 1, 1, 1, 0, 15 }, /* U */
739 { 2, 1, 1, 0, 15 }, /* V */
740 { 3, 1, 1, 0, 15 }, /* A */
742 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
744 [AV_PIX_FMT_YUVA422P16BE] = {
745 .name = "yuva422p16be",
750 { 0, 1, 1, 0, 15 }, /* Y */
751 { 1, 1, 1, 0, 15 }, /* U */
752 { 2, 1, 1, 0, 15 }, /* V */
753 { 3, 1, 1, 0, 15 }, /* A */
755 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
757 [AV_PIX_FMT_YUVA422P16LE] = {
758 .name = "yuva422p16le",
763 { 0, 1, 1, 0, 15 }, /* Y */
764 { 1, 1, 1, 0, 15 }, /* U */
765 { 2, 1, 1, 0, 15 }, /* V */
766 { 3, 1, 1, 0, 15 }, /* A */
768 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
770 [AV_PIX_FMT_YUVA444P16BE] = {
771 .name = "yuva444p16be",
776 { 0, 1, 1, 0, 15 }, /* Y */
777 { 1, 1, 1, 0, 15 }, /* U */
778 { 2, 1, 1, 0, 15 }, /* V */
779 { 3, 1, 1, 0, 15 }, /* A */
781 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
783 [AV_PIX_FMT_YUVA444P16LE] = {
784 .name = "yuva444p16le",
789 { 0, 1, 1, 0, 15 }, /* Y */
790 { 1, 1, 1, 0, 15 }, /* U */
791 { 2, 1, 1, 0, 15 }, /* V */
792 { 3, 1, 1, 0, 15 }, /* A */
794 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
797 [AV_PIX_FMT_VDPAU_H264] = {
798 .name = "vdpau_h264",
801 .flags = AV_PIX_FMT_FLAG_HWACCEL,
803 [AV_PIX_FMT_VDPAU_MPEG1] = {
804 .name = "vdpau_mpeg1",
807 .flags = AV_PIX_FMT_FLAG_HWACCEL,
809 [AV_PIX_FMT_VDPAU_MPEG2] = {
810 .name = "vdpau_mpeg2",
813 .flags = AV_PIX_FMT_FLAG_HWACCEL,
815 [AV_PIX_FMT_VDPAU_WMV3] = {
816 .name = "vdpau_wmv3",
819 .flags = AV_PIX_FMT_FLAG_HWACCEL,
821 [AV_PIX_FMT_VDPAU_VC1] = {
825 .flags = AV_PIX_FMT_FLAG_HWACCEL,
827 [AV_PIX_FMT_VDPAU_MPEG4] = {
828 .name = "vdpau_mpeg4",
831 .flags = AV_PIX_FMT_FLAG_HWACCEL,
834 [AV_PIX_FMT_RGB48BE] = {
840 { 0, 5, 1, 0, 15 }, /* R */
841 { 0, 5, 3, 0, 15 }, /* G */
842 { 0, 5, 5, 0, 15 }, /* B */
844 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
846 [AV_PIX_FMT_RGB48LE] = {
852 { 0, 5, 1, 0, 15 }, /* R */
853 { 0, 5, 3, 0, 15 }, /* G */
854 { 0, 5, 5, 0, 15 }, /* B */
856 .flags = AV_PIX_FMT_FLAG_RGB,
858 [AV_PIX_FMT_RGB565BE] = {
864 { 0, 1, 0, 3, 4 }, /* R */
865 { 0, 1, 1, 5, 5 }, /* G */
866 { 0, 1, 1, 0, 4 }, /* B */
868 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
870 [AV_PIX_FMT_RGB565LE] = {
876 { 0, 1, 2, 3, 4 }, /* R */
877 { 0, 1, 1, 5, 5 }, /* G */
878 { 0, 1, 1, 0, 4 }, /* B */
880 .flags = AV_PIX_FMT_FLAG_RGB,
882 [AV_PIX_FMT_RGB555BE] = {
888 { 0, 1, 0, 2, 4 }, /* R */
889 { 0, 1, 1, 5, 4 }, /* G */
890 { 0, 1, 1, 0, 4 }, /* B */
892 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
894 [AV_PIX_FMT_RGB555LE] = {
900 { 0, 1, 2, 2, 4 }, /* R */
901 { 0, 1, 1, 5, 4 }, /* G */
902 { 0, 1, 1, 0, 4 }, /* B */
904 .flags = AV_PIX_FMT_FLAG_RGB,
906 [AV_PIX_FMT_RGB444BE] = {
912 { 0, 1, 0, 0, 3 }, /* R */
913 { 0, 1, 1, 4, 3 }, /* G */
914 { 0, 1, 1, 0, 3 }, /* B */
916 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
918 [AV_PIX_FMT_RGB444LE] = {
924 { 0, 1, 2, 0, 3 }, /* R */
925 { 0, 1, 1, 4, 3 }, /* G */
926 { 0, 1, 1, 0, 3 }, /* B */
928 .flags = AV_PIX_FMT_FLAG_RGB,
930 [AV_PIX_FMT_BGR48BE] = {
936 { 0, 5, 1, 0, 15 }, /* B */
937 { 0, 5, 3, 0, 15 }, /* G */
938 { 0, 5, 5, 0, 15 }, /* R */
940 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
942 [AV_PIX_FMT_BGR48LE] = {
948 { 0, 5, 1, 0, 15 }, /* B */
949 { 0, 5, 3, 0, 15 }, /* G */
950 { 0, 5, 5, 0, 15 }, /* R */
952 .flags = AV_PIX_FMT_FLAG_RGB,
954 [AV_PIX_FMT_BGR565BE] = {
960 { 0, 1, 0, 3, 4 }, /* B */
961 { 0, 1, 1, 5, 5 }, /* G */
962 { 0, 1, 1, 0, 4 }, /* R */
964 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
966 [AV_PIX_FMT_BGR565LE] = {
972 { 0, 1, 2, 3, 4 }, /* B */
973 { 0, 1, 1, 5, 5 }, /* G */
974 { 0, 1, 1, 0, 4 }, /* R */
976 .flags = AV_PIX_FMT_FLAG_RGB,
978 [AV_PIX_FMT_BGR555BE] = {
984 { 0, 1, 0, 2, 4 }, /* B */
985 { 0, 1, 1, 5, 4 }, /* G */
986 { 0, 1, 1, 0, 4 }, /* R */
988 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
990 [AV_PIX_FMT_BGR555LE] = {
996 { 0, 1, 2, 2, 4 }, /* B */
997 { 0, 1, 1, 5, 4 }, /* G */
998 { 0, 1, 1, 0, 4 }, /* R */
1000 .flags = AV_PIX_FMT_FLAG_RGB,
1002 [AV_PIX_FMT_BGR444BE] = {
1008 { 0, 1, 0, 0, 3 }, /* B */
1009 { 0, 1, 1, 4, 3 }, /* G */
1010 { 0, 1, 1, 0, 3 }, /* R */
1012 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1014 [AV_PIX_FMT_BGR444LE] = {
1020 { 0, 1, 2, 0, 3 }, /* B */
1021 { 0, 1, 1, 4, 3 }, /* G */
1022 { 0, 1, 1, 0, 3 }, /* R */
1024 .flags = AV_PIX_FMT_FLAG_RGB,
1026 [AV_PIX_FMT_VAAPI_MOCO] = {
1027 .name = "vaapi_moco",
1030 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1032 [AV_PIX_FMT_VAAPI_IDCT] = {
1033 .name = "vaapi_idct",
1036 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1038 [AV_PIX_FMT_VAAPI_VLD] = {
1039 .name = "vaapi_vld",
1042 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1044 [AV_PIX_FMT_VDA_VLD] = {
1048 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1050 [AV_PIX_FMT_YUV420P9LE] = {
1051 .name = "yuv420p9le",
1056 { 0, 1, 1, 0, 8 }, /* Y */
1057 { 1, 1, 1, 0, 8 }, /* U */
1058 { 2, 1, 1, 0, 8 }, /* V */
1060 .flags = AV_PIX_FMT_FLAG_PLANAR,
1062 [AV_PIX_FMT_YUV420P9BE] = {
1063 .name = "yuv420p9be",
1068 { 0, 1, 1, 0, 8 }, /* Y */
1069 { 1, 1, 1, 0, 8 }, /* U */
1070 { 2, 1, 1, 0, 8 }, /* V */
1072 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1074 [AV_PIX_FMT_YUV420P10LE] = {
1075 .name = "yuv420p10le",
1080 { 0, 1, 1, 0, 9 }, /* Y */
1081 { 1, 1, 1, 0, 9 }, /* U */
1082 { 2, 1, 1, 0, 9 }, /* V */
1084 .flags = AV_PIX_FMT_FLAG_PLANAR,
1086 [AV_PIX_FMT_YUV420P10BE] = {
1087 .name = "yuv420p10be",
1092 { 0, 1, 1, 0, 9 }, /* Y */
1093 { 1, 1, 1, 0, 9 }, /* U */
1094 { 2, 1, 1, 0, 9 }, /* V */
1096 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1098 [AV_PIX_FMT_YUV420P16LE] = {
1099 .name = "yuv420p16le",
1104 { 0, 1, 1, 0, 15 }, /* Y */
1105 { 1, 1, 1, 0, 15 }, /* U */
1106 { 2, 1, 1, 0, 15 }, /* V */
1108 .flags = AV_PIX_FMT_FLAG_PLANAR,
1110 [AV_PIX_FMT_YUV420P16BE] = {
1111 .name = "yuv420p16be",
1116 { 0, 1, 1, 0, 15 }, /* Y */
1117 { 1, 1, 1, 0, 15 }, /* U */
1118 { 2, 1, 1, 0, 15 }, /* V */
1120 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1122 [AV_PIX_FMT_YUV422P9LE] = {
1123 .name = "yuv422p9le",
1128 { 0, 1, 1, 0, 8 }, /* Y */
1129 { 1, 1, 1, 0, 8 }, /* U */
1130 { 2, 1, 1, 0, 8 }, /* V */
1132 .flags = AV_PIX_FMT_FLAG_PLANAR,
1134 [AV_PIX_FMT_YUV422P9BE] = {
1135 .name = "yuv422p9be",
1140 { 0, 1, 1, 0, 8 }, /* Y */
1141 { 1, 1, 1, 0, 8 }, /* U */
1142 { 2, 1, 1, 0, 8 }, /* V */
1144 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1146 [AV_PIX_FMT_YUV422P10LE] = {
1147 .name = "yuv422p10le",
1152 { 0, 1, 1, 0, 9 }, /* Y */
1153 { 1, 1, 1, 0, 9 }, /* U */
1154 { 2, 1, 1, 0, 9 }, /* V */
1156 .flags = AV_PIX_FMT_FLAG_PLANAR,
1158 [AV_PIX_FMT_YUV422P10BE] = {
1159 .name = "yuv422p10be",
1164 { 0, 1, 1, 0, 9 }, /* Y */
1165 { 1, 1, 1, 0, 9 }, /* U */
1166 { 2, 1, 1, 0, 9 }, /* V */
1168 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1170 [AV_PIX_FMT_YUV422P16LE] = {
1171 .name = "yuv422p16le",
1176 { 0, 1, 1, 0, 15 }, /* Y */
1177 { 1, 1, 1, 0, 15 }, /* U */
1178 { 2, 1, 1, 0, 15 }, /* V */
1180 .flags = AV_PIX_FMT_FLAG_PLANAR,
1182 [AV_PIX_FMT_YUV422P16BE] = {
1183 .name = "yuv422p16be",
1188 { 0, 1, 1, 0, 15 }, /* Y */
1189 { 1, 1, 1, 0, 15 }, /* U */
1190 { 2, 1, 1, 0, 15 }, /* V */
1192 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1194 [AV_PIX_FMT_YUV444P16LE] = {
1195 .name = "yuv444p16le",
1200 { 0, 1, 1, 0, 15 }, /* Y */
1201 { 1, 1, 1, 0, 15 }, /* U */
1202 { 2, 1, 1, 0, 15 }, /* V */
1204 .flags = AV_PIX_FMT_FLAG_PLANAR,
1206 [AV_PIX_FMT_YUV444P16BE] = {
1207 .name = "yuv444p16be",
1212 { 0, 1, 1, 0, 15 }, /* Y */
1213 { 1, 1, 1, 0, 15 }, /* U */
1214 { 2, 1, 1, 0, 15 }, /* V */
1216 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1218 [AV_PIX_FMT_YUV444P10LE] = {
1219 .name = "yuv444p10le",
1224 { 0, 1, 1, 0, 9 }, /* Y */
1225 { 1, 1, 1, 0, 9 }, /* U */
1226 { 2, 1, 1, 0, 9 }, /* V */
1228 .flags = AV_PIX_FMT_FLAG_PLANAR,
1230 [AV_PIX_FMT_YUV444P10BE] = {
1231 .name = "yuv444p10be",
1236 { 0, 1, 1, 0, 9 }, /* Y */
1237 { 1, 1, 1, 0, 9 }, /* U */
1238 { 2, 1, 1, 0, 9 }, /* V */
1240 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1242 [AV_PIX_FMT_YUV444P9LE] = {
1243 .name = "yuv444p9le",
1248 { 0, 1, 1, 0, 8 }, /* Y */
1249 { 1, 1, 1, 0, 8 }, /* U */
1250 { 2, 1, 1, 0, 8 }, /* V */
1252 .flags = AV_PIX_FMT_FLAG_PLANAR,
1254 [AV_PIX_FMT_YUV444P9BE] = {
1255 .name = "yuv444p9be",
1260 { 0, 1, 1, 0, 8 }, /* Y */
1261 { 1, 1, 1, 0, 8 }, /* U */
1262 { 2, 1, 1, 0, 8 }, /* V */
1264 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1266 [AV_PIX_FMT_DXVA2_VLD] = {
1267 .name = "dxva2_vld",
1270 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1272 [AV_PIX_FMT_Y400A] = {
1276 { 0, 1, 1, 0, 7 }, /* Y */
1277 { 0, 1, 2, 0, 7 }, /* A */
1279 .flags = AV_PIX_FMT_FLAG_ALPHA,
1281 [AV_PIX_FMT_GBRP] = {
1287 { 0, 0, 1, 0, 7 }, /* G */
1288 { 1, 0, 1, 0, 7 }, /* B */
1289 { 2, 0, 1, 0, 7 }, /* R */
1291 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1293 [AV_PIX_FMT_GBRP9LE] = {
1299 { 0, 1, 1, 0, 8 }, /* G */
1300 { 1, 1, 1, 0, 8 }, /* B */
1301 { 2, 1, 1, 0, 8 }, /* R */
1303 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1305 [AV_PIX_FMT_GBRP9BE] = {
1311 { 0, 1, 1, 0, 8 }, /* G */
1312 { 1, 1, 1, 0, 8 }, /* B */
1313 { 2, 1, 1, 0, 8 }, /* R */
1315 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1317 [AV_PIX_FMT_GBRP10LE] = {
1323 { 0, 1, 1, 0, 9 }, /* G */
1324 { 1, 1, 1, 0, 9 }, /* B */
1325 { 2, 1, 1, 0, 9 }, /* R */
1327 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1329 [AV_PIX_FMT_GBRP10BE] = {
1335 { 0, 1, 1, 0, 9 }, /* G */
1336 { 1, 1, 1, 0, 9 }, /* B */
1337 { 2, 1, 1, 0, 9 }, /* R */
1339 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1341 [AV_PIX_FMT_GBRP16LE] = {
1347 { 0, 1, 1, 0, 15 }, /* G */
1348 { 1, 1, 1, 0, 15 }, /* B */
1349 { 2, 1, 1, 0, 15 }, /* R */
1351 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1353 [AV_PIX_FMT_GBRP16BE] = {
1359 { 0, 1, 1, 0, 15 }, /* G */
1360 { 1, 1, 1, 0, 15 }, /* B */
1361 { 2, 1, 1, 0, 15 }, /* R */
1363 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1365 [AV_PIX_FMT_VDPAU] = {
1369 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1371 [AV_PIX_FMT_XYZ12LE] = {
1377 { 0, 5, 1, 4, 11 }, /* X */
1378 { 0, 5, 3, 4, 11 }, /* Y */
1379 { 0, 5, 5, 4, 11 }, /* Z */
1381 /*.flags = -- not used*/
1383 [AV_PIX_FMT_XYZ12BE] = {
1389 { 0, 5, 1, 4, 11 }, /* X */
1390 { 0, 5, 3, 4, 11 }, /* Y */
1391 { 0, 5, 5, 4, 11 }, /* Z */
1393 .flags = AV_PIX_FMT_FLAG_BE,
1397 FF_DISABLE_DEPRECATION_WARNINGS
1398 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1400 enum AVPixelFormat pix_fmt;
1402 for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1403 if (av_pix_fmt_descriptors[pix_fmt].name &&
1404 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1407 return AV_PIX_FMT_NONE;
1410 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
1412 return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1413 av_pix_fmt_descriptors[pix_fmt].name : NULL;
1417 # define X_NE(be, le) be
1419 # define X_NE(be, le) le
1422 enum AVPixelFormat av_get_pix_fmt(const char *name)
1424 enum AVPixelFormat pix_fmt;
1426 if (!strcmp(name, "rgb32"))
1427 name = X_NE("argb", "bgra");
1428 else if (!strcmp(name, "bgr32"))
1429 name = X_NE("abgr", "rgba");
1431 pix_fmt = get_pix_fmt_internal(name);
1432 if (pix_fmt == AV_PIX_FMT_NONE) {
1435 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1436 pix_fmt = get_pix_fmt_internal(name2);
1441 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1444 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1446 for (c = 0; c < pixdesc->nb_components; c++) {
1447 int s = c == 1 || c == 2 ? 0 : log2_pixels;
1448 bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1451 return bits >> log2_pixels;
1454 char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt)
1458 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1460 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1461 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1462 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1468 const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
1470 if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
1472 return &av_pix_fmt_descriptors[pix_fmt];
1475 const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
1478 return &av_pix_fmt_descriptors[0];
1479 if (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1)
1484 enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
1486 if (desc < av_pix_fmt_descriptors ||
1487 desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
1488 return AV_PIX_FMT_NONE;
1490 return desc - av_pix_fmt_descriptors;
1492 FF_ENABLE_DEPRECATION_WARNINGS
1494 int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
1495 int *h_shift, int *v_shift)
1497 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1499 return AVERROR(ENOSYS);
1500 *h_shift = desc->log2_chroma_w;
1501 *v_shift = desc->log2_chroma_h;
1506 int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
1508 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1509 int i, planes[4] = { 0 }, ret = 0;
1512 return AVERROR(EINVAL);
1514 for (i = 0; i < desc->nb_components; i++)
1515 planes[desc->comp[i].plane] = 1;
1516 for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
1522 enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
1524 #define PIX_FMT_SWAP_ENDIANNESS(fmt) \
1525 case AV_PIX_FMT_ ## fmt ## BE: return AV_PIX_FMT_ ## fmt ## LE; \
1526 case AV_PIX_FMT_ ## fmt ## LE: return AV_PIX_FMT_ ## fmt ## BE
1529 PIX_FMT_SWAP_ENDIANNESS(GRAY16);
1530 PIX_FMT_SWAP_ENDIANNESS(RGB48);
1531 PIX_FMT_SWAP_ENDIANNESS(RGB565);
1532 PIX_FMT_SWAP_ENDIANNESS(RGB555);
1533 PIX_FMT_SWAP_ENDIANNESS(RGB444);
1534 PIX_FMT_SWAP_ENDIANNESS(BGR48);
1535 PIX_FMT_SWAP_ENDIANNESS(BGR565);
1536 PIX_FMT_SWAP_ENDIANNESS(BGR555);
1537 PIX_FMT_SWAP_ENDIANNESS(BGR444);
1539 PIX_FMT_SWAP_ENDIANNESS(YUV420P9);
1540 PIX_FMT_SWAP_ENDIANNESS(YUV422P9);
1541 PIX_FMT_SWAP_ENDIANNESS(YUV444P9);
1542 PIX_FMT_SWAP_ENDIANNESS(YUV420P10);
1543 PIX_FMT_SWAP_ENDIANNESS(YUV422P10);
1544 PIX_FMT_SWAP_ENDIANNESS(YUV444P10);
1545 PIX_FMT_SWAP_ENDIANNESS(YUV420P16);
1546 PIX_FMT_SWAP_ENDIANNESS(YUV422P16);
1547 PIX_FMT_SWAP_ENDIANNESS(YUV444P16);
1549 PIX_FMT_SWAP_ENDIANNESS(GBRP9);
1550 PIX_FMT_SWAP_ENDIANNESS(GBRP10);
1551 PIX_FMT_SWAP_ENDIANNESS(GBRP16);
1552 PIX_FMT_SWAP_ENDIANNESS(YUVA420P9);
1553 PIX_FMT_SWAP_ENDIANNESS(YUVA422P9);
1554 PIX_FMT_SWAP_ENDIANNESS(YUVA444P9);
1555 PIX_FMT_SWAP_ENDIANNESS(YUVA420P10);
1556 PIX_FMT_SWAP_ENDIANNESS(YUVA422P10);
1557 PIX_FMT_SWAP_ENDIANNESS(YUVA444P10);
1558 PIX_FMT_SWAP_ENDIANNESS(YUVA420P16);
1559 PIX_FMT_SWAP_ENDIANNESS(YUVA422P16);
1560 PIX_FMT_SWAP_ENDIANNESS(YUVA444P16);
1562 PIX_FMT_SWAP_ENDIANNESS(XYZ12);
1564 return AV_PIX_FMT_NONE;
1566 #undef PIX_FMT_SWAP_ENDIANNESS