X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Fparseutils.c;h=d9d5839f67c6e372fcaa5144c7b45763a1e2346b;hb=bb65eb62991e5165b9fad2702a8954a1fe3c6f1f;hp=8e09dade62af34e7382cc1ad1af827e07bcca35c;hpb=f6c7375a175ac649558aefab14f3895b2cb469aa;p=ffmpeg diff --git a/libavutil/parseutils.c b/libavutil/parseutils.c index 8e09dade62a..d9d5839f67c 100644 --- a/libavutil/parseutils.c +++ b/libavutil/parseutils.c @@ -1,18 +1,18 @@ /* - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -21,21 +21,23 @@ * misc parsing utilities */ -#include -#include #include + +#include "avstring.h" +#include "avutil.h" +#include "common.h" +#include "eval.h" +#include "log.h" +#include "random_seed.h" +#include "time_internal.h" #include "parseutils.h" -#include "libavutil/avutil.h" -#include "libavutil/eval.h" -#include "libavutil/avstring.h" -#include "libavutil/random_seed.h" -typedef struct { +typedef struct VideoSizeAbbr { const char *abbr; int width, height; } VideoSizeAbbr; -typedef struct { +typedef struct VideoRateAbbr { const char *abbr; AVRational rate; } VideoRateAbbr; @@ -78,6 +80,10 @@ static const VideoSizeAbbr video_size_abbrs[] = { { "hd480", 852, 480 }, { "hd720", 1280, 720 }, { "hd1080", 1920,1080 }, + { "2kdci", 2048,1080 }, + { "4kdci", 4096,2160 }, + { "uhd2160", 3840,2160 }, + { "uhd4320", 7680,4320 }, }; static const VideoRateAbbr video_rate_abbrs[]= { @@ -106,8 +112,7 @@ int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str) } } if (i == n) { - p = str; - width = strtol(p, &p, 10); + width = strtol(str, &p, 10); if (*p) p++; height = strtol(p, &p, 10); @@ -142,12 +147,12 @@ int av_parse_video_rate(AVRational *rate, const char *arg) return 0; } -typedef struct { +typedef struct ColorEntry { const char *name; ///< a string representing the name of the color uint8_t rgb_color[3]; ///< RGB values for the color } ColorEntry; -static ColorEntry color_table[] = { +static const ColorEntry color_table[] = { { "AliceBlue", { 0xF0, 0xF8, 0xFF } }, { "AntiqueWhite", { 0xFA, 0xEB, 0xD7 } }, { "Aqua", { 0x00, 0xFF, 0xFF } }, @@ -292,7 +297,7 @@ static ColorEntry color_table[] = { static int color_table_compare(const void *lhs, const void *rhs) { - return strcasecmp(lhs, ((const ColorEntry *)rhs)->name); + return av_strcasecmp(lhs, ((const ColorEntry *)rhs)->name); } #define ALPHA_SEP '@' @@ -318,7 +323,7 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, len = strlen(color_string2); rgba_color[3] = 255; - if (!strcasecmp(color_string2, "random") || !strcasecmp(color_string2, "bikeshed")) { + if (!av_strcasecmp(color_string2, "random") || !av_strcasecmp(color_string2, "bikeshed")) { int rgba = av_get_random_seed(); rgba_color[0] = rgba >> 24; rgba_color[1] = rgba >> 16; @@ -354,7 +359,7 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, } if (tail) { - unsigned long int alpha; + double alpha; const char *alpha_string = tail; if (!strncmp(alpha_string, "0x", 2)) { alpha = strtoul(alpha_string, &tail, 16); @@ -362,7 +367,7 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, alpha = 255 * strtod(alpha_string, &tail); } - if (tail == alpha_string || *tail || alpha > 255) { + if (tail == alpha_string || *tail || alpha > 255 || alpha < 0) { av_log(log_ctx, AV_LOG_ERROR, "Invalid alpha value specifier '%s' in '%s'\n", alpha_string, color_string); return AVERROR(EINVAL); @@ -385,7 +390,7 @@ static int date_get_num(const char **pp, val = 0; for(i = 0; i < len_max; i++) { c = *p; - if (!isdigit(c)) + if (!av_isdigit(c)) break; val = (val * 10) + c - '0'; p++; @@ -399,72 +404,76 @@ static int date_get_num(const char **pp, return val; } -/* small strptime for ffmpeg */ -static -const char *small_strptime(const char *p, const char *fmt, - struct tm *dt) +const char *av_small_strptime(const char *p, const char *fmt, struct tm *dt) { int c, val; - for(;;) { + while((c = *fmt++)) { + if (c != '%') { + if (av_isspace(c)) + for (; *p && av_isspace(*p); p++); + else if (*p != c) + return NULL; + else p++; + continue; + } + c = *fmt++; - if (c == '\0') { - return p; - } else if (c == '%') { - c = *fmt++; - switch(c) { - case 'H': - val = date_get_num(&p, 0, 23, 2); - if (val == -1) - return NULL; - dt->tm_hour = val; - break; - case 'M': - val = date_get_num(&p, 0, 59, 2); - if (val == -1) - return NULL; - dt->tm_min = val; - break; - case 'S': - val = date_get_num(&p, 0, 59, 2); - if (val == -1) - return NULL; - dt->tm_sec = val; - break; - case 'Y': - val = date_get_num(&p, 0, 9999, 4); - if (val == -1) - return NULL; - dt->tm_year = val - 1900; - break; - case 'm': - val = date_get_num(&p, 1, 12, 2); - if (val == -1) - return NULL; - dt->tm_mon = val - 1; - break; - case 'd': - val = date_get_num(&p, 1, 31, 2); - if (val == -1) - return NULL; - dt->tm_mday = val; - break; - case '%': - goto match; - default: + switch(c) { + case 'H': + val = date_get_num(&p, 0, 23, 2); + if (val == -1) return NULL; - } - } else { - match: - if (c != *p) + dt->tm_hour = val; + break; + case 'M': + val = date_get_num(&p, 0, 59, 2); + if (val == -1) return NULL; - p++; + dt->tm_min = val; + break; + case 'S': + val = date_get_num(&p, 0, 59, 2); + if (val == -1) + return NULL; + dt->tm_sec = val; + break; + case 'Y': + val = date_get_num(&p, 0, 9999, 4); + if (val == -1) + return NULL; + dt->tm_year = val - 1900; + break; + case 'm': + val = date_get_num(&p, 1, 12, 2); + if (val == -1) + return NULL; + dt->tm_mon = val - 1; + break; + case 'd': + val = date_get_num(&p, 1, 31, 2); + if (val == -1) + return NULL; + dt->tm_mday = val; + break; + case 'T': + p = av_small_strptime(p, "%H:%M:%S", dt); + if (!p) + return NULL; + break; + case '%': + if (*p++ != '%') + return NULL; + break; + default: + return NULL; } } + return p; } -static time_t mktimegm(struct tm *tm) +time_t av_timegm(struct tm *tm) { time_t t; @@ -483,11 +492,11 @@ static time_t mktimegm(struct tm *tm) return t; } -int av_parse_time(int64_t *timeval, const char *datestr, int duration) +int av_parse_time(int64_t *timeval, const char *timestr, int duration) { const char *p; int64_t t; - struct tm dt; + struct tm dt = { 0 }, tmbuf; int i; static const char * const date_fmt[] = { "%Y-%m-%d", @@ -502,29 +511,26 @@ int av_parse_time(int64_t *timeval, const char *datestr, int duration) char lastch; int negative = 0; -#undef time time_t now = time(0); - len = strlen(datestr); + len = strlen(timestr); if (len > 0) - lastch = datestr[len - 1]; + lastch = timestr[len - 1]; else lastch = '\0'; is_utc = (lastch == 'z' || lastch == 'Z'); - memset(&dt, 0, sizeof(dt)); - - p = datestr; + p = timestr; q = NULL; if (!duration) { - if (!strncasecmp(datestr, "now", len)) { + if (!av_strncasecmp(timestr, "now", len)) { *timeval = (int64_t) now * 1000000; return 0; } /* parse the year-month-day part */ for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) { - q = small_strptime(p, date_fmt[i], &dt); + q = av_small_strptime(p, date_fmt[i], &dt); if (q) { break; } @@ -534,9 +540,9 @@ int av_parse_time(int64_t *timeval, const char *datestr, int duration) * current year-month-day time */ if (!q) { if (is_utc) { - dt = *gmtime(&now); + dt = *gmtime_r(&now, &tmbuf); } else { - dt = *localtime(&now); + dt = *localtime_r(&now, &tmbuf); } dt.tm_hour = dt.tm_min = dt.tm_sec = 0; } else { @@ -548,29 +554,31 @@ int av_parse_time(int64_t *timeval, const char *datestr, int duration) /* parse the hour-minute-second part */ for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) { - q = small_strptime(p, time_fmt[i], &dt); + q = av_small_strptime(p, time_fmt[i], &dt); if (q) { break; } } } else { - /* parse datestr as a duration */ + /* parse timestr as a duration */ if (p[0] == '-') { negative = 1; ++p; } - /* parse datestr as HH:MM:SS */ - q = small_strptime(p, time_fmt[0], &dt); + /* parse timestr as HH:MM:SS */ + q = av_small_strptime(p, time_fmt[0], &dt); if (!q) { - /* parse datestr as S+ */ - dt.tm_sec = strtol(p, (char **)&q, 10); - if (q == p) { + char *o; + /* parse timestr as S+ */ + dt.tm_sec = strtol(p, &o, 10); + if (o == p) { /* the parsing didn't succeed */ *timeval = INT64_MIN; return AVERROR(EINVAL); } dt.tm_min = 0; dt.tm_hour = 0; + q = o; } } @@ -585,7 +593,7 @@ int av_parse_time(int64_t *timeval, const char *datestr, int duration) } else { dt.tm_isdst = -1; /* unknown */ if (is_utc) { - t = mktimegm(&dt); + t = av_timegm(&dt); } else { t = mktime(&dt); } @@ -598,7 +606,7 @@ int av_parse_time(int64_t *timeval, const char *datestr, int duration) int val, n; q++; for (val = 0, n = 100000; n >= 1; n /= 10, q++) { - if (!isdigit(*q)) + if (!av_isdigit(*q)) break; val += n * (*q - '0'); } @@ -608,104 +616,41 @@ int av_parse_time(int64_t *timeval, const char *datestr, int duration) return 0; } -#ifdef TEST - -#undef printf - -int main(void) +int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info) { - printf("Testing av_parse_video_rate()\n"); - { - int i; - const char *rates[] = { - "-inf", - "inf", - "nan", - "123/0", - "-123 / 0", - "", - "/", - " 123 / 321", - "foo/foo", - "foo/1", - "1/foo", - "0/0", - "/0", - "1/", - "1", - "0", - "-123/123", - "-foo", - "123.23", - ".23", - "-.23", - "-0.234", - "-0.0000001", - " 21332.2324 ", - " -21332.2324 ", - }; - - for (i = 0; i < FF_ARRAY_ELEMS(rates); i++) { - int ret; - AVRational q = (AVRational){0, 0}; - ret = av_parse_video_rate(&q, rates[i]), - printf("'%s' -> %d/%d ret:%d\n", - rates[i], q.num, q.den, ret); - } - } + const char *p; + char tag[128], *q; - printf("\nTesting av_parse_color()\n"); - { - int i; - uint8_t rgba[4]; - const char *color_names[] = { - "bikeshed", - "RaNdOm", - "foo", - "red", - "Red ", - "RED", - "Violet", - "Yellow", - "Red", - "0x000000", - "0x0000000", - "0xff000000", - "0x3e34ff", - "0x3e34ffaa", - "0xffXXee", - "0xfoobar", - "0xffffeeeeeeee", - "#ff0000", - "#ffXX00", - "ff0000", - "ffXX00", - "red@foo", - "random@10", - "0xff0000@1.0", - "red@", - "red@0xfff", - "red@0xf", - "red@2", - "red@0.1", - "red@-1", - "red@0.5", - "red@1.0", - "red@256", - "red@10foo", - "red@-1.0", - "red@-0.0", - }; - - av_log_set_level(AV_LOG_DEBUG); - - for (i = 0; i < FF_ARRAY_ELEMS(color_names); i++) { - if (av_parse_color(rgba, color_names[i], -1, NULL) >= 0) - printf("%s -> R(%d) G(%d) B(%d) A(%d)\n", color_names[i], rgba[0], rgba[1], rgba[2], rgba[3]); + p = info; + if (*p == '?') + p++; + for(;;) { + q = tag; + while (*p != '\0' && *p != '=' && *p != '&') { + if ((q - tag) < sizeof(tag) - 1) + *q++ = *p; + p++; } + *q = '\0'; + q = arg; + if (*p == '=') { + p++; + while (*p != '&' && *p != '\0') { + if ((q - arg) < arg_size - 1) { + if (*p == '+') + *q++ = ' '; + else + *q++ = *p; + } + p++; + } + } + *q = '\0'; + if (!strcmp(tag, tag1)) + return 1; + if (*p != '&') + break; + p++; } - return 0; } - -#endif /* TEST */