FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavutil/tests/parseutils.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 75 77 97.4%
Functions: 8 8 100.0%
Branches: 26 28 92.9%

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 #define TEST
20 #include "libavutil/parseutils.c"
21
22 #include <stdint.h>
23 #include <stdio.h>
24
25 #include "libavutil/common.h"
26 #include "libavutil/log.h"
27 #include "libavutil/rational.h"
28
29 static uint32_t randomv = MKTAG('L','A','V','U');
30
31 3 static uint32_t av_get_random_seed_deterministic(void)
32 {
33 3 return randomv = randomv * 1664525 + 1013904223;
34 }
35
36 1 static void test_av_parse_video_rate(void)
37 {
38 int i;
39 static const char *const rates[] = {
40 "-inf",
41 "inf",
42 "nan",
43 "123/0",
44 "-123 / 0",
45 "",
46 "/",
47 " 123 / 321",
48 "foo/foo",
49 "foo/1",
50 "1/foo",
51 "0/0",
52 "/0",
53 "1/",
54 "1",
55 "0",
56 "-123/123",
57 "-foo",
58 "123.23",
59 ".23",
60 "-.23",
61 "-0.234",
62 "-0.0000001",
63 " 21332.2324 ",
64 " -21332.2324 ",
65 };
66
67
2/2
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 1 times.
26 for (i = 0; i < FF_ARRAY_ELEMS(rates); i++) {
68 int ret;
69 25 AVRational q = { 0, 0 };
70 25 ret = av_parse_video_rate(&q, rates[i]);
71
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 5 times.
25 printf("'%s' -> %d/%d %s\n",
72 25 rates[i], q.num, q.den, ret ? "ERROR" : "OK");
73 }
74 1 }
75
76 1 static void test_av_parse_color(void)
77 {
78 int i;
79 uint8_t rgba[4];
80 static const char *const color_names[] = {
81 "bikeshed",
82 "RaNdOm",
83 "foo",
84 "red",
85 "Red ",
86 "RED",
87 "Violet",
88 "Yellow",
89 "Red",
90 "0x000000",
91 "0x0000000",
92 "0xff000000",
93 "0x3e34ff",
94 "0x3e34ffaa",
95 "0xffXXee",
96 "0xfoobar",
97 "0xffffeeeeeeee",
98 "#ff0000",
99 "#ffXX00",
100 "ff0000",
101 "ffXX00",
102 "red@foo",
103 "random@10",
104 "0xff0000@1.0",
105 "red@",
106 "red@0xfff",
107 "red@0xf",
108 "red@2",
109 "red@0.1",
110 "red@-1",
111 "red@0.5",
112 "red@1.0",
113 "red@256",
114 "red@10foo",
115 "red@-1.0",
116 "red@-0.0",
117 };
118
119 1 av_log_set_level(AV_LOG_DEBUG);
120
121
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 1 times.
37 for (i = 0; i < FF_ARRAY_ELEMS(color_names); i++) {
122
2/2
✓ Branch 1 taken 19 times.
✓ Branch 2 taken 17 times.
36 if (av_parse_color(rgba, color_names[i], -1, NULL) >= 0)
123 19 printf("%s -> R(%d) G(%d) B(%d) A(%d)\n",
124 19 color_names[i], rgba[0], rgba[1], rgba[2], rgba[3]);
125 else
126 17 printf("%s -> error\n", color_names[i]);
127 }
128 1 }
129
130 1 static void test_av_small_strptime(void)
131 {
132 int i;
133 1 struct tm tm = { 0 };
134 struct fmt_timespec_entry {
135 const char *fmt, *timespec;
136 1 } fmt_timespec_entries[] = {
137 { "%Y-%m-%d", "2012-12-21" },
138 { "%Y - %m - %d", "2012-12-21" },
139 { "%Y-%m-%d %H:%M:%S", "2012-12-21 20:12:21" },
140 { " %Y - %m - %d %H : %M : %S", " 2012 - 12 - 21 20 : 12 : 21" },
141 { " %Y - %b - %d %H : %M : %S", " 2012 - nOV - 21 20 : 12 : 21" },
142 { " %Y - %B - %d %H : %M : %S", " 2012 - nOVemBeR - 21 20 : 12 : 21" },
143 { " %Y - %B%d %H : %M : %S", " 2012 - may21 20 : 12 : 21" },
144 { " %Y - %B%d %H : %M : %S", " 2012 - mby21 20 : 12 : 21" },
145 { " %Y - %B - %d %H : %M : %S", " 2012 - JunE - 21 20 : 12 : 21" },
146 { " %Y - %B - %d %H : %M : %S", " 2012 - Jane - 21 20 : 12 : 21" },
147 { " %Y - %B - %d %H : %M : %S", " 2012 - January - 21 20 : 12 : 21" },
148 };
149
150 1 av_log_set_level(AV_LOG_DEBUG);
151
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 1 times.
12 for (i = 0; i < FF_ARRAY_ELEMS(fmt_timespec_entries); i++) {
152 char *p;
153 11 struct fmt_timespec_entry *e = &fmt_timespec_entries[i];
154 11 printf("fmt:'%s' spec:'%s' -> ", e->fmt, e->timespec);
155 11 p = av_small_strptime(e->timespec, e->fmt, &tm);
156
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 2 times.
11 if (p) {
157 9 printf("%04d-%02d-%2d %02d:%02d:%02d\n",
158 9 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
159 tm.tm_hour, tm.tm_min, tm.tm_sec);
160 } else {
161 2 printf("error\n");
162 }
163 }
164 1 }
165
166 1 static void test_av_parse_time(void)
167 {
168 int i;
169 int64_t tv;
170 time_t tvi;
171 struct tm *tm;
172 static char tzstr[] = "TZ=CET-1";
173 static const char * const time_string[] = {
174 "now",
175 "12:35:46",
176 "2000-12-20 0:02:47.5z",
177 "2012 - 02-22 17:44:07",
178 "2000-12-20T010247.6",
179 "2000-12-12 1:35:46+05:30",
180 "2002-12-12 22:30:40-02",
181 };
182 static const char * const duration_string[] = {
183 "2:34:56.79",
184 "-1:23:45.67",
185 "42.1729",
186 "-1729.42",
187 "12:34",
188 "2147483648s",
189 "4294967296ms",
190 "8589934592us",
191 "9223372036854775808us",
192 };
193
194 1 av_log_set_level(AV_LOG_DEBUG);
195 1 putenv(tzstr);
196 1 printf("(now is 2012-03-17 09:14:13.2 +0100, local time is UTC+1)\n");
197
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1 times.
8 for (i = 0; i < FF_ARRAY_ELEMS(time_string); i++) {
198 7 printf("%-24s -> ", time_string[i]);
199
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 if (av_parse_time(&tv, time_string[i], 0)) {
200 printf("error\n");
201 } else {
202 7 tvi = tv / 1000000;
203 7 tm = gmtime(&tvi);
204 7 printf("%14"PRIi64".%06d = %04d-%02d-%02dT%02d:%02d:%02dZ\n",
205 7 tv / 1000000, (int)(tv % 1000000),
206 7 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
207 tm->tm_hour, tm->tm_min, tm->tm_sec);
208 }
209 }
210
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 times.
10 for (i = 0; i < FF_ARRAY_ELEMS(duration_string); i++) {
211 9 printf("%-24s -> ", duration_string[i]);
212
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 8 times.
9 if (av_parse_time(&tv, duration_string[i], 1)) {
213 1 printf("error\n");
214 } else {
215 8 printf("%+21"PRIi64"\n", tv);
216 }
217 }
218 1 }
219
220 1 static void test_av_get_known_color_name(void)
221 {
222 int i;
223 const uint8_t *rgba;
224 const char *color;
225
226
2/2
✓ Branch 0 taken 140 times.
✓ Branch 1 taken 1 times.
141 for (i = 0; i < FF_ARRAY_ELEMS(color_table); ++i) {
227 140 color = av_get_known_color_name(i, &rgba);
228
1/2
✓ Branch 0 taken 140 times.
✗ Branch 1 not taken.
140 if (color)
229 140 printf("%s -> R(%d) G(%d) B(%d) A(%d)\n",
230 140 color, rgba[0], rgba[1], rgba[2], rgba[3]);
231 else
232 printf("Color ID: %d not found\n", i);
233 }
234 1 }
235
236 1 static void test_av_find_info_tag(void)
237 {
238 static const char args[] = "?tag1=val1&tag2=val2&tag3=val3&tag41=value 41&tag42=random1";
239 static const char *tags[] = {"tag1", "tag2", "tag3", "tag4", "tag41", "41", "random1"};
240 char buff[16];
241 int i;
242
243
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1 times.
8 for (i = 0; i < FF_ARRAY_ELEMS(tags); ++i) {
244
2/2
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 3 times.
7 if (av_find_info_tag(buff, sizeof(buff), tags[i], args))
245 4 printf("%d. %s found: %s\n", i, tags[i], buff);
246 else
247 3 printf("%d. %s not found\n", i, tags[i]);
248 }
249 1 }
250
251 1 int main(void)
252 {
253 1 printf("Testing av_parse_video_rate()\n");
254 1 test_av_parse_video_rate();
255
256 1 printf("\nTesting av_parse_color()\n");
257 1 test_av_parse_color();
258
259 1 printf("\nTesting av_small_strptime()\n");
260 1 test_av_small_strptime();
261
262 1 printf("\nTesting av_parse_time()\n");
263 1 test_av_parse_time();
264
265 1 printf("\nTesting av_get_known_color_name()\n");
266 1 test_av_get_known_color_name();
267
268 1 printf("\nTesting av_find_info_tag()\n");
269 1 test_av_find_info_tag();
270 1 return 0;
271 }
272