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/** 20cabdff1aSopenharmony_ci * @file 21cabdff1aSopenharmony_ci * misc parsing utilities 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include <time.h> 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "avstring.h" 27cabdff1aSopenharmony_ci#include "avutil.h" 28cabdff1aSopenharmony_ci#include "common.h" 29cabdff1aSopenharmony_ci#include "eval.h" 30cabdff1aSopenharmony_ci#include "log.h" 31cabdff1aSopenharmony_ci#include "random_seed.h" 32cabdff1aSopenharmony_ci#include "time_internal.h" 33cabdff1aSopenharmony_ci#include "parseutils.h" 34cabdff1aSopenharmony_ci#include "time.h" 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#ifdef TEST 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#define av_get_random_seed av_get_random_seed_deterministic 39cabdff1aSopenharmony_cistatic uint32_t av_get_random_seed_deterministic(void); 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#define av_gettime() 1331972053200000 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci#endif 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ciint av_parse_ratio(AVRational *q, const char *str, int max, 46cabdff1aSopenharmony_ci int log_offset, void *log_ctx) 47cabdff1aSopenharmony_ci{ 48cabdff1aSopenharmony_ci char c; 49cabdff1aSopenharmony_ci int ret; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci if (sscanf(str, "%d:%d%c", &q->num, &q->den, &c) != 2) { 52cabdff1aSopenharmony_ci double d; 53cabdff1aSopenharmony_ci ret = av_expr_parse_and_eval(&d, str, NULL, NULL, 54cabdff1aSopenharmony_ci NULL, NULL, NULL, NULL, 55cabdff1aSopenharmony_ci NULL, log_offset, log_ctx); 56cabdff1aSopenharmony_ci if (ret < 0) 57cabdff1aSopenharmony_ci return ret; 58cabdff1aSopenharmony_ci *q = av_d2q(d, max); 59cabdff1aSopenharmony_ci } else { 60cabdff1aSopenharmony_ci av_reduce(&q->num, &q->den, q->num, q->den, max); 61cabdff1aSopenharmony_ci } 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci return 0; 64cabdff1aSopenharmony_ci} 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_citypedef struct VideoSizeAbbr { 67cabdff1aSopenharmony_ci const char *abbr; 68cabdff1aSopenharmony_ci int width, height; 69cabdff1aSopenharmony_ci} VideoSizeAbbr; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_citypedef struct VideoRateAbbr { 72cabdff1aSopenharmony_ci const char *abbr; 73cabdff1aSopenharmony_ci AVRational rate; 74cabdff1aSopenharmony_ci} VideoRateAbbr; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_cistatic const VideoSizeAbbr video_size_abbrs[] = { 77cabdff1aSopenharmony_ci { "ntsc", 720, 480 }, 78cabdff1aSopenharmony_ci { "pal", 720, 576 }, 79cabdff1aSopenharmony_ci { "qntsc", 352, 240 }, /* VCD compliant NTSC */ 80cabdff1aSopenharmony_ci { "qpal", 352, 288 }, /* VCD compliant PAL */ 81cabdff1aSopenharmony_ci { "sntsc", 640, 480 }, /* square pixel NTSC */ 82cabdff1aSopenharmony_ci { "spal", 768, 576 }, /* square pixel PAL */ 83cabdff1aSopenharmony_ci { "film", 352, 240 }, 84cabdff1aSopenharmony_ci { "ntsc-film", 352, 240 }, 85cabdff1aSopenharmony_ci { "sqcif", 128, 96 }, 86cabdff1aSopenharmony_ci { "qcif", 176, 144 }, 87cabdff1aSopenharmony_ci { "cif", 352, 288 }, 88cabdff1aSopenharmony_ci { "4cif", 704, 576 }, 89cabdff1aSopenharmony_ci { "16cif", 1408,1152 }, 90cabdff1aSopenharmony_ci { "qqvga", 160, 120 }, 91cabdff1aSopenharmony_ci { "qvga", 320, 240 }, 92cabdff1aSopenharmony_ci { "vga", 640, 480 }, 93cabdff1aSopenharmony_ci { "svga", 800, 600 }, 94cabdff1aSopenharmony_ci { "xga", 1024, 768 }, 95cabdff1aSopenharmony_ci { "uxga", 1600,1200 }, 96cabdff1aSopenharmony_ci { "qxga", 2048,1536 }, 97cabdff1aSopenharmony_ci { "sxga", 1280,1024 }, 98cabdff1aSopenharmony_ci { "qsxga", 2560,2048 }, 99cabdff1aSopenharmony_ci { "hsxga", 5120,4096 }, 100cabdff1aSopenharmony_ci { "wvga", 852, 480 }, 101cabdff1aSopenharmony_ci { "wxga", 1366, 768 }, 102cabdff1aSopenharmony_ci { "wsxga", 1600,1024 }, 103cabdff1aSopenharmony_ci { "wuxga", 1920,1200 }, 104cabdff1aSopenharmony_ci { "woxga", 2560,1600 }, 105cabdff1aSopenharmony_ci { "wqhd", 2560,1440 }, 106cabdff1aSopenharmony_ci { "wqsxga", 3200,2048 }, 107cabdff1aSopenharmony_ci { "wquxga", 3840,2400 }, 108cabdff1aSopenharmony_ci { "whsxga", 6400,4096 }, 109cabdff1aSopenharmony_ci { "whuxga", 7680,4800 }, 110cabdff1aSopenharmony_ci { "cga", 320, 200 }, 111cabdff1aSopenharmony_ci { "ega", 640, 350 }, 112cabdff1aSopenharmony_ci { "hd480", 852, 480 }, 113cabdff1aSopenharmony_ci { "hd720", 1280, 720 }, 114cabdff1aSopenharmony_ci { "hd1080", 1920,1080 }, 115cabdff1aSopenharmony_ci { "quadhd", 2560,1440 }, 116cabdff1aSopenharmony_ci { "2k", 2048,1080 }, /* Digital Cinema System Specification */ 117cabdff1aSopenharmony_ci { "2kdci", 2048,1080 }, 118cabdff1aSopenharmony_ci { "2kflat", 1998,1080 }, 119cabdff1aSopenharmony_ci { "2kscope", 2048, 858 }, 120cabdff1aSopenharmony_ci { "4k", 4096,2160 }, /* Digital Cinema System Specification */ 121cabdff1aSopenharmony_ci { "4kdci", 4096,2160 }, 122cabdff1aSopenharmony_ci { "4kflat", 3996,2160 }, 123cabdff1aSopenharmony_ci { "4kscope", 4096,1716 }, 124cabdff1aSopenharmony_ci { "nhd", 640,360 }, 125cabdff1aSopenharmony_ci { "hqvga", 240,160 }, 126cabdff1aSopenharmony_ci { "wqvga", 400,240 }, 127cabdff1aSopenharmony_ci { "fwqvga", 432,240 }, 128cabdff1aSopenharmony_ci { "hvga", 480,320 }, 129cabdff1aSopenharmony_ci { "qhd", 960,540 }, 130cabdff1aSopenharmony_ci { "uhd2160", 3840,2160 }, 131cabdff1aSopenharmony_ci { "uhd4320", 7680,4320 }, 132cabdff1aSopenharmony_ci}; 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_cistatic const VideoRateAbbr video_rate_abbrs[]= { 135cabdff1aSopenharmony_ci { "ntsc", { 30000, 1001 } }, 136cabdff1aSopenharmony_ci { "pal", { 25, 1 } }, 137cabdff1aSopenharmony_ci { "qntsc", { 30000, 1001 } }, /* VCD compliant NTSC */ 138cabdff1aSopenharmony_ci { "qpal", { 25, 1 } }, /* VCD compliant PAL */ 139cabdff1aSopenharmony_ci { "sntsc", { 30000, 1001 } }, /* square pixel NTSC */ 140cabdff1aSopenharmony_ci { "spal", { 25, 1 } }, /* square pixel PAL */ 141cabdff1aSopenharmony_ci { "film", { 24, 1 } }, 142cabdff1aSopenharmony_ci { "ntsc-film", { 24000, 1001 } }, 143cabdff1aSopenharmony_ci}; 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_cistatic const char *months[12] = { 146cabdff1aSopenharmony_ci "january", "february", "march", "april", "may", "june", "july", "august", 147cabdff1aSopenharmony_ci "september", "october", "november", "december" 148cabdff1aSopenharmony_ci}; 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ciint av_parse_video_size(int *width_ptr, int *height_ptr, const char *str) 151cabdff1aSopenharmony_ci{ 152cabdff1aSopenharmony_ci int i; 153cabdff1aSopenharmony_ci int n = FF_ARRAY_ELEMS(video_size_abbrs); 154cabdff1aSopenharmony_ci const char *p; 155cabdff1aSopenharmony_ci int width = 0, height = 0; 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 158cabdff1aSopenharmony_ci if (!strcmp(video_size_abbrs[i].abbr, str)) { 159cabdff1aSopenharmony_ci width = video_size_abbrs[i].width; 160cabdff1aSopenharmony_ci height = video_size_abbrs[i].height; 161cabdff1aSopenharmony_ci break; 162cabdff1aSopenharmony_ci } 163cabdff1aSopenharmony_ci } 164cabdff1aSopenharmony_ci if (i == n) { 165cabdff1aSopenharmony_ci width = strtol(str, (void*)&p, 10); 166cabdff1aSopenharmony_ci if (*p) 167cabdff1aSopenharmony_ci p++; 168cabdff1aSopenharmony_ci height = strtol(p, (void*)&p, 10); 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci /* trailing extraneous data detected, like in 123x345foobar */ 171cabdff1aSopenharmony_ci if (*p) 172cabdff1aSopenharmony_ci return AVERROR(EINVAL); 173cabdff1aSopenharmony_ci } 174cabdff1aSopenharmony_ci if (width <= 0 || height <= 0) 175cabdff1aSopenharmony_ci return AVERROR(EINVAL); 176cabdff1aSopenharmony_ci *width_ptr = width; 177cabdff1aSopenharmony_ci *height_ptr = height; 178cabdff1aSopenharmony_ci return 0; 179cabdff1aSopenharmony_ci} 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ciint av_parse_video_rate(AVRational *rate, const char *arg) 182cabdff1aSopenharmony_ci{ 183cabdff1aSopenharmony_ci int i, ret; 184cabdff1aSopenharmony_ci int n = FF_ARRAY_ELEMS(video_rate_abbrs); 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci /* First, we check our abbreviation table */ 187cabdff1aSopenharmony_ci for (i = 0; i < n; ++i) 188cabdff1aSopenharmony_ci if (!strcmp(video_rate_abbrs[i].abbr, arg)) { 189cabdff1aSopenharmony_ci *rate = video_rate_abbrs[i].rate; 190cabdff1aSopenharmony_ci return 0; 191cabdff1aSopenharmony_ci } 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci /* Then, we try to parse it as fraction */ 194cabdff1aSopenharmony_ci if ((ret = av_parse_ratio_quiet(rate, arg, 1001000)) < 0) 195cabdff1aSopenharmony_ci return ret; 196cabdff1aSopenharmony_ci if (rate->num <= 0 || rate->den <= 0) 197cabdff1aSopenharmony_ci return AVERROR(EINVAL); 198cabdff1aSopenharmony_ci return 0; 199cabdff1aSopenharmony_ci} 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_citypedef struct ColorEntry { 202cabdff1aSopenharmony_ci const char *name; ///< a string representing the name of the color 203cabdff1aSopenharmony_ci uint8_t rgb_color[3]; ///< RGB values for the color 204cabdff1aSopenharmony_ci} ColorEntry; 205cabdff1aSopenharmony_ci 206cabdff1aSopenharmony_cistatic const ColorEntry color_table[] = { 207cabdff1aSopenharmony_ci { "AliceBlue", { 0xF0, 0xF8, 0xFF } }, 208cabdff1aSopenharmony_ci { "AntiqueWhite", { 0xFA, 0xEB, 0xD7 } }, 209cabdff1aSopenharmony_ci { "Aqua", { 0x00, 0xFF, 0xFF } }, 210cabdff1aSopenharmony_ci { "Aquamarine", { 0x7F, 0xFF, 0xD4 } }, 211cabdff1aSopenharmony_ci { "Azure", { 0xF0, 0xFF, 0xFF } }, 212cabdff1aSopenharmony_ci { "Beige", { 0xF5, 0xF5, 0xDC } }, 213cabdff1aSopenharmony_ci { "Bisque", { 0xFF, 0xE4, 0xC4 } }, 214cabdff1aSopenharmony_ci { "Black", { 0x00, 0x00, 0x00 } }, 215cabdff1aSopenharmony_ci { "BlanchedAlmond", { 0xFF, 0xEB, 0xCD } }, 216cabdff1aSopenharmony_ci { "Blue", { 0x00, 0x00, 0xFF } }, 217cabdff1aSopenharmony_ci { "BlueViolet", { 0x8A, 0x2B, 0xE2 } }, 218cabdff1aSopenharmony_ci { "Brown", { 0xA5, 0x2A, 0x2A } }, 219cabdff1aSopenharmony_ci { "BurlyWood", { 0xDE, 0xB8, 0x87 } }, 220cabdff1aSopenharmony_ci { "CadetBlue", { 0x5F, 0x9E, 0xA0 } }, 221cabdff1aSopenharmony_ci { "Chartreuse", { 0x7F, 0xFF, 0x00 } }, 222cabdff1aSopenharmony_ci { "Chocolate", { 0xD2, 0x69, 0x1E } }, 223cabdff1aSopenharmony_ci { "Coral", { 0xFF, 0x7F, 0x50 } }, 224cabdff1aSopenharmony_ci { "CornflowerBlue", { 0x64, 0x95, 0xED } }, 225cabdff1aSopenharmony_ci { "Cornsilk", { 0xFF, 0xF8, 0xDC } }, 226cabdff1aSopenharmony_ci { "Crimson", { 0xDC, 0x14, 0x3C } }, 227cabdff1aSopenharmony_ci { "Cyan", { 0x00, 0xFF, 0xFF } }, 228cabdff1aSopenharmony_ci { "DarkBlue", { 0x00, 0x00, 0x8B } }, 229cabdff1aSopenharmony_ci { "DarkCyan", { 0x00, 0x8B, 0x8B } }, 230cabdff1aSopenharmony_ci { "DarkGoldenRod", { 0xB8, 0x86, 0x0B } }, 231cabdff1aSopenharmony_ci { "DarkGray", { 0xA9, 0xA9, 0xA9 } }, 232cabdff1aSopenharmony_ci { "DarkGreen", { 0x00, 0x64, 0x00 } }, 233cabdff1aSopenharmony_ci { "DarkKhaki", { 0xBD, 0xB7, 0x6B } }, 234cabdff1aSopenharmony_ci { "DarkMagenta", { 0x8B, 0x00, 0x8B } }, 235cabdff1aSopenharmony_ci { "DarkOliveGreen", { 0x55, 0x6B, 0x2F } }, 236cabdff1aSopenharmony_ci { "Darkorange", { 0xFF, 0x8C, 0x00 } }, 237cabdff1aSopenharmony_ci { "DarkOrchid", { 0x99, 0x32, 0xCC } }, 238cabdff1aSopenharmony_ci { "DarkRed", { 0x8B, 0x00, 0x00 } }, 239cabdff1aSopenharmony_ci { "DarkSalmon", { 0xE9, 0x96, 0x7A } }, 240cabdff1aSopenharmony_ci { "DarkSeaGreen", { 0x8F, 0xBC, 0x8F } }, 241cabdff1aSopenharmony_ci { "DarkSlateBlue", { 0x48, 0x3D, 0x8B } }, 242cabdff1aSopenharmony_ci { "DarkSlateGray", { 0x2F, 0x4F, 0x4F } }, 243cabdff1aSopenharmony_ci { "DarkTurquoise", { 0x00, 0xCE, 0xD1 } }, 244cabdff1aSopenharmony_ci { "DarkViolet", { 0x94, 0x00, 0xD3 } }, 245cabdff1aSopenharmony_ci { "DeepPink", { 0xFF, 0x14, 0x93 } }, 246cabdff1aSopenharmony_ci { "DeepSkyBlue", { 0x00, 0xBF, 0xFF } }, 247cabdff1aSopenharmony_ci { "DimGray", { 0x69, 0x69, 0x69 } }, 248cabdff1aSopenharmony_ci { "DodgerBlue", { 0x1E, 0x90, 0xFF } }, 249cabdff1aSopenharmony_ci { "FireBrick", { 0xB2, 0x22, 0x22 } }, 250cabdff1aSopenharmony_ci { "FloralWhite", { 0xFF, 0xFA, 0xF0 } }, 251cabdff1aSopenharmony_ci { "ForestGreen", { 0x22, 0x8B, 0x22 } }, 252cabdff1aSopenharmony_ci { "Fuchsia", { 0xFF, 0x00, 0xFF } }, 253cabdff1aSopenharmony_ci { "Gainsboro", { 0xDC, 0xDC, 0xDC } }, 254cabdff1aSopenharmony_ci { "GhostWhite", { 0xF8, 0xF8, 0xFF } }, 255cabdff1aSopenharmony_ci { "Gold", { 0xFF, 0xD7, 0x00 } }, 256cabdff1aSopenharmony_ci { "GoldenRod", { 0xDA, 0xA5, 0x20 } }, 257cabdff1aSopenharmony_ci { "Gray", { 0x80, 0x80, 0x80 } }, 258cabdff1aSopenharmony_ci { "Green", { 0x00, 0x80, 0x00 } }, 259cabdff1aSopenharmony_ci { "GreenYellow", { 0xAD, 0xFF, 0x2F } }, 260cabdff1aSopenharmony_ci { "HoneyDew", { 0xF0, 0xFF, 0xF0 } }, 261cabdff1aSopenharmony_ci { "HotPink", { 0xFF, 0x69, 0xB4 } }, 262cabdff1aSopenharmony_ci { "IndianRed", { 0xCD, 0x5C, 0x5C } }, 263cabdff1aSopenharmony_ci { "Indigo", { 0x4B, 0x00, 0x82 } }, 264cabdff1aSopenharmony_ci { "Ivory", { 0xFF, 0xFF, 0xF0 } }, 265cabdff1aSopenharmony_ci { "Khaki", { 0xF0, 0xE6, 0x8C } }, 266cabdff1aSopenharmony_ci { "Lavender", { 0xE6, 0xE6, 0xFA } }, 267cabdff1aSopenharmony_ci { "LavenderBlush", { 0xFF, 0xF0, 0xF5 } }, 268cabdff1aSopenharmony_ci { "LawnGreen", { 0x7C, 0xFC, 0x00 } }, 269cabdff1aSopenharmony_ci { "LemonChiffon", { 0xFF, 0xFA, 0xCD } }, 270cabdff1aSopenharmony_ci { "LightBlue", { 0xAD, 0xD8, 0xE6 } }, 271cabdff1aSopenharmony_ci { "LightCoral", { 0xF0, 0x80, 0x80 } }, 272cabdff1aSopenharmony_ci { "LightCyan", { 0xE0, 0xFF, 0xFF } }, 273cabdff1aSopenharmony_ci { "LightGoldenRodYellow", { 0xFA, 0xFA, 0xD2 } }, 274cabdff1aSopenharmony_ci { "LightGreen", { 0x90, 0xEE, 0x90 } }, 275cabdff1aSopenharmony_ci { "LightGrey", { 0xD3, 0xD3, 0xD3 } }, 276cabdff1aSopenharmony_ci { "LightPink", { 0xFF, 0xB6, 0xC1 } }, 277cabdff1aSopenharmony_ci { "LightSalmon", { 0xFF, 0xA0, 0x7A } }, 278cabdff1aSopenharmony_ci { "LightSeaGreen", { 0x20, 0xB2, 0xAA } }, 279cabdff1aSopenharmony_ci { "LightSkyBlue", { 0x87, 0xCE, 0xFA } }, 280cabdff1aSopenharmony_ci { "LightSlateGray", { 0x77, 0x88, 0x99 } }, 281cabdff1aSopenharmony_ci { "LightSteelBlue", { 0xB0, 0xC4, 0xDE } }, 282cabdff1aSopenharmony_ci { "LightYellow", { 0xFF, 0xFF, 0xE0 } }, 283cabdff1aSopenharmony_ci { "Lime", { 0x00, 0xFF, 0x00 } }, 284cabdff1aSopenharmony_ci { "LimeGreen", { 0x32, 0xCD, 0x32 } }, 285cabdff1aSopenharmony_ci { "Linen", { 0xFA, 0xF0, 0xE6 } }, 286cabdff1aSopenharmony_ci { "Magenta", { 0xFF, 0x00, 0xFF } }, 287cabdff1aSopenharmony_ci { "Maroon", { 0x80, 0x00, 0x00 } }, 288cabdff1aSopenharmony_ci { "MediumAquaMarine", { 0x66, 0xCD, 0xAA } }, 289cabdff1aSopenharmony_ci { "MediumBlue", { 0x00, 0x00, 0xCD } }, 290cabdff1aSopenharmony_ci { "MediumOrchid", { 0xBA, 0x55, 0xD3 } }, 291cabdff1aSopenharmony_ci { "MediumPurple", { 0x93, 0x70, 0xD8 } }, 292cabdff1aSopenharmony_ci { "MediumSeaGreen", { 0x3C, 0xB3, 0x71 } }, 293cabdff1aSopenharmony_ci { "MediumSlateBlue", { 0x7B, 0x68, 0xEE } }, 294cabdff1aSopenharmony_ci { "MediumSpringGreen", { 0x00, 0xFA, 0x9A } }, 295cabdff1aSopenharmony_ci { "MediumTurquoise", { 0x48, 0xD1, 0xCC } }, 296cabdff1aSopenharmony_ci { "MediumVioletRed", { 0xC7, 0x15, 0x85 } }, 297cabdff1aSopenharmony_ci { "MidnightBlue", { 0x19, 0x19, 0x70 } }, 298cabdff1aSopenharmony_ci { "MintCream", { 0xF5, 0xFF, 0xFA } }, 299cabdff1aSopenharmony_ci { "MistyRose", { 0xFF, 0xE4, 0xE1 } }, 300cabdff1aSopenharmony_ci { "Moccasin", { 0xFF, 0xE4, 0xB5 } }, 301cabdff1aSopenharmony_ci { "NavajoWhite", { 0xFF, 0xDE, 0xAD } }, 302cabdff1aSopenharmony_ci { "Navy", { 0x00, 0x00, 0x80 } }, 303cabdff1aSopenharmony_ci { "OldLace", { 0xFD, 0xF5, 0xE6 } }, 304cabdff1aSopenharmony_ci { "Olive", { 0x80, 0x80, 0x00 } }, 305cabdff1aSopenharmony_ci { "OliveDrab", { 0x6B, 0x8E, 0x23 } }, 306cabdff1aSopenharmony_ci { "Orange", { 0xFF, 0xA5, 0x00 } }, 307cabdff1aSopenharmony_ci { "OrangeRed", { 0xFF, 0x45, 0x00 } }, 308cabdff1aSopenharmony_ci { "Orchid", { 0xDA, 0x70, 0xD6 } }, 309cabdff1aSopenharmony_ci { "PaleGoldenRod", { 0xEE, 0xE8, 0xAA } }, 310cabdff1aSopenharmony_ci { "PaleGreen", { 0x98, 0xFB, 0x98 } }, 311cabdff1aSopenharmony_ci { "PaleTurquoise", { 0xAF, 0xEE, 0xEE } }, 312cabdff1aSopenharmony_ci { "PaleVioletRed", { 0xD8, 0x70, 0x93 } }, 313cabdff1aSopenharmony_ci { "PapayaWhip", { 0xFF, 0xEF, 0xD5 } }, 314cabdff1aSopenharmony_ci { "PeachPuff", { 0xFF, 0xDA, 0xB9 } }, 315cabdff1aSopenharmony_ci { "Peru", { 0xCD, 0x85, 0x3F } }, 316cabdff1aSopenharmony_ci { "Pink", { 0xFF, 0xC0, 0xCB } }, 317cabdff1aSopenharmony_ci { "Plum", { 0xDD, 0xA0, 0xDD } }, 318cabdff1aSopenharmony_ci { "PowderBlue", { 0xB0, 0xE0, 0xE6 } }, 319cabdff1aSopenharmony_ci { "Purple", { 0x80, 0x00, 0x80 } }, 320cabdff1aSopenharmony_ci { "Red", { 0xFF, 0x00, 0x00 } }, 321cabdff1aSopenharmony_ci { "RosyBrown", { 0xBC, 0x8F, 0x8F } }, 322cabdff1aSopenharmony_ci { "RoyalBlue", { 0x41, 0x69, 0xE1 } }, 323cabdff1aSopenharmony_ci { "SaddleBrown", { 0x8B, 0x45, 0x13 } }, 324cabdff1aSopenharmony_ci { "Salmon", { 0xFA, 0x80, 0x72 } }, 325cabdff1aSopenharmony_ci { "SandyBrown", { 0xF4, 0xA4, 0x60 } }, 326cabdff1aSopenharmony_ci { "SeaGreen", { 0x2E, 0x8B, 0x57 } }, 327cabdff1aSopenharmony_ci { "SeaShell", { 0xFF, 0xF5, 0xEE } }, 328cabdff1aSopenharmony_ci { "Sienna", { 0xA0, 0x52, 0x2D } }, 329cabdff1aSopenharmony_ci { "Silver", { 0xC0, 0xC0, 0xC0 } }, 330cabdff1aSopenharmony_ci { "SkyBlue", { 0x87, 0xCE, 0xEB } }, 331cabdff1aSopenharmony_ci { "SlateBlue", { 0x6A, 0x5A, 0xCD } }, 332cabdff1aSopenharmony_ci { "SlateGray", { 0x70, 0x80, 0x90 } }, 333cabdff1aSopenharmony_ci { "Snow", { 0xFF, 0xFA, 0xFA } }, 334cabdff1aSopenharmony_ci { "SpringGreen", { 0x00, 0xFF, 0x7F } }, 335cabdff1aSopenharmony_ci { "SteelBlue", { 0x46, 0x82, 0xB4 } }, 336cabdff1aSopenharmony_ci { "Tan", { 0xD2, 0xB4, 0x8C } }, 337cabdff1aSopenharmony_ci { "Teal", { 0x00, 0x80, 0x80 } }, 338cabdff1aSopenharmony_ci { "Thistle", { 0xD8, 0xBF, 0xD8 } }, 339cabdff1aSopenharmony_ci { "Tomato", { 0xFF, 0x63, 0x47 } }, 340cabdff1aSopenharmony_ci { "Turquoise", { 0x40, 0xE0, 0xD0 } }, 341cabdff1aSopenharmony_ci { "Violet", { 0xEE, 0x82, 0xEE } }, 342cabdff1aSopenharmony_ci { "Wheat", { 0xF5, 0xDE, 0xB3 } }, 343cabdff1aSopenharmony_ci { "White", { 0xFF, 0xFF, 0xFF } }, 344cabdff1aSopenharmony_ci { "WhiteSmoke", { 0xF5, 0xF5, 0xF5 } }, 345cabdff1aSopenharmony_ci { "Yellow", { 0xFF, 0xFF, 0x00 } }, 346cabdff1aSopenharmony_ci { "YellowGreen", { 0x9A, 0xCD, 0x32 } }, 347cabdff1aSopenharmony_ci}; 348cabdff1aSopenharmony_ci 349cabdff1aSopenharmony_cistatic int color_table_compare(const void *lhs, const void *rhs) 350cabdff1aSopenharmony_ci{ 351cabdff1aSopenharmony_ci return av_strcasecmp(lhs, ((const ColorEntry *)rhs)->name); 352cabdff1aSopenharmony_ci} 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci#define ALPHA_SEP '@' 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ciint av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, 357cabdff1aSopenharmony_ci void *log_ctx) 358cabdff1aSopenharmony_ci{ 359cabdff1aSopenharmony_ci char *tail, color_string2[128]; 360cabdff1aSopenharmony_ci const ColorEntry *entry; 361cabdff1aSopenharmony_ci int len, hex_offset = 0; 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_ci if (color_string[0] == '#') { 364cabdff1aSopenharmony_ci hex_offset = 1; 365cabdff1aSopenharmony_ci } else if (!strncmp(color_string, "0x", 2)) 366cabdff1aSopenharmony_ci hex_offset = 2; 367cabdff1aSopenharmony_ci 368cabdff1aSopenharmony_ci if (slen < 0) 369cabdff1aSopenharmony_ci slen = strlen(color_string); 370cabdff1aSopenharmony_ci av_strlcpy(color_string2, color_string + hex_offset, 371cabdff1aSopenharmony_ci FFMIN(slen-hex_offset+1, sizeof(color_string2))); 372cabdff1aSopenharmony_ci if ((tail = strchr(color_string2, ALPHA_SEP))) 373cabdff1aSopenharmony_ci *tail++ = 0; 374cabdff1aSopenharmony_ci len = strlen(color_string2); 375cabdff1aSopenharmony_ci rgba_color[3] = 255; 376cabdff1aSopenharmony_ci 377cabdff1aSopenharmony_ci if (!av_strcasecmp(color_string2, "random") || !av_strcasecmp(color_string2, "bikeshed")) { 378cabdff1aSopenharmony_ci int rgba = av_get_random_seed(); 379cabdff1aSopenharmony_ci rgba_color[0] = rgba >> 24; 380cabdff1aSopenharmony_ci rgba_color[1] = rgba >> 16; 381cabdff1aSopenharmony_ci rgba_color[2] = rgba >> 8; 382cabdff1aSopenharmony_ci rgba_color[3] = rgba; 383cabdff1aSopenharmony_ci } else if (hex_offset || 384cabdff1aSopenharmony_ci strspn(color_string2, "0123456789ABCDEFabcdef") == len) { 385cabdff1aSopenharmony_ci char *tail; 386cabdff1aSopenharmony_ci unsigned int rgba = strtoul(color_string2, &tail, 16); 387cabdff1aSopenharmony_ci 388cabdff1aSopenharmony_ci if (*tail || (len != 6 && len != 8)) { 389cabdff1aSopenharmony_ci av_log(log_ctx, AV_LOG_ERROR, "Invalid 0xRRGGBB[AA] color string: '%s'\n", color_string2); 390cabdff1aSopenharmony_ci return AVERROR(EINVAL); 391cabdff1aSopenharmony_ci } 392cabdff1aSopenharmony_ci if (len == 8) { 393cabdff1aSopenharmony_ci rgba_color[3] = rgba; 394cabdff1aSopenharmony_ci rgba >>= 8; 395cabdff1aSopenharmony_ci } 396cabdff1aSopenharmony_ci rgba_color[0] = rgba >> 16; 397cabdff1aSopenharmony_ci rgba_color[1] = rgba >> 8; 398cabdff1aSopenharmony_ci rgba_color[2] = rgba; 399cabdff1aSopenharmony_ci } else { 400cabdff1aSopenharmony_ci entry = bsearch(color_string2, 401cabdff1aSopenharmony_ci color_table, 402cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(color_table), 403cabdff1aSopenharmony_ci sizeof(ColorEntry), 404cabdff1aSopenharmony_ci color_table_compare); 405cabdff1aSopenharmony_ci if (!entry) { 406cabdff1aSopenharmony_ci av_log(log_ctx, AV_LOG_ERROR, "Cannot find color '%s'\n", color_string2); 407cabdff1aSopenharmony_ci return AVERROR(EINVAL); 408cabdff1aSopenharmony_ci } 409cabdff1aSopenharmony_ci memcpy(rgba_color, entry->rgb_color, 3); 410cabdff1aSopenharmony_ci } 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci if (tail) { 413cabdff1aSopenharmony_ci double alpha; 414cabdff1aSopenharmony_ci const char *alpha_string = tail; 415cabdff1aSopenharmony_ci if (!strncmp(alpha_string, "0x", 2)) { 416cabdff1aSopenharmony_ci alpha = strtoul(alpha_string, &tail, 16); 417cabdff1aSopenharmony_ci } else { 418cabdff1aSopenharmony_ci double norm_alpha = strtod(alpha_string, &tail); 419cabdff1aSopenharmony_ci if (norm_alpha < 0.0 || norm_alpha > 1.0) 420cabdff1aSopenharmony_ci alpha = 256; 421cabdff1aSopenharmony_ci else 422cabdff1aSopenharmony_ci alpha = 255 * norm_alpha; 423cabdff1aSopenharmony_ci } 424cabdff1aSopenharmony_ci 425cabdff1aSopenharmony_ci if (tail == alpha_string || *tail || alpha > 255 || alpha < 0) { 426cabdff1aSopenharmony_ci av_log(log_ctx, AV_LOG_ERROR, "Invalid alpha value specifier '%s' in '%s'\n", 427cabdff1aSopenharmony_ci alpha_string, color_string); 428cabdff1aSopenharmony_ci return AVERROR(EINVAL); 429cabdff1aSopenharmony_ci } 430cabdff1aSopenharmony_ci rgba_color[3] = alpha; 431cabdff1aSopenharmony_ci } 432cabdff1aSopenharmony_ci 433cabdff1aSopenharmony_ci return 0; 434cabdff1aSopenharmony_ci} 435cabdff1aSopenharmony_ci 436cabdff1aSopenharmony_ciconst char *av_get_known_color_name(int color_idx, const uint8_t **rgbp) 437cabdff1aSopenharmony_ci{ 438cabdff1aSopenharmony_ci const ColorEntry *color; 439cabdff1aSopenharmony_ci 440cabdff1aSopenharmony_ci if ((unsigned)color_idx >= FF_ARRAY_ELEMS(color_table)) 441cabdff1aSopenharmony_ci return NULL; 442cabdff1aSopenharmony_ci 443cabdff1aSopenharmony_ci color = &color_table[color_idx]; 444cabdff1aSopenharmony_ci if (rgbp) 445cabdff1aSopenharmony_ci *rgbp = color->rgb_color; 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_ci return color->name; 448cabdff1aSopenharmony_ci} 449cabdff1aSopenharmony_ci 450cabdff1aSopenharmony_ci/* get a positive number between n_min and n_max, for a maximum length 451cabdff1aSopenharmony_ci of len_max. Return -1 if error. */ 452cabdff1aSopenharmony_cistatic int date_get_num(const char **pp, 453cabdff1aSopenharmony_ci int n_min, int n_max, int len_max) 454cabdff1aSopenharmony_ci{ 455cabdff1aSopenharmony_ci int i, val, c; 456cabdff1aSopenharmony_ci const char *p; 457cabdff1aSopenharmony_ci 458cabdff1aSopenharmony_ci p = *pp; 459cabdff1aSopenharmony_ci val = 0; 460cabdff1aSopenharmony_ci for(i = 0; i < len_max; i++) { 461cabdff1aSopenharmony_ci c = *p; 462cabdff1aSopenharmony_ci if (!av_isdigit(c)) 463cabdff1aSopenharmony_ci break; 464cabdff1aSopenharmony_ci val = (val * 10) + c - '0'; 465cabdff1aSopenharmony_ci p++; 466cabdff1aSopenharmony_ci } 467cabdff1aSopenharmony_ci /* no number read ? */ 468cabdff1aSopenharmony_ci if (p == *pp) 469cabdff1aSopenharmony_ci return -1; 470cabdff1aSopenharmony_ci if (val < n_min || val > n_max) 471cabdff1aSopenharmony_ci return -1; 472cabdff1aSopenharmony_ci *pp = p; 473cabdff1aSopenharmony_ci return val; 474cabdff1aSopenharmony_ci} 475cabdff1aSopenharmony_ci 476cabdff1aSopenharmony_cistatic int date_get_month(const char **pp) { 477cabdff1aSopenharmony_ci int i = 0; 478cabdff1aSopenharmony_ci for (; i < 12; i++) { 479cabdff1aSopenharmony_ci if (!av_strncasecmp(*pp, months[i], 3)) { 480cabdff1aSopenharmony_ci const char *mo_full = months[i] + 3; 481cabdff1aSopenharmony_ci int len = strlen(mo_full); 482cabdff1aSopenharmony_ci *pp += 3; 483cabdff1aSopenharmony_ci if (len > 0 && !av_strncasecmp(*pp, mo_full, len)) 484cabdff1aSopenharmony_ci *pp += len; 485cabdff1aSopenharmony_ci return i; 486cabdff1aSopenharmony_ci } 487cabdff1aSopenharmony_ci } 488cabdff1aSopenharmony_ci return -1; 489cabdff1aSopenharmony_ci} 490cabdff1aSopenharmony_ci 491cabdff1aSopenharmony_cichar *av_small_strptime(const char *p, const char *fmt, struct tm *dt) 492cabdff1aSopenharmony_ci{ 493cabdff1aSopenharmony_ci int c, val; 494cabdff1aSopenharmony_ci 495cabdff1aSopenharmony_ci while((c = *fmt++)) { 496cabdff1aSopenharmony_ci if (c != '%') { 497cabdff1aSopenharmony_ci if (av_isspace(c)) 498cabdff1aSopenharmony_ci for (; *p && av_isspace(*p); p++); 499cabdff1aSopenharmony_ci else if (*p != c) 500cabdff1aSopenharmony_ci return NULL; 501cabdff1aSopenharmony_ci else p++; 502cabdff1aSopenharmony_ci continue; 503cabdff1aSopenharmony_ci } 504cabdff1aSopenharmony_ci 505cabdff1aSopenharmony_ci c = *fmt++; 506cabdff1aSopenharmony_ci switch(c) { 507cabdff1aSopenharmony_ci case 'H': 508cabdff1aSopenharmony_ci case 'J': 509cabdff1aSopenharmony_ci val = date_get_num(&p, 0, c == 'H' ? 23 : INT_MAX, c == 'H' ? 2 : 4); 510cabdff1aSopenharmony_ci 511cabdff1aSopenharmony_ci if (val == -1) 512cabdff1aSopenharmony_ci return NULL; 513cabdff1aSopenharmony_ci dt->tm_hour = val; 514cabdff1aSopenharmony_ci break; 515cabdff1aSopenharmony_ci case 'M': 516cabdff1aSopenharmony_ci val = date_get_num(&p, 0, 59, 2); 517cabdff1aSopenharmony_ci if (val == -1) 518cabdff1aSopenharmony_ci return NULL; 519cabdff1aSopenharmony_ci dt->tm_min = val; 520cabdff1aSopenharmony_ci break; 521cabdff1aSopenharmony_ci case 'S': 522cabdff1aSopenharmony_ci val = date_get_num(&p, 0, 59, 2); 523cabdff1aSopenharmony_ci if (val == -1) 524cabdff1aSopenharmony_ci return NULL; 525cabdff1aSopenharmony_ci dt->tm_sec = val; 526cabdff1aSopenharmony_ci break; 527cabdff1aSopenharmony_ci case 'Y': 528cabdff1aSopenharmony_ci val = date_get_num(&p, 0, 9999, 4); 529cabdff1aSopenharmony_ci if (val == -1) 530cabdff1aSopenharmony_ci return NULL; 531cabdff1aSopenharmony_ci dt->tm_year = val - 1900; 532cabdff1aSopenharmony_ci break; 533cabdff1aSopenharmony_ci case 'm': 534cabdff1aSopenharmony_ci val = date_get_num(&p, 1, 12, 2); 535cabdff1aSopenharmony_ci if (val == -1) 536cabdff1aSopenharmony_ci return NULL; 537cabdff1aSopenharmony_ci dt->tm_mon = val - 1; 538cabdff1aSopenharmony_ci break; 539cabdff1aSopenharmony_ci case 'd': 540cabdff1aSopenharmony_ci val = date_get_num(&p, 1, 31, 2); 541cabdff1aSopenharmony_ci if (val == -1) 542cabdff1aSopenharmony_ci return NULL; 543cabdff1aSopenharmony_ci dt->tm_mday = val; 544cabdff1aSopenharmony_ci break; 545cabdff1aSopenharmony_ci case 'T': 546cabdff1aSopenharmony_ci p = av_small_strptime(p, "%H:%M:%S", dt); 547cabdff1aSopenharmony_ci if (!p) 548cabdff1aSopenharmony_ci return NULL; 549cabdff1aSopenharmony_ci break; 550cabdff1aSopenharmony_ci case 'b': 551cabdff1aSopenharmony_ci case 'B': 552cabdff1aSopenharmony_ci case 'h': 553cabdff1aSopenharmony_ci val = date_get_month(&p); 554cabdff1aSopenharmony_ci if (val == -1) 555cabdff1aSopenharmony_ci return NULL; 556cabdff1aSopenharmony_ci dt->tm_mon = val; 557cabdff1aSopenharmony_ci break; 558cabdff1aSopenharmony_ci case '%': 559cabdff1aSopenharmony_ci if (*p++ != '%') 560cabdff1aSopenharmony_ci return NULL; 561cabdff1aSopenharmony_ci break; 562cabdff1aSopenharmony_ci default: 563cabdff1aSopenharmony_ci return NULL; 564cabdff1aSopenharmony_ci } 565cabdff1aSopenharmony_ci } 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci return (char*)p; 568cabdff1aSopenharmony_ci} 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_citime_t av_timegm(struct tm *tm) 571cabdff1aSopenharmony_ci{ 572cabdff1aSopenharmony_ci time_t t; 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday; 575cabdff1aSopenharmony_ci 576cabdff1aSopenharmony_ci if (m < 3) { 577cabdff1aSopenharmony_ci m += 12; 578cabdff1aSopenharmony_ci y--; 579cabdff1aSopenharmony_ci } 580cabdff1aSopenharmony_ci 581cabdff1aSopenharmony_ci t = 86400LL * 582cabdff1aSopenharmony_ci (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 719469); 583cabdff1aSopenharmony_ci 584cabdff1aSopenharmony_ci t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec; 585cabdff1aSopenharmony_ci 586cabdff1aSopenharmony_ci return t; 587cabdff1aSopenharmony_ci} 588cabdff1aSopenharmony_ci 589cabdff1aSopenharmony_ciint av_parse_time(int64_t *timeval, const char *timestr, int duration) 590cabdff1aSopenharmony_ci{ 591cabdff1aSopenharmony_ci const char *p, *q; 592cabdff1aSopenharmony_ci int64_t t, now64; 593cabdff1aSopenharmony_ci time_t now; 594cabdff1aSopenharmony_ci struct tm dt = { 0 }, tmbuf; 595cabdff1aSopenharmony_ci int today = 0, negative = 0, microseconds = 0, suffix = 1000000; 596cabdff1aSopenharmony_ci int i; 597cabdff1aSopenharmony_ci static const char * const date_fmt[] = { 598cabdff1aSopenharmony_ci "%Y - %m - %d", 599cabdff1aSopenharmony_ci "%Y%m%d", 600cabdff1aSopenharmony_ci }; 601cabdff1aSopenharmony_ci static const char * const time_fmt[] = { 602cabdff1aSopenharmony_ci "%H:%M:%S", 603cabdff1aSopenharmony_ci "%H%M%S", 604cabdff1aSopenharmony_ci }; 605cabdff1aSopenharmony_ci static const char * const tz_fmt[] = { 606cabdff1aSopenharmony_ci "%H:%M", 607cabdff1aSopenharmony_ci "%H%M", 608cabdff1aSopenharmony_ci "%H", 609cabdff1aSopenharmony_ci }; 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_ci p = timestr; 612cabdff1aSopenharmony_ci q = NULL; 613cabdff1aSopenharmony_ci *timeval = INT64_MIN; 614cabdff1aSopenharmony_ci if (!duration) { 615cabdff1aSopenharmony_ci now64 = av_gettime(); 616cabdff1aSopenharmony_ci now = now64 / 1000000; 617cabdff1aSopenharmony_ci 618cabdff1aSopenharmony_ci if (!av_strcasecmp(timestr, "now")) { 619cabdff1aSopenharmony_ci *timeval = now64; 620cabdff1aSopenharmony_ci return 0; 621cabdff1aSopenharmony_ci } 622cabdff1aSopenharmony_ci 623cabdff1aSopenharmony_ci /* parse the year-month-day part */ 624cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) { 625cabdff1aSopenharmony_ci q = av_small_strptime(p, date_fmt[i], &dt); 626cabdff1aSopenharmony_ci if (q) 627cabdff1aSopenharmony_ci break; 628cabdff1aSopenharmony_ci } 629cabdff1aSopenharmony_ci 630cabdff1aSopenharmony_ci /* if the year-month-day part is missing, then take the 631cabdff1aSopenharmony_ci * current year-month-day time */ 632cabdff1aSopenharmony_ci if (!q) { 633cabdff1aSopenharmony_ci today = 1; 634cabdff1aSopenharmony_ci q = p; 635cabdff1aSopenharmony_ci } 636cabdff1aSopenharmony_ci p = q; 637cabdff1aSopenharmony_ci 638cabdff1aSopenharmony_ci if (*p == 'T' || *p == 't') 639cabdff1aSopenharmony_ci p++; 640cabdff1aSopenharmony_ci else 641cabdff1aSopenharmony_ci while (av_isspace(*p)) 642cabdff1aSopenharmony_ci p++; 643cabdff1aSopenharmony_ci 644cabdff1aSopenharmony_ci /* parse the hour-minute-second part */ 645cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) { 646cabdff1aSopenharmony_ci q = av_small_strptime(p, time_fmt[i], &dt); 647cabdff1aSopenharmony_ci if (q) 648cabdff1aSopenharmony_ci break; 649cabdff1aSopenharmony_ci } 650cabdff1aSopenharmony_ci } else { 651cabdff1aSopenharmony_ci /* parse timestr as a duration */ 652cabdff1aSopenharmony_ci if (p[0] == '-') { 653cabdff1aSopenharmony_ci negative = 1; 654cabdff1aSopenharmony_ci ++p; 655cabdff1aSopenharmony_ci } 656cabdff1aSopenharmony_ci /* parse timestr as HH:MM:SS */ 657cabdff1aSopenharmony_ci q = av_small_strptime(p, "%J:%M:%S", &dt); 658cabdff1aSopenharmony_ci if (!q) { 659cabdff1aSopenharmony_ci /* parse timestr as MM:SS */ 660cabdff1aSopenharmony_ci q = av_small_strptime(p, "%M:%S", &dt); 661cabdff1aSopenharmony_ci dt.tm_hour = 0; 662cabdff1aSopenharmony_ci } 663cabdff1aSopenharmony_ci if (!q) { 664cabdff1aSopenharmony_ci char *o; 665cabdff1aSopenharmony_ci /* parse timestr as S+ */ 666cabdff1aSopenharmony_ci errno = 0; 667cabdff1aSopenharmony_ci t = strtoll(p, &o, 10); 668cabdff1aSopenharmony_ci if (o == p) /* the parsing didn't succeed */ 669cabdff1aSopenharmony_ci return AVERROR(EINVAL); 670cabdff1aSopenharmony_ci if (errno == ERANGE) 671cabdff1aSopenharmony_ci return AVERROR(ERANGE); 672cabdff1aSopenharmony_ci q = o; 673cabdff1aSopenharmony_ci } else { 674cabdff1aSopenharmony_ci t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec; 675cabdff1aSopenharmony_ci } 676cabdff1aSopenharmony_ci } 677cabdff1aSopenharmony_ci 678cabdff1aSopenharmony_ci /* Now we have all the fields that we can get */ 679cabdff1aSopenharmony_ci if (!q) 680cabdff1aSopenharmony_ci return AVERROR(EINVAL); 681cabdff1aSopenharmony_ci 682cabdff1aSopenharmony_ci /* parse the .m... part */ 683cabdff1aSopenharmony_ci if (*q == '.') { 684cabdff1aSopenharmony_ci int n; 685cabdff1aSopenharmony_ci q++; 686cabdff1aSopenharmony_ci for (n = 100000; n >= 1; n /= 10, q++) { 687cabdff1aSopenharmony_ci if (!av_isdigit(*q)) 688cabdff1aSopenharmony_ci break; 689cabdff1aSopenharmony_ci microseconds += n * (*q - '0'); 690cabdff1aSopenharmony_ci } 691cabdff1aSopenharmony_ci while (av_isdigit(*q)) 692cabdff1aSopenharmony_ci q++; 693cabdff1aSopenharmony_ci } 694cabdff1aSopenharmony_ci 695cabdff1aSopenharmony_ci if (duration) { 696cabdff1aSopenharmony_ci if (q[0] == 'm' && q[1] == 's') { 697cabdff1aSopenharmony_ci suffix = 1000; 698cabdff1aSopenharmony_ci microseconds /= 1000; 699cabdff1aSopenharmony_ci q += 2; 700cabdff1aSopenharmony_ci } else if (q[0] == 'u' && q[1] == 's') { 701cabdff1aSopenharmony_ci suffix = 1; 702cabdff1aSopenharmony_ci microseconds = 0; 703cabdff1aSopenharmony_ci q += 2; 704cabdff1aSopenharmony_ci } else if (*q == 's') 705cabdff1aSopenharmony_ci q++; 706cabdff1aSopenharmony_ci } else { 707cabdff1aSopenharmony_ci int is_utc = *q == 'Z' || *q == 'z'; 708cabdff1aSopenharmony_ci int tzoffset = 0; 709cabdff1aSopenharmony_ci q += is_utc; 710cabdff1aSopenharmony_ci if (!today && !is_utc && (*q == '+' || *q == '-')) { 711cabdff1aSopenharmony_ci struct tm tz = { 0 }; 712cabdff1aSopenharmony_ci int sign = (*q == '+' ? -1 : 1); 713cabdff1aSopenharmony_ci q++; 714cabdff1aSopenharmony_ci p = q; 715cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(tz_fmt); i++) { 716cabdff1aSopenharmony_ci q = av_small_strptime(p, tz_fmt[i], &tz); 717cabdff1aSopenharmony_ci if (q) 718cabdff1aSopenharmony_ci break; 719cabdff1aSopenharmony_ci } 720cabdff1aSopenharmony_ci if (!q) 721cabdff1aSopenharmony_ci return AVERROR(EINVAL); 722cabdff1aSopenharmony_ci tzoffset = sign * (tz.tm_hour * 60 + tz.tm_min) * 60; 723cabdff1aSopenharmony_ci is_utc = 1; 724cabdff1aSopenharmony_ci } 725cabdff1aSopenharmony_ci if (today) { /* fill in today's date */ 726cabdff1aSopenharmony_ci struct tm dt2 = is_utc ? *gmtime_r(&now, &tmbuf) : *localtime_r(&now, &tmbuf); 727cabdff1aSopenharmony_ci dt2.tm_hour = dt.tm_hour; 728cabdff1aSopenharmony_ci dt2.tm_min = dt.tm_min; 729cabdff1aSopenharmony_ci dt2.tm_sec = dt.tm_sec; 730cabdff1aSopenharmony_ci dt = dt2; 731cabdff1aSopenharmony_ci } 732cabdff1aSopenharmony_ci dt.tm_isdst = is_utc ? 0 : -1; 733cabdff1aSopenharmony_ci t = is_utc ? av_timegm(&dt) : mktime(&dt); 734cabdff1aSopenharmony_ci t += tzoffset; 735cabdff1aSopenharmony_ci } 736cabdff1aSopenharmony_ci 737cabdff1aSopenharmony_ci /* Check that we are at the end of the string */ 738cabdff1aSopenharmony_ci if (*q) 739cabdff1aSopenharmony_ci return AVERROR(EINVAL); 740cabdff1aSopenharmony_ci 741cabdff1aSopenharmony_ci if (INT64_MAX / suffix < t || t < INT64_MIN / suffix) 742cabdff1aSopenharmony_ci return AVERROR(ERANGE); 743cabdff1aSopenharmony_ci t *= suffix; 744cabdff1aSopenharmony_ci if (INT64_MAX - microseconds < t) 745cabdff1aSopenharmony_ci return AVERROR(ERANGE); 746cabdff1aSopenharmony_ci t += microseconds; 747cabdff1aSopenharmony_ci if (t == INT64_MIN && negative) 748cabdff1aSopenharmony_ci return AVERROR(ERANGE); 749cabdff1aSopenharmony_ci *timeval = negative ? -t : t; 750cabdff1aSopenharmony_ci return 0; 751cabdff1aSopenharmony_ci} 752cabdff1aSopenharmony_ci 753cabdff1aSopenharmony_ciint av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info) 754cabdff1aSopenharmony_ci{ 755cabdff1aSopenharmony_ci const char *p; 756cabdff1aSopenharmony_ci char tag[128], *q; 757cabdff1aSopenharmony_ci 758cabdff1aSopenharmony_ci p = info; 759cabdff1aSopenharmony_ci if (*p == '?') 760cabdff1aSopenharmony_ci p++; 761cabdff1aSopenharmony_ci for(;;) { 762cabdff1aSopenharmony_ci q = tag; 763cabdff1aSopenharmony_ci while (*p != '\0' && *p != '=' && *p != '&') { 764cabdff1aSopenharmony_ci if ((q - tag) < sizeof(tag) - 1) 765cabdff1aSopenharmony_ci *q++ = *p; 766cabdff1aSopenharmony_ci p++; 767cabdff1aSopenharmony_ci } 768cabdff1aSopenharmony_ci *q = '\0'; 769cabdff1aSopenharmony_ci q = arg; 770cabdff1aSopenharmony_ci if (*p == '=') { 771cabdff1aSopenharmony_ci p++; 772cabdff1aSopenharmony_ci while (*p != '&' && *p != '\0') { 773cabdff1aSopenharmony_ci if ((q - arg) < arg_size - 1) { 774cabdff1aSopenharmony_ci if (*p == '+') 775cabdff1aSopenharmony_ci *q++ = ' '; 776cabdff1aSopenharmony_ci else 777cabdff1aSopenharmony_ci *q++ = *p; 778cabdff1aSopenharmony_ci } 779cabdff1aSopenharmony_ci p++; 780cabdff1aSopenharmony_ci } 781cabdff1aSopenharmony_ci } 782cabdff1aSopenharmony_ci *q = '\0'; 783cabdff1aSopenharmony_ci if (!strcmp(tag, tag1)) 784cabdff1aSopenharmony_ci return 1; 785cabdff1aSopenharmony_ci if (*p != '&') 786cabdff1aSopenharmony_ci break; 787cabdff1aSopenharmony_ci p++; 788cabdff1aSopenharmony_ci } 789cabdff1aSopenharmony_ci return 0; 790cabdff1aSopenharmony_ci} 791