FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavutil/tests/pixfmt_best.c
Date: 2025-04-25 22:50:00
Exec Total Coverage
Lines: 116 118 98.3%
Functions: 7 7 100.0%
Branches: 21 22 95.5%

Line Branch Exec Source
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 const enum AVPixelFormat semiplanar_list[] = {
43 AV_PIX_FMT_P016,
44 AV_PIX_FMT_P012,
45 AV_PIX_FMT_P010,
46 AV_PIX_FMT_P216,
47 AV_PIX_FMT_P210,
48 AV_PIX_FMT_NV16,
49 AV_PIX_FMT_P416,
50 AV_PIX_FMT_P410,
51 AV_PIX_FMT_NV24,
52 AV_PIX_FMT_NV12,
53 };
54
55 static const enum AVPixelFormat packed_list[] = {
56 AV_PIX_FMT_XV48,
57 AV_PIX_FMT_XV36,
58 AV_PIX_FMT_XV30,
59 AV_PIX_FMT_VUYX,
60 AV_PIX_FMT_Y216,
61 AV_PIX_FMT_Y212,
62 AV_PIX_FMT_Y210,
63 AV_PIX_FMT_YUYV422,
64 };
65
66 static const enum AVPixelFormat subsampled_list[] = {
67 AV_PIX_FMT_YUV411P,
68 AV_PIX_FMT_YUV420P,
69 AV_PIX_FMT_YUV422P,
70 AV_PIX_FMT_YUV444P,
71 };
72
73 static const enum AVPixelFormat depthchroma_list[] = {
74 AV_PIX_FMT_YUV420P14,
75 AV_PIX_FMT_YUV422P14,
76 AV_PIX_FMT_YUV444P16,
77 };
78
79 typedef enum AVPixelFormat (*find_best_t)(enum AVPixelFormat pixfmt);
80
81 #define find_best_wrapper(name, list) \
82 static enum AVPixelFormat find_best_ ## name (enum AVPixelFormat pixfmt) \
83 { \
84 enum AVPixelFormat best = AV_PIX_FMT_NONE; \
85 int i; \
86 for (i = 0; i < FF_ARRAY_ELEMS(list); i++) \
87 best = av_find_best_pix_fmt_of_2(best, list[i], \
88 pixfmt, 0, NULL); \
89 return best; \
90 }
91
92
2/2
✓ Branch 1 taken 1548 times.
✓ Branch 2 taken 86 times.
1634 find_best_wrapper(base, pixfmt_list)
93
2/2
✓ Branch 1 taken 230 times.
✓ Branch 2 taken 23 times.
253 find_best_wrapper(seminplanar, semiplanar_list)
94
2/2
✓ Branch 1 taken 128 times.
✓ Branch 2 taken 16 times.
144 find_best_wrapper(packed, packed_list)
95
2/2
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 5 times.
25 find_best_wrapper(subsampled, subsampled_list)
96
2/2
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 5 times.
20 find_best_wrapper(depthchroma, depthchroma_list)
97
98 135 static void test(enum AVPixelFormat input, enum AVPixelFormat expected,
99 int *pass, int *fail, find_best_t find_best_fn)
100 {
101 135 enum AVPixelFormat output = find_best_fn(input);
102
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 135 times.
135 if (output != expected) {
103 printf("Matching %s: got %s, expected %s\n",
104 av_get_pix_fmt_name(input),
105 av_get_pix_fmt_name(output),
106 av_get_pix_fmt_name(expected));
107 ++(*fail);
108 } else
109 135 ++(*pass);
110 135 }
111
112 1 int main(void)
113 {
114 1 int i, pass = 0, fail = 0;
115
116 #define TEST(input, expected) \
117 test(input, expected, &pass, &fail, find_best_base)
118
119 // Same formats.
120
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1 times.
19 for (i = 0; i < FF_ARRAY_ELEMS(pixfmt_list); i++)
121 18 TEST(pixfmt_list[i], pixfmt_list[i]);
122
123 // Formats containing the same data in different layouts.
124 1 TEST(AV_PIX_FMT_MONOBLACK, AV_PIX_FMT_MONOWHITE);
125 1 TEST(AV_PIX_FMT_NV12, AV_PIX_FMT_YUV420P);
126 1 TEST(AV_PIX_FMT_P010, AV_PIX_FMT_YUV420P10);
127 1 TEST(AV_PIX_FMT_P012, AV_PIX_FMT_YUV420P16);
128 1 TEST(AV_PIX_FMT_P016, AV_PIX_FMT_YUV420P16);
129 1 TEST(AV_PIX_FMT_P210, AV_PIX_FMT_YUV422P10);
130 1 TEST(AV_PIX_FMT_P212, AV_PIX_FMT_YUV422P16);
131 1 TEST(AV_PIX_FMT_P216, AV_PIX_FMT_YUV422P16);
132 1 TEST(AV_PIX_FMT_P410, AV_PIX_FMT_YUV444P10);
133 1 TEST(AV_PIX_FMT_P412, AV_PIX_FMT_YUV444P16);
134 1 TEST(AV_PIX_FMT_P416, AV_PIX_FMT_YUV444P16);
135 1 TEST(AV_PIX_FMT_NV16, AV_PIX_FMT_YUV422P);
136 1 TEST(AV_PIX_FMT_NV20, AV_PIX_FMT_YUV422P10);
137 1 TEST(AV_PIX_FMT_NV24, AV_PIX_FMT_YUV444P);
138 1 TEST(AV_PIX_FMT_YUYV422, AV_PIX_FMT_YUV422P);
139 1 TEST(AV_PIX_FMT_UYVY422, AV_PIX_FMT_YUV422P);
140 1 TEST(AV_PIX_FMT_VYU444, AV_PIX_FMT_YUV444P);
141 1 TEST(AV_PIX_FMT_BGR565, AV_PIX_FMT_RGB565);
142 1 TEST(AV_PIX_FMT_BGR24, AV_PIX_FMT_RGB24);
143 1 TEST(AV_PIX_FMT_GBRP, AV_PIX_FMT_RGB24);
144 1 TEST(AV_PIX_FMT_0RGB, AV_PIX_FMT_RGB24);
145 1 TEST(AV_PIX_FMT_GBRP16, AV_PIX_FMT_RGB48);
146 1 TEST(AV_PIX_FMT_VUYX, AV_PIX_FMT_YUV444P);
147
148 // Formats additionally containing alpha (here ignored).
149 1 TEST(AV_PIX_FMT_YA8, AV_PIX_FMT_GRAY8);
150 1 TEST(AV_PIX_FMT_YA16, AV_PIX_FMT_GRAY16);
151 1 TEST(AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P);
152 1 TEST(AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P);
153 1 TEST(AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P);
154 1 TEST(AV_PIX_FMT_VUYA, AV_PIX_FMT_YUV444P);
155 1 TEST(AV_PIX_FMT_AYUV, AV_PIX_FMT_YUV444P);
156 1 TEST(AV_PIX_FMT_UYVA, AV_PIX_FMT_YUV444P);
157 1 TEST(AV_PIX_FMT_AYUV64, AV_PIX_FMT_YUV444P16);
158 1 TEST(AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB24);
159 1 TEST(AV_PIX_FMT_ABGR, AV_PIX_FMT_RGB24);
160 1 TEST(AV_PIX_FMT_GBRAP, AV_PIX_FMT_RGB24);
161 1 TEST(AV_PIX_FMT_RGBA64, AV_PIX_FMT_RGB48);
162 1 TEST(AV_PIX_FMT_BGRA64, AV_PIX_FMT_RGB48);
163 1 TEST(AV_PIX_FMT_GBRAP16, AV_PIX_FMT_RGB48);
164
165 // Formats requiring upsampling to represent exactly.
166 1 TEST(AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY16);
167 1 TEST(AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV420P);
168 1 TEST(AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P);
169 1 TEST(AV_PIX_FMT_UYYVYY411, AV_PIX_FMT_YUV422P);
170 1 TEST(AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P);
171 1 TEST(AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV444P10);
172 1 TEST(AV_PIX_FMT_YUV440P12, AV_PIX_FMT_YUV444P16);
173 1 TEST(AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10);
174 1 TEST(AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV420P16);
175 1 TEST(AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10);
176 1 TEST(AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P16);
177 1 TEST(AV_PIX_FMT_BGR4, AV_PIX_FMT_RGB565);
178 1 TEST(AV_PIX_FMT_RGB444, AV_PIX_FMT_RGB565);
179 1 TEST(AV_PIX_FMT_RGB555, AV_PIX_FMT_RGB565);
180 1 TEST(AV_PIX_FMT_GBRP10, AV_PIX_FMT_RGB48);
181 1 TEST(AV_PIX_FMT_GBRAP10, AV_PIX_FMT_RGB48);
182 1 TEST(AV_PIX_FMT_GBRAP12, AV_PIX_FMT_RGB48);
183
184 // Formats containing the same data in different endianness.
185 1 TEST(AV_PIX_FMT_GRAY10BE, AV_PIX_FMT_GRAY10);
186 1 TEST(AV_PIX_FMT_GRAY10LE, AV_PIX_FMT_GRAY10);
187 1 TEST(AV_PIX_FMT_GRAY16BE, AV_PIX_FMT_GRAY16);
188 1 TEST(AV_PIX_FMT_GRAY16LE, AV_PIX_FMT_GRAY16);
189 1 TEST(AV_PIX_FMT_YUV422P10BE, AV_PIX_FMT_YUV422P10);
190 1 TEST(AV_PIX_FMT_YUV422P10LE, AV_PIX_FMT_YUV422P10);
191 1 TEST(AV_PIX_FMT_YUV444P16BE, AV_PIX_FMT_YUV444P16);
192 1 TEST(AV_PIX_FMT_YUV444P16LE, AV_PIX_FMT_YUV444P16);
193 1 TEST(AV_PIX_FMT_RGB565BE, AV_PIX_FMT_RGB565);
194 1 TEST(AV_PIX_FMT_RGB565LE, AV_PIX_FMT_RGB565);
195 1 TEST(AV_PIX_FMT_RGB48BE, AV_PIX_FMT_RGB48);
196 1 TEST(AV_PIX_FMT_RGB48LE, AV_PIX_FMT_RGB48);
197
198 // Opaque formats are least unlike each other.
199 1 TEST(AV_PIX_FMT_DXVA2_VLD, AV_PIX_FMT_VDPAU);
200
201 #define TEST_SEMIPLANAR(input, expected) \
202 test(input, expected, &pass, &fail, find_best_seminplanar)
203
204 // Same formats.
205
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1 times.
11 for (i = 0; i < FF_ARRAY_ELEMS(semiplanar_list); i++)
206 10 TEST_SEMIPLANAR(semiplanar_list[i], semiplanar_list[i]);
207
208 // Formats containing the same data in different layouts.
209 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV420P, AV_PIX_FMT_NV12);
210 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV420P10, AV_PIX_FMT_P010);
211 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV420P12, AV_PIX_FMT_P012);
212 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV420P16, AV_PIX_FMT_P016);
213 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV420P9, AV_PIX_FMT_P010);
214 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV422P, AV_PIX_FMT_NV16);
215 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV422P10, AV_PIX_FMT_P210);
216 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV422P12, AV_PIX_FMT_P216);
217 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV422P16, AV_PIX_FMT_P216);
218 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV444P, AV_PIX_FMT_NV24);
219 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV444P10, AV_PIX_FMT_P410);
220 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV444P12, AV_PIX_FMT_P416);
221 1 TEST_SEMIPLANAR(AV_PIX_FMT_YUV444P16, AV_PIX_FMT_P416);
222
223 #define TEST_PACKED(input, expected) \
224 test(input, expected, &pass, &fail, find_best_packed)
225
226 // Same formats.
227
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 times.
9 for (i = 0; i < FF_ARRAY_ELEMS(packed_list); i++)
228 8 TEST_PACKED(packed_list[i], packed_list[i]);
229
230 // Formats containing the same data in different layouts.
231 1 TEST_PACKED(AV_PIX_FMT_YUV444P, AV_PIX_FMT_VUYX);
232 1 TEST_PACKED(AV_PIX_FMT_YUV444P10, AV_PIX_FMT_XV30);
233 1 TEST_PACKED(AV_PIX_FMT_YUV444P12, AV_PIX_FMT_XV36);
234 1 TEST_PACKED(AV_PIX_FMT_YUV444P16, AV_PIX_FMT_XV48);
235 1 TEST_PACKED(AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUYV422);
236 1 TEST_PACKED(AV_PIX_FMT_YUV422P10, AV_PIX_FMT_Y210);
237 1 TEST_PACKED(AV_PIX_FMT_YUV422P12, AV_PIX_FMT_Y212);
238 1 TEST_PACKED(AV_PIX_FMT_YUV422P16, AV_PIX_FMT_Y216);
239
240 #define TEST_SUBSAMPLED(input, expected) \
241 test(input, expected, &pass, &fail, find_best_subsampled)
242
243 // Same formats.
244
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (i = 0; i < FF_ARRAY_ELEMS(subsampled_list); i++)
245 4 TEST_SUBSAMPLED(subsampled_list[i], subsampled_list[i]);
246
247 1 TEST_SUBSAMPLED(AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV420P);
248
249 #define TEST_DEPTH_CHROMA(input, expected) \
250 test(input, expected, &pass, &fail, find_best_depthchroma)
251
252 // Same formats.
253
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 for (i = 0; i < FF_ARRAY_ELEMS(depthchroma_list); i++)
254 3 TEST_DEPTH_CHROMA(depthchroma_list[i], depthchroma_list[i]);
255
256 1 TEST_DEPTH_CHROMA(AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV444P16);
257 1 TEST_DEPTH_CHROMA(AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16);
258
259
260 1 printf("%d tests passed, %d tests failed.\n", pass, fail);
261 1 return !!fail;
262 }
263