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,
796 [AV_PIX_FMT_VDPAU_H264] = {
797 .name = "vdpau_h264",
800 .flags = AV_PIX_FMT_FLAG_HWACCEL,
802 [AV_PIX_FMT_VDPAU_MPEG1] = {
803 .name = "vdpau_mpeg1",
806 .flags = AV_PIX_FMT_FLAG_HWACCEL,
808 [AV_PIX_FMT_VDPAU_MPEG2] = {
809 .name = "vdpau_mpeg2",
812 .flags = AV_PIX_FMT_FLAG_HWACCEL,
814 [AV_PIX_FMT_VDPAU_WMV3] = {
815 .name = "vdpau_wmv3",
818 .flags = AV_PIX_FMT_FLAG_HWACCEL,
820 [AV_PIX_FMT_VDPAU_VC1] = {
824 .flags = AV_PIX_FMT_FLAG_HWACCEL,
826 [AV_PIX_FMT_VDPAU_MPEG4] = {
827 .name = "vdpau_mpeg4",
830 .flags = AV_PIX_FMT_FLAG_HWACCEL,
832 [AV_PIX_FMT_RGB48BE] = {
838 { 0, 5, 1, 0, 15 }, /* R */
839 { 0, 5, 3, 0, 15 }, /* G */
840 { 0, 5, 5, 0, 15 }, /* B */
842 .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
844 [AV_PIX_FMT_RGB48LE] = {
850 { 0, 5, 1, 0, 15 }, /* R */
851 { 0, 5, 3, 0, 15 }, /* G */
852 { 0, 5, 5, 0, 15 }, /* B */
854 .flags = AV_PIX_FMT_FLAG_RGB,
856 [AV_PIX_FMT_RGB565BE] = {
862 { 0, 1, 0, 3, 4 }, /* R */
863 { 0, 1, 1, 5, 5 }, /* G */
864 { 0, 1, 1, 0, 4 }, /* B */
866 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
868 [AV_PIX_FMT_RGB565LE] = {
874 { 0, 1, 2, 3, 4 }, /* R */
875 { 0, 1, 1, 5, 5 }, /* G */
876 { 0, 1, 1, 0, 4 }, /* B */
878 .flags = AV_PIX_FMT_FLAG_RGB,
880 [AV_PIX_FMT_RGB555BE] = {
886 { 0, 1, 0, 2, 4 }, /* R */
887 { 0, 1, 1, 5, 4 }, /* G */
888 { 0, 1, 1, 0, 4 }, /* B */
890 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
892 [AV_PIX_FMT_RGB555LE] = {
898 { 0, 1, 2, 2, 4 }, /* R */
899 { 0, 1, 1, 5, 4 }, /* G */
900 { 0, 1, 1, 0, 4 }, /* B */
902 .flags = AV_PIX_FMT_FLAG_RGB,
904 [AV_PIX_FMT_RGB444BE] = {
910 { 0, 1, 0, 0, 3 }, /* R */
911 { 0, 1, 1, 4, 3 }, /* G */
912 { 0, 1, 1, 0, 3 }, /* B */
914 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
916 [AV_PIX_FMT_RGB444LE] = {
922 { 0, 1, 2, 0, 3 }, /* R */
923 { 0, 1, 1, 4, 3 }, /* G */
924 { 0, 1, 1, 0, 3 }, /* B */
926 .flags = AV_PIX_FMT_FLAG_RGB,
928 [AV_PIX_FMT_BGR48BE] = {
934 { 0, 5, 1, 0, 15 }, /* B */
935 { 0, 5, 3, 0, 15 }, /* G */
936 { 0, 5, 5, 0, 15 }, /* R */
938 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
940 [AV_PIX_FMT_BGR48LE] = {
946 { 0, 5, 1, 0, 15 }, /* B */
947 { 0, 5, 3, 0, 15 }, /* G */
948 { 0, 5, 5, 0, 15 }, /* R */
950 .flags = AV_PIX_FMT_FLAG_RGB,
952 [AV_PIX_FMT_BGR565BE] = {
958 { 0, 1, 0, 3, 4 }, /* B */
959 { 0, 1, 1, 5, 5 }, /* G */
960 { 0, 1, 1, 0, 4 }, /* R */
962 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
964 [AV_PIX_FMT_BGR565LE] = {
970 { 0, 1, 2, 3, 4 }, /* B */
971 { 0, 1, 1, 5, 5 }, /* G */
972 { 0, 1, 1, 0, 4 }, /* R */
974 .flags = AV_PIX_FMT_FLAG_RGB,
976 [AV_PIX_FMT_BGR555BE] = {
982 { 0, 1, 0, 2, 4 }, /* B */
983 { 0, 1, 1, 5, 4 }, /* G */
984 { 0, 1, 1, 0, 4 }, /* R */
986 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
988 [AV_PIX_FMT_BGR555LE] = {
994 { 0, 1, 2, 2, 4 }, /* B */
995 { 0, 1, 1, 5, 4 }, /* G */
996 { 0, 1, 1, 0, 4 }, /* R */
998 .flags = AV_PIX_FMT_FLAG_RGB,
1000 [AV_PIX_FMT_BGR444BE] = {
1006 { 0, 1, 0, 0, 3 }, /* B */
1007 { 0, 1, 1, 4, 3 }, /* G */
1008 { 0, 1, 1, 0, 3 }, /* R */
1010 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_RGB,
1012 [AV_PIX_FMT_BGR444LE] = {
1018 { 0, 1, 2, 0, 3 }, /* B */
1019 { 0, 1, 1, 4, 3 }, /* G */
1020 { 0, 1, 1, 0, 3 }, /* R */
1022 .flags = AV_PIX_FMT_FLAG_RGB,
1024 [AV_PIX_FMT_VAAPI_MOCO] = {
1025 .name = "vaapi_moco",
1028 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1030 [AV_PIX_FMT_VAAPI_IDCT] = {
1031 .name = "vaapi_idct",
1034 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1036 [AV_PIX_FMT_VAAPI_VLD] = {
1037 .name = "vaapi_vld",
1040 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1042 [AV_PIX_FMT_VDA_VLD] = {
1046 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1048 [AV_PIX_FMT_YUV420P9LE] = {
1049 .name = "yuv420p9le",
1054 { 0, 1, 1, 0, 8 }, /* Y */
1055 { 1, 1, 1, 0, 8 }, /* U */
1056 { 2, 1, 1, 0, 8 }, /* V */
1058 .flags = AV_PIX_FMT_FLAG_PLANAR,
1060 [AV_PIX_FMT_YUV420P9BE] = {
1061 .name = "yuv420p9be",
1066 { 0, 1, 1, 0, 8 }, /* Y */
1067 { 1, 1, 1, 0, 8 }, /* U */
1068 { 2, 1, 1, 0, 8 }, /* V */
1070 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1072 [AV_PIX_FMT_YUV420P10LE] = {
1073 .name = "yuv420p10le",
1078 { 0, 1, 1, 0, 9 }, /* Y */
1079 { 1, 1, 1, 0, 9 }, /* U */
1080 { 2, 1, 1, 0, 9 }, /* V */
1082 .flags = AV_PIX_FMT_FLAG_PLANAR,
1084 [AV_PIX_FMT_YUV420P10BE] = {
1085 .name = "yuv420p10be",
1090 { 0, 1, 1, 0, 9 }, /* Y */
1091 { 1, 1, 1, 0, 9 }, /* U */
1092 { 2, 1, 1, 0, 9 }, /* V */
1094 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1096 [AV_PIX_FMT_YUV420P16LE] = {
1097 .name = "yuv420p16le",
1102 { 0, 1, 1, 0, 15 }, /* Y */
1103 { 1, 1, 1, 0, 15 }, /* U */
1104 { 2, 1, 1, 0, 15 }, /* V */
1106 .flags = AV_PIX_FMT_FLAG_PLANAR,
1108 [AV_PIX_FMT_YUV420P16BE] = {
1109 .name = "yuv420p16be",
1114 { 0, 1, 1, 0, 15 }, /* Y */
1115 { 1, 1, 1, 0, 15 }, /* U */
1116 { 2, 1, 1, 0, 15 }, /* V */
1118 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1120 [AV_PIX_FMT_YUV422P9LE] = {
1121 .name = "yuv422p9le",
1126 { 0, 1, 1, 0, 8 }, /* Y */
1127 { 1, 1, 1, 0, 8 }, /* U */
1128 { 2, 1, 1, 0, 8 }, /* V */
1130 .flags = AV_PIX_FMT_FLAG_PLANAR,
1132 [AV_PIX_FMT_YUV422P9BE] = {
1133 .name = "yuv422p9be",
1138 { 0, 1, 1, 0, 8 }, /* Y */
1139 { 1, 1, 1, 0, 8 }, /* U */
1140 { 2, 1, 1, 0, 8 }, /* V */
1142 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1144 [AV_PIX_FMT_YUV422P10LE] = {
1145 .name = "yuv422p10le",
1150 { 0, 1, 1, 0, 9 }, /* Y */
1151 { 1, 1, 1, 0, 9 }, /* U */
1152 { 2, 1, 1, 0, 9 }, /* V */
1154 .flags = AV_PIX_FMT_FLAG_PLANAR,
1156 [AV_PIX_FMT_YUV422P10BE] = {
1157 .name = "yuv422p10be",
1162 { 0, 1, 1, 0, 9 }, /* Y */
1163 { 1, 1, 1, 0, 9 }, /* U */
1164 { 2, 1, 1, 0, 9 }, /* V */
1166 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1168 [AV_PIX_FMT_YUV422P16LE] = {
1169 .name = "yuv422p16le",
1174 { 0, 1, 1, 0, 15 }, /* Y */
1175 { 1, 1, 1, 0, 15 }, /* U */
1176 { 2, 1, 1, 0, 15 }, /* V */
1178 .flags = AV_PIX_FMT_FLAG_PLANAR,
1180 [AV_PIX_FMT_YUV422P16BE] = {
1181 .name = "yuv422p16be",
1186 { 0, 1, 1, 0, 15 }, /* Y */
1187 { 1, 1, 1, 0, 15 }, /* U */
1188 { 2, 1, 1, 0, 15 }, /* V */
1190 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1192 [AV_PIX_FMT_YUV444P16LE] = {
1193 .name = "yuv444p16le",
1198 { 0, 1, 1, 0, 15 }, /* Y */
1199 { 1, 1, 1, 0, 15 }, /* U */
1200 { 2, 1, 1, 0, 15 }, /* V */
1202 .flags = AV_PIX_FMT_FLAG_PLANAR,
1204 [AV_PIX_FMT_YUV444P16BE] = {
1205 .name = "yuv444p16be",
1210 { 0, 1, 1, 0, 15 }, /* Y */
1211 { 1, 1, 1, 0, 15 }, /* U */
1212 { 2, 1, 1, 0, 15 }, /* V */
1214 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1216 [AV_PIX_FMT_YUV444P10LE] = {
1217 .name = "yuv444p10le",
1222 { 0, 1, 1, 0, 9 }, /* Y */
1223 { 1, 1, 1, 0, 9 }, /* U */
1224 { 2, 1, 1, 0, 9 }, /* V */
1226 .flags = AV_PIX_FMT_FLAG_PLANAR,
1228 [AV_PIX_FMT_YUV444P10BE] = {
1229 .name = "yuv444p10be",
1234 { 0, 1, 1, 0, 9 }, /* Y */
1235 { 1, 1, 1, 0, 9 }, /* U */
1236 { 2, 1, 1, 0, 9 }, /* V */
1238 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1240 [AV_PIX_FMT_YUV444P9LE] = {
1241 .name = "yuv444p9le",
1246 { 0, 1, 1, 0, 8 }, /* Y */
1247 { 1, 1, 1, 0, 8 }, /* U */
1248 { 2, 1, 1, 0, 8 }, /* V */
1250 .flags = AV_PIX_FMT_FLAG_PLANAR,
1252 [AV_PIX_FMT_YUV444P9BE] = {
1253 .name = "yuv444p9be",
1258 { 0, 1, 1, 0, 8 }, /* Y */
1259 { 1, 1, 1, 0, 8 }, /* U */
1260 { 2, 1, 1, 0, 8 }, /* V */
1262 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
1264 [AV_PIX_FMT_DXVA2_VLD] = {
1265 .name = "dxva2_vld",
1268 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1270 [AV_PIX_FMT_Y400A] = {
1274 { 0, 1, 1, 0, 7 }, /* Y */
1275 { 0, 1, 2, 0, 7 }, /* A */
1277 .flags = AV_PIX_FMT_FLAG_ALPHA,
1279 [AV_PIX_FMT_GBRP] = {
1285 { 0, 0, 1, 0, 7 }, /* G */
1286 { 1, 0, 1, 0, 7 }, /* B */
1287 { 2, 0, 1, 0, 7 }, /* R */
1289 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1291 [AV_PIX_FMT_GBRP9LE] = {
1297 { 0, 1, 1, 0, 8 }, /* G */
1298 { 1, 1, 1, 0, 8 }, /* B */
1299 { 2, 1, 1, 0, 8 }, /* R */
1301 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1303 [AV_PIX_FMT_GBRP9BE] = {
1309 { 0, 1, 1, 0, 8 }, /* G */
1310 { 1, 1, 1, 0, 8 }, /* B */
1311 { 2, 1, 1, 0, 8 }, /* R */
1313 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1315 [AV_PIX_FMT_GBRP10LE] = {
1321 { 0, 1, 1, 0, 9 }, /* G */
1322 { 1, 1, 1, 0, 9 }, /* B */
1323 { 2, 1, 1, 0, 9 }, /* R */
1325 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1327 [AV_PIX_FMT_GBRP10BE] = {
1333 { 0, 1, 1, 0, 9 }, /* G */
1334 { 1, 1, 1, 0, 9 }, /* B */
1335 { 2, 1, 1, 0, 9 }, /* R */
1337 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1339 [AV_PIX_FMT_GBRP16LE] = {
1345 { 0, 1, 1, 0, 15 }, /* G */
1346 { 1, 1, 1, 0, 15 }, /* B */
1347 { 2, 1, 1, 0, 15 }, /* R */
1349 .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1351 [AV_PIX_FMT_GBRP16BE] = {
1357 { 0, 1, 1, 0, 15 }, /* G */
1358 { 1, 1, 1, 0, 15 }, /* B */
1359 { 2, 1, 1, 0, 15 }, /* R */
1361 .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
1363 [AV_PIX_FMT_VDPAU] = {
1367 .flags = AV_PIX_FMT_FLAG_HWACCEL,
1369 [AV_PIX_FMT_XYZ12LE] = {
1375 { 0, 5, 1, 4, 11 }, /* X */
1376 { 0, 5, 3, 4, 11 }, /* Y */
1377 { 0, 5, 5, 4, 11 }, /* Z */
1379 /*.flags = -- not used*/
1381 [AV_PIX_FMT_XYZ12BE] = {
1387 { 0, 5, 1, 4, 11 }, /* X */
1388 { 0, 5, 3, 4, 11 }, /* Y */
1389 { 0, 5, 5, 4, 11 }, /* Z */
1391 .flags = AV_PIX_FMT_FLAG_BE,
1395 FF_DISABLE_DEPRECATION_WARNINGS
1396 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1398 enum AVPixelFormat pix_fmt;
1400 for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1401 if (av_pix_fmt_descriptors[pix_fmt].name &&
1402 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1405 return AV_PIX_FMT_NONE;
1408 const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
1410 return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1411 av_pix_fmt_descriptors[pix_fmt].name : NULL;
1415 # define X_NE(be, le) be
1417 # define X_NE(be, le) le
1420 enum AVPixelFormat av_get_pix_fmt(const char *name)
1422 enum AVPixelFormat pix_fmt;
1424 if (!strcmp(name, "rgb32"))
1425 name = X_NE("argb", "bgra");
1426 else if (!strcmp(name, "bgr32"))
1427 name = X_NE("abgr", "rgba");
1429 pix_fmt = get_pix_fmt_internal(name);
1430 if (pix_fmt == AV_PIX_FMT_NONE) {
1433 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1434 pix_fmt = get_pix_fmt_internal(name2);
1439 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
1442 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1444 for (c = 0; c < pixdesc->nb_components; c++) {
1445 int s = c == 1 || c == 2 ? 0 : log2_pixels;
1446 bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1449 return bits >> log2_pixels;
1452 char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt)
1456 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1458 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1459 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1460 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1466 const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
1468 if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
1470 return &av_pix_fmt_descriptors[pix_fmt];
1473 const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
1476 return &av_pix_fmt_descriptors[0];
1477 if (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1)
1482 enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
1484 if (desc < av_pix_fmt_descriptors ||
1485 desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
1486 return AV_PIX_FMT_NONE;
1488 return desc - av_pix_fmt_descriptors;
1490 FF_ENABLE_DEPRECATION_WARNINGS
1492 int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
1493 int *h_shift, int *v_shift)
1495 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1497 return AVERROR(ENOSYS);
1498 *h_shift = desc->log2_chroma_w;
1499 *v_shift = desc->log2_chroma_h;
1504 int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
1506 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
1507 int i, planes[4] = { 0 }, ret = 0;
1510 return AVERROR(EINVAL);
1512 for (i = 0; i < desc->nb_components; i++)
1513 planes[desc->comp[i].plane] = 1;
1514 for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
1520 enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt)
1522 #define PIX_FMT_SWAP_ENDIANNESS(fmt) \
1523 case AV_PIX_FMT_ ## fmt ## BE: return AV_PIX_FMT_ ## fmt ## LE; \
1524 case AV_PIX_FMT_ ## fmt ## LE: return AV_PIX_FMT_ ## fmt ## BE
1527 PIX_FMT_SWAP_ENDIANNESS(GRAY16);
1528 PIX_FMT_SWAP_ENDIANNESS(RGB48);
1529 PIX_FMT_SWAP_ENDIANNESS(RGB565);
1530 PIX_FMT_SWAP_ENDIANNESS(RGB555);
1531 PIX_FMT_SWAP_ENDIANNESS(RGB444);
1532 PIX_FMT_SWAP_ENDIANNESS(BGR48);
1533 PIX_FMT_SWAP_ENDIANNESS(BGR565);
1534 PIX_FMT_SWAP_ENDIANNESS(BGR555);
1535 PIX_FMT_SWAP_ENDIANNESS(BGR444);
1537 PIX_FMT_SWAP_ENDIANNESS(YUV420P9);
1538 PIX_FMT_SWAP_ENDIANNESS(YUV422P9);
1539 PIX_FMT_SWAP_ENDIANNESS(YUV444P9);
1540 PIX_FMT_SWAP_ENDIANNESS(YUV420P10);
1541 PIX_FMT_SWAP_ENDIANNESS(YUV422P10);
1542 PIX_FMT_SWAP_ENDIANNESS(YUV444P10);
1543 PIX_FMT_SWAP_ENDIANNESS(YUV420P16);
1544 PIX_FMT_SWAP_ENDIANNESS(YUV422P16);
1545 PIX_FMT_SWAP_ENDIANNESS(YUV444P16);
1547 PIX_FMT_SWAP_ENDIANNESS(GBRP9);
1548 PIX_FMT_SWAP_ENDIANNESS(GBRP10);
1549 PIX_FMT_SWAP_ENDIANNESS(GBRP16);
1550 PIX_FMT_SWAP_ENDIANNESS(YUVA420P9);
1551 PIX_FMT_SWAP_ENDIANNESS(YUVA422P9);
1552 PIX_FMT_SWAP_ENDIANNESS(YUVA444P9);
1553 PIX_FMT_SWAP_ENDIANNESS(YUVA420P10);
1554 PIX_FMT_SWAP_ENDIANNESS(YUVA422P10);
1555 PIX_FMT_SWAP_ENDIANNESS(YUVA444P10);
1556 PIX_FMT_SWAP_ENDIANNESS(YUVA420P16);
1557 PIX_FMT_SWAP_ENDIANNESS(YUVA422P16);
1558 PIX_FMT_SWAP_ENDIANNESS(YUVA444P16);
1560 PIX_FMT_SWAP_ENDIANNESS(XYZ12);
1562 return AV_PIX_FMT_NONE;
1564 #undef PIX_FMT_SWAP_ENDIANNESS