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