]> git.sesse.net Git - ffmpeg/blob - libavutil/tests/pixfmt_best.c
avutil/pixdesc: Remove deprecated AV_PIX_FMT_FLAG_PSEUDOPAL
[ffmpeg] / libavutil / tests / pixfmt_best.c
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18
19 #include "libavutil/pixdesc.c"
20
21 static const enum AVPixelFormat pixfmt_list[] = {
22     AV_PIX_FMT_MONOWHITE,
23     AV_PIX_FMT_GRAY8,
24     AV_PIX_FMT_GRAY10,
25     AV_PIX_FMT_GRAY16,
26     AV_PIX_FMT_YUV420P,
27     AV_PIX_FMT_YUV420P10,
28     AV_PIX_FMT_YUV420P16,
29     AV_PIX_FMT_YUV422P,
30     AV_PIX_FMT_YUV422P10,
31     AV_PIX_FMT_YUV422P16,
32     AV_PIX_FMT_YUV444P,
33     AV_PIX_FMT_YUV444P10,
34     AV_PIX_FMT_YUV444P16,
35     AV_PIX_FMT_RGB565,
36     AV_PIX_FMT_RGB24,
37     AV_PIX_FMT_RGB48,
38     AV_PIX_FMT_VDPAU,
39     AV_PIX_FMT_VAAPI,
40 };
41
42 static enum AVPixelFormat find_best(enum AVPixelFormat pixfmt)
43 {
44     enum AVPixelFormat best = AV_PIX_FMT_NONE;
45     int i;
46     for (i = 0; i < FF_ARRAY_ELEMS(pixfmt_list); i++)
47         best = av_find_best_pix_fmt_of_2(best, pixfmt_list[i],
48                                          pixfmt, 0, NULL);
49     return best;
50 }
51
52 int main(void)
53 {
54     enum AVPixelFormat output;
55     int i, pass = 0, fail = 0;
56
57 #define TEST(input, expected) do {                              \
58         output = find_best(input);                              \
59         if (output != expected) {                               \
60             printf("Matching %s: got %s, expected %s\n",        \
61                    av_get_pix_fmt_name(input),                  \
62                    av_get_pix_fmt_name(output),                 \
63                    av_get_pix_fmt_name(expected));              \
64             ++fail;                                             \
65         } else                                                  \
66             ++pass;                                             \
67     } while (0)
68
69     // Same formats.
70     for (i = 0; i < FF_ARRAY_ELEMS(pixfmt_list); i++)
71         TEST(pixfmt_list[i], pixfmt_list[i]);
72
73     // Formats containing the same data in different layouts.
74     TEST(AV_PIX_FMT_MONOBLACK, AV_PIX_FMT_MONOWHITE);
75     TEST(AV_PIX_FMT_NV12,      AV_PIX_FMT_YUV420P);
76     TEST(AV_PIX_FMT_P010,      AV_PIX_FMT_YUV420P10);
77     TEST(AV_PIX_FMT_P016,      AV_PIX_FMT_YUV420P16);
78     TEST(AV_PIX_FMT_NV16,      AV_PIX_FMT_YUV422P);
79     TEST(AV_PIX_FMT_NV24,      AV_PIX_FMT_YUV444P);
80     TEST(AV_PIX_FMT_YUYV422,   AV_PIX_FMT_YUV422P);
81     TEST(AV_PIX_FMT_UYVY422,   AV_PIX_FMT_YUV422P);
82     TEST(AV_PIX_FMT_BGR565,    AV_PIX_FMT_RGB565);
83     TEST(AV_PIX_FMT_BGR24,     AV_PIX_FMT_RGB24);
84     TEST(AV_PIX_FMT_GBRP,      AV_PIX_FMT_RGB24);
85     TEST(AV_PIX_FMT_0RGB,      AV_PIX_FMT_RGB24);
86     TEST(AV_PIX_FMT_GBRP16,    AV_PIX_FMT_RGB48);
87
88     // Formats additionally containing alpha (here ignored).
89     TEST(AV_PIX_FMT_YA8,       AV_PIX_FMT_GRAY8);
90     TEST(AV_PIX_FMT_YA16,      AV_PIX_FMT_GRAY16);
91     TEST(AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUV420P);
92     TEST(AV_PIX_FMT_YUVA422P,  AV_PIX_FMT_YUV422P);
93     TEST(AV_PIX_FMT_YUVA444P,  AV_PIX_FMT_YUV444P);
94     TEST(AV_PIX_FMT_AYUV64,    AV_PIX_FMT_YUV444P16);
95     TEST(AV_PIX_FMT_RGBA,      AV_PIX_FMT_RGB24);
96     TEST(AV_PIX_FMT_ABGR,      AV_PIX_FMT_RGB24);
97     TEST(AV_PIX_FMT_GBRAP,     AV_PIX_FMT_RGB24);
98     TEST(AV_PIX_FMT_RGBA64,    AV_PIX_FMT_RGB48);
99     TEST(AV_PIX_FMT_BGRA64,    AV_PIX_FMT_RGB48);
100     TEST(AV_PIX_FMT_GBRAP16,   AV_PIX_FMT_RGB48);
101
102     // Formats requiring upsampling to represent exactly.
103     TEST(AV_PIX_FMT_GRAY12,    AV_PIX_FMT_GRAY16);
104     TEST(AV_PIX_FMT_YUV410P,   AV_PIX_FMT_YUV420P);
105     TEST(AV_PIX_FMT_YUV411P,   AV_PIX_FMT_YUV422P);
106     TEST(AV_PIX_FMT_UYYVYY411, AV_PIX_FMT_YUV422P);
107     TEST(AV_PIX_FMT_YUV440P,   AV_PIX_FMT_YUV444P);
108     TEST(AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV444P10);
109     TEST(AV_PIX_FMT_YUV440P12, AV_PIX_FMT_YUV444P16);
110     TEST(AV_PIX_FMT_YUV420P9,  AV_PIX_FMT_YUV420P10);
111     TEST(AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV420P16);
112     TEST(AV_PIX_FMT_YUV444P9,  AV_PIX_FMT_YUV444P10);
113     TEST(AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P16);
114     TEST(AV_PIX_FMT_BGR4,      AV_PIX_FMT_RGB565);
115     TEST(AV_PIX_FMT_RGB444,    AV_PIX_FMT_RGB565);
116     TEST(AV_PIX_FMT_RGB555,    AV_PIX_FMT_RGB565);
117     TEST(AV_PIX_FMT_GBRP10,    AV_PIX_FMT_RGB48);
118     TEST(AV_PIX_FMT_GBRAP10,   AV_PIX_FMT_RGB48);
119     TEST(AV_PIX_FMT_GBRAP12,   AV_PIX_FMT_RGB48);
120
121     // Formats containing the same data in different endianness.
122     TEST(AV_PIX_FMT_GRAY10BE,    AV_PIX_FMT_GRAY10);
123     TEST(AV_PIX_FMT_GRAY10LE,    AV_PIX_FMT_GRAY10);
124     TEST(AV_PIX_FMT_GRAY16BE,    AV_PIX_FMT_GRAY16);
125     TEST(AV_PIX_FMT_GRAY16LE,    AV_PIX_FMT_GRAY16);
126     TEST(AV_PIX_FMT_YUV422P10BE, AV_PIX_FMT_YUV422P10);
127     TEST(AV_PIX_FMT_YUV422P10LE, AV_PIX_FMT_YUV422P10);
128     TEST(AV_PIX_FMT_YUV444P16BE, AV_PIX_FMT_YUV444P16);
129     TEST(AV_PIX_FMT_YUV444P16LE, AV_PIX_FMT_YUV444P16);
130     TEST(AV_PIX_FMT_RGB565BE,    AV_PIX_FMT_RGB565);
131     TEST(AV_PIX_FMT_RGB565LE,    AV_PIX_FMT_RGB565);
132     TEST(AV_PIX_FMT_RGB48BE,     AV_PIX_FMT_RGB48);
133     TEST(AV_PIX_FMT_RGB48LE,     AV_PIX_FMT_RGB48);
134
135     // Opaque formats are least unlike each other.
136     TEST(AV_PIX_FMT_DXVA2_VLD, AV_PIX_FMT_VDPAU);
137
138     printf("%d tests passed, %d tests failed.\n", pass, fail);
139     return !!fail;
140 }