| 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 |