36 #define av_get_random_seed av_get_random_seed_deterministic 37 static uint32_t av_get_random_seed_deterministic(
void);
39 #define time(t) 1331972053 44 int log_offset,
void *log_ctx)
49 if (sscanf(str,
"%d:%d%c", &q->
num, &q->
den, &c) != 2) {
53 NULL, log_offset, log_ctx);
77 {
"qntsc", 352, 240 },
79 {
"sntsc", 640, 480 },
82 {
"ntsc-film", 352, 240 },
87 {
"16cif", 1408,1152 },
88 {
"qqvga", 160, 120 },
93 {
"uxga", 1600,1200 },
94 {
"qxga", 2048,1536 },
95 {
"sxga", 1280,1024 },
96 {
"qsxga", 2560,2048 },
97 {
"hsxga", 5120,4096 },
99 {
"wxga", 1366, 768 },
100 {
"wsxga", 1600,1024 },
101 {
"wuxga", 1920,1200 },
102 {
"woxga", 2560,1600 },
103 {
"wqsxga", 3200,2048 },
104 {
"wquxga", 3840,2400 },
105 {
"whsxga", 6400,4096 },
106 {
"whuxga", 7680,4800 },
109 {
"hd480", 852, 480 },
110 {
"hd720", 1280, 720 },
111 {
"hd1080", 1920,1080 },
113 {
"2kflat", 1998,1080 },
114 {
"2kscope", 2048, 858 },
116 {
"4kflat", 3996,2160 },
117 {
"4kscope", 4096,1716 },
121 {
"ntsc", { 30000, 1001 } },
122 {
"pal", { 25, 1 } },
123 {
"qntsc", { 30000, 1001 } },
124 {
"qpal", { 25, 1 } },
125 {
"sntsc", { 30000, 1001 } },
126 {
"spal", { 25, 1 } },
127 {
"film", { 24, 1 } },
128 {
"ntsc-film", { 24000, 1001 } },
138 for (i = 0; i <
n; i++) {
139 if (!strcmp(video_size_abbrs[i].abbr, str)) {
140 width = video_size_abbrs[
i].
width;
146 width = strtol(str, (
void*)&p, 10);
149 height = strtol(p, (
void*)&p, 10);
155 if (width <= 0 ||
height <= 0)
168 for (i = 0; i <
n; ++
i)
169 if (!strcmp(video_rate_abbrs[i].abbr, arg)) {
170 *rate = video_rate_abbrs[
i].
rate;
177 if (rate->
num <= 0 || rate->
den <= 0)
188 {
"AliceBlue", { 0xF0, 0xF8, 0xFF } },
189 {
"AntiqueWhite", { 0xFA, 0xEB, 0xD7 } },
190 {
"Aqua", { 0x00, 0xFF, 0xFF } },
191 {
"Aquamarine", { 0x7F, 0xFF, 0xD4 } },
192 {
"Azure", { 0xF0, 0xFF, 0xFF } },
193 {
"Beige", { 0xF5, 0xF5, 0xDC } },
194 {
"Bisque", { 0xFF, 0xE4, 0xC4 } },
195 {
"Black", { 0x00, 0x00, 0x00 } },
196 {
"BlanchedAlmond", { 0xFF, 0xEB, 0xCD } },
197 {
"Blue", { 0x00, 0x00, 0xFF } },
198 {
"BlueViolet", { 0x8A, 0x2B, 0xE2 } },
199 {
"Brown", { 0xA5, 0x2A, 0x2A } },
200 {
"BurlyWood", { 0xDE, 0xB8, 0x87 } },
201 {
"CadetBlue", { 0x5F, 0x9E, 0xA0 } },
202 {
"Chartreuse", { 0x7F, 0xFF, 0x00 } },
203 {
"Chocolate", { 0xD2, 0x69, 0x1E } },
204 {
"Coral", { 0xFF, 0x7F, 0x50 } },
205 {
"CornflowerBlue", { 0x64, 0x95, 0xED } },
206 {
"Cornsilk", { 0xFF, 0xF8, 0xDC } },
207 {
"Crimson", { 0xDC, 0x14, 0x3C } },
208 {
"Cyan", { 0x00, 0xFF, 0xFF } },
209 {
"DarkBlue", { 0x00, 0x00, 0x8B } },
210 {
"DarkCyan", { 0x00, 0x8B, 0x8B } },
211 {
"DarkGoldenRod", { 0xB8, 0x86, 0x0B } },
212 {
"DarkGray", { 0xA9, 0xA9, 0xA9 } },
213 {
"DarkGreen", { 0x00, 0x64, 0x00 } },
214 {
"DarkKhaki", { 0xBD, 0xB7, 0x6B } },
215 {
"DarkMagenta", { 0x8B, 0x00, 0x8B } },
216 {
"DarkOliveGreen", { 0x55, 0x6B, 0x2F } },
217 {
"Darkorange", { 0xFF, 0x8C, 0x00 } },
218 {
"DarkOrchid", { 0x99, 0x32, 0xCC } },
219 {
"DarkRed", { 0x8B, 0x00, 0x00 } },
220 {
"DarkSalmon", { 0xE9, 0x96, 0x7A } },
221 {
"DarkSeaGreen", { 0x8F, 0xBC, 0x8F } },
222 {
"DarkSlateBlue", { 0x48, 0x3D, 0x8B } },
223 {
"DarkSlateGray", { 0x2F, 0x4F, 0x4F } },
224 {
"DarkTurquoise", { 0x00, 0xCE, 0xD1 } },
225 {
"DarkViolet", { 0x94, 0x00, 0xD3 } },
226 {
"DeepPink", { 0xFF, 0x14, 0x93 } },
227 {
"DeepSkyBlue", { 0x00, 0xBF, 0xFF } },
228 {
"DimGray", { 0x69, 0x69, 0x69 } },
229 {
"DodgerBlue", { 0x1E, 0x90, 0xFF } },
230 {
"FireBrick", { 0xB2, 0x22, 0x22 } },
231 {
"FloralWhite", { 0xFF, 0xFA, 0xF0 } },
232 {
"ForestGreen", { 0x22, 0x8B, 0x22 } },
233 {
"Fuchsia", { 0xFF, 0x00, 0xFF } },
234 {
"Gainsboro", { 0xDC, 0xDC, 0xDC } },
235 {
"GhostWhite", { 0xF8, 0xF8, 0xFF } },
236 {
"Gold", { 0xFF, 0xD7, 0x00 } },
237 {
"GoldenRod", { 0xDA, 0xA5, 0x20 } },
238 {
"Gray", { 0x80, 0x80, 0x80 } },
239 {
"Green", { 0x00, 0x80, 0x00 } },
240 {
"GreenYellow", { 0xAD, 0xFF, 0x2F } },
241 {
"HoneyDew", { 0xF0, 0xFF, 0xF0 } },
242 {
"HotPink", { 0xFF, 0x69, 0xB4 } },
243 {
"IndianRed", { 0xCD, 0x5C, 0x5C } },
244 {
"Indigo", { 0x4B, 0x00, 0x82 } },
245 {
"Ivory", { 0xFF, 0xFF, 0xF0 } },
246 {
"Khaki", { 0xF0, 0xE6, 0x8C } },
247 {
"Lavender", { 0xE6, 0xE6, 0xFA } },
248 {
"LavenderBlush", { 0xFF, 0xF0, 0xF5 } },
249 {
"LawnGreen", { 0x7C, 0xFC, 0x00 } },
250 {
"LemonChiffon", { 0xFF, 0xFA, 0xCD } },
251 {
"LightBlue", { 0xAD, 0xD8, 0xE6 } },
252 {
"LightCoral", { 0xF0, 0x80, 0x80 } },
253 {
"LightCyan", { 0xE0, 0xFF, 0xFF } },
254 {
"LightGoldenRodYellow", { 0xFA, 0xFA, 0xD2 } },
255 {
"LightGreen", { 0x90, 0xEE, 0x90 } },
256 {
"LightGrey", { 0xD3, 0xD3, 0xD3 } },
257 {
"LightPink", { 0xFF, 0xB6, 0xC1 } },
258 {
"LightSalmon", { 0xFF, 0xA0, 0x7A } },
259 {
"LightSeaGreen", { 0x20, 0xB2, 0xAA } },
260 {
"LightSkyBlue", { 0x87, 0xCE, 0xFA } },
261 {
"LightSlateGray", { 0x77, 0x88, 0x99 } },
262 {
"LightSteelBlue", { 0xB0, 0xC4, 0xDE } },
263 {
"LightYellow", { 0xFF, 0xFF, 0xE0 } },
264 {
"Lime", { 0x00, 0xFF, 0x00 } },
265 {
"LimeGreen", { 0x32, 0xCD, 0x32 } },
266 {
"Linen", { 0xFA, 0xF0, 0xE6 } },
267 {
"Magenta", { 0xFF, 0x00, 0xFF } },
268 {
"Maroon", { 0x80, 0x00, 0x00 } },
269 {
"MediumAquaMarine", { 0x66, 0xCD, 0xAA } },
270 {
"MediumBlue", { 0x00, 0x00, 0xCD } },
271 {
"MediumOrchid", { 0xBA, 0x55, 0xD3 } },
272 {
"MediumPurple", { 0x93, 0x70, 0xD8 } },
273 {
"MediumSeaGreen", { 0x3C, 0xB3, 0x71 } },
274 {
"MediumSlateBlue", { 0x7B, 0x68, 0xEE } },
275 {
"MediumSpringGreen", { 0x00, 0xFA, 0x9A } },
276 {
"MediumTurquoise", { 0x48, 0xD1, 0xCC } },
277 {
"MediumVioletRed", { 0xC7, 0x15, 0x85 } },
278 {
"MidnightBlue", { 0x19, 0x19, 0x70 } },
279 {
"MintCream", { 0xF5, 0xFF, 0xFA } },
280 {
"MistyRose", { 0xFF, 0xE4, 0xE1 } },
281 {
"Moccasin", { 0xFF, 0xE4, 0xB5 } },
282 {
"NavajoWhite", { 0xFF, 0xDE, 0xAD } },
283 {
"Navy", { 0x00, 0x00, 0x80 } },
284 {
"OldLace", { 0xFD, 0xF5, 0xE6 } },
285 {
"Olive", { 0x80, 0x80, 0x00 } },
286 {
"OliveDrab", { 0x6B, 0x8E, 0x23 } },
287 {
"Orange", { 0xFF, 0xA5, 0x00 } },
288 {
"OrangeRed", { 0xFF, 0x45, 0x00 } },
289 {
"Orchid", { 0xDA, 0x70, 0xD6 } },
290 {
"PaleGoldenRod", { 0xEE, 0xE8, 0xAA } },
291 {
"PaleGreen", { 0x98, 0xFB, 0x98 } },
292 {
"PaleTurquoise", { 0xAF, 0xEE, 0xEE } },
293 {
"PaleVioletRed", { 0xD8, 0x70, 0x93 } },
294 {
"PapayaWhip", { 0xFF, 0xEF, 0xD5 } },
295 {
"PeachPuff", { 0xFF, 0xDA, 0xB9 } },
296 {
"Peru", { 0xCD, 0x85, 0x3F } },
297 {
"Pink", { 0xFF, 0xC0, 0xCB } },
298 {
"Plum", { 0xDD, 0xA0, 0xDD } },
299 {
"PowderBlue", { 0xB0, 0xE0, 0xE6 } },
300 {
"Purple", { 0x80, 0x00, 0x80 } },
301 {
"Red", { 0xFF, 0x00, 0x00 } },
302 {
"RosyBrown", { 0xBC, 0x8F, 0x8F } },
303 {
"RoyalBlue", { 0x41, 0x69, 0xE1 } },
304 {
"SaddleBrown", { 0x8B, 0x45, 0x13 } },
305 {
"Salmon", { 0xFA, 0x80, 0x72 } },
306 {
"SandyBrown", { 0xF4, 0xA4, 0x60 } },
307 {
"SeaGreen", { 0x2E, 0x8B, 0x57 } },
308 {
"SeaShell", { 0xFF, 0xF5, 0xEE } },
309 {
"Sienna", { 0xA0, 0x52, 0x2D } },
310 {
"Silver", { 0xC0, 0xC0, 0xC0 } },
311 {
"SkyBlue", { 0x87, 0xCE, 0xEB } },
312 {
"SlateBlue", { 0x6A, 0x5A, 0xCD } },
313 {
"SlateGray", { 0x70, 0x80, 0x90 } },
314 {
"Snow", { 0xFF, 0xFA, 0xFA } },
315 {
"SpringGreen", { 0x00, 0xFF, 0x7F } },
316 {
"SteelBlue", { 0x46, 0x82, 0xB4 } },
317 {
"Tan", { 0xD2, 0xB4, 0x8C } },
318 {
"Teal", { 0x00, 0x80, 0x80 } },
319 {
"Thistle", { 0xD8, 0xBF, 0xD8 } },
320 {
"Tomato", { 0xFF, 0x63, 0x47 } },
321 {
"Turquoise", { 0x40, 0xE0, 0xD0 } },
322 {
"Violet", { 0xEE, 0x82, 0xEE } },
323 {
"Wheat", { 0xF5, 0xDE, 0xB3 } },
324 {
"White", { 0xFF, 0xFF, 0xFF } },
325 {
"WhiteSmoke", { 0xF5, 0xF5, 0xF5 } },
326 {
"Yellow", { 0xFF, 0xFF, 0x00 } },
327 {
"YellowGreen", { 0x9A, 0xCD, 0x32 } },
335 #define ALPHA_SEP '@' 340 char *tail, color_string2[128];
342 int len, hex_offset = 0;
344 if (color_string[0] ==
'#') {
346 }
else if (!strncmp(color_string,
"0x", 2))
350 slen = strlen(color_string);
351 av_strlcpy(color_string2, color_string + hex_offset,
352 FFMIN(slen-hex_offset+1,
sizeof(color_string2)));
353 if ((tail = strchr(color_string2,
ALPHA_SEP)))
355 len = strlen(color_string2);
360 rgba_color[0] = rgba >> 24;
361 rgba_color[1] = rgba >> 16;
362 rgba_color[2] = rgba >> 8;
363 rgba_color[3] = rgba;
364 }
else if (hex_offset ||
365 strspn(color_string2,
"0123456789ABCDEFabcdef") == len) {
367 unsigned int rgba = strtoul(color_string2, &tail, 16);
369 if (*tail || (len != 6 && len != 8)) {
370 av_log(log_ctx,
AV_LOG_ERROR,
"Invalid 0xRRGGBB[AA] color string: '%s'\n", color_string2);
374 rgba_color[3] = rgba;
377 rgba_color[0] = rgba >> 16;
378 rgba_color[1] = rgba >> 8;
379 rgba_color[2] = rgba;
381 entry = bsearch(color_string2,
395 const char *alpha_string = tail;
396 if (!strncmp(alpha_string,
"0x", 2)) {
397 alpha = strtoul(alpha_string, &tail, 16);
399 double norm_alpha =
strtod(alpha_string, &tail);
400 if (norm_alpha < 0.0 || norm_alpha > 1.0)
403 alpha = 255 * norm_alpha;
406 if (tail == alpha_string || *tail || alpha > 255 || alpha < 0) {
408 alpha_string, color_string);
411 rgba_color[3] =
alpha;
420 int n_min,
int n_max,
int len_max)
427 for(i = 0; i < len_max; i++) {
431 val = (val * 10) + c -
'0';
437 if (val < n_min || val > n_max)
457 }
else if (c ==
'%') {
483 dt->tm_year = val - 1900;
489 dt->tm_mon = val - 1;
515 int y = tm->tm_year + 1900,
m = tm->tm_mon + 1,
d = tm->tm_mday;
523 (
d + (153 *
m - 457) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 719469);
525 t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;
535 struct tm dt = { 0 };
536 int today = 0, negative = 0, microseconds = 0;
538 static const char *
const date_fmt[] = {
542 static const char *
const time_fmt[] = {
549 *timeval = INT64_MIN;
554 *timeval = (int64_t) now * 1000000;
573 if (*p ==
'T' || *p ==
't' || *p ==
' ')
597 dt.tm_sec = strtol(p, (
void *)&q, 10);
613 for (n = 100000; n >= 1; n /= 10, q++) {
616 microseconds += n * (*q -
'0');
623 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
625 int is_utc = *q ==
'Z' || *q ==
'z';
628 struct tm dt2 = is_utc ? *gmtime(&now) : *localtime(&now);
629 dt2.tm_hour = dt.tm_hour;
630 dt2.tm_min = dt.tm_min;
631 dt2.tm_sec = dt.tm_sec;
634 t = is_utc ?
av_timegm(&dt) : mktime(&dt);
643 *timeval = negative ? -t :
t;
657 while (*p !=
'\0' && *p !=
'=' && *p !=
'&') {
658 if ((q - tag) <
sizeof(tag) - 1)
666 while (*p !=
'&' && *p !=
'\0') {
667 if ((q - arg) < arg_size - 1) {
677 if (!strcmp(tag, tag1))
688 static uint32_t randomv =
MKTAG(
'L',
'A',
'V',
'U');
690 static uint32_t av_get_random_seed_deterministic(
void)
692 return randomv = randomv * 1664525 + 1013904223;
697 printf(
"Testing av_parse_video_rate()\n");
700 static const char *
const rates[] = {
732 printf(
"'%s' -> %d/%d %s\n",
733 rates[i], q.
num, q.
den, ret ?
"ERROR" :
"OK");
737 printf(
"\nTesting av_parse_color()\n");
741 static const char *
const color_names[] = {
784 printf(
"%s -> R(%d) G(%d) B(%d) A(%d)\n",
785 color_names[i], rgba[0], rgba[1], rgba[2], rgba[3]);
787 printf(
"%s -> error\n", color_names[i]);
791 printf(
"\nTesting av_small_strptime()\n");
794 struct tm tm = { 0 };
795 struct fmt_timespec_entry {
796 const char *
fmt, *timespec;
797 } fmt_timespec_entries[] = {
798 {
"%Y-%m-%d",
"2012-12-21" },
799 {
"%Y - %m - %d",
"2012-12-21" },
800 {
"%Y-%m-%d %H:%M:%S",
"2012-12-21 20:12:21" },
801 {
" %Y - %m - %d %H : %M : %S",
" 2012 - 12 - 21 20 : 12 : 21" },
807 struct fmt_timespec_entry *e = &fmt_timespec_entries[
i];
808 printf(
"fmt:'%s' spec:'%s' -> ", e->fmt, e->timespec);
811 printf(
"%04d-%02d-%2d %02d:%02d:%02d\n",
812 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
813 tm.tm_hour, tm.tm_min, tm.tm_sec);
820 printf(
"\nTesting av_parse_time()\n");
826 static char tzstr[] =
"TZ=CET-1";
827 const char *time_string[] = {
830 "2000-12-20 0:02:47.5z",
831 "2000-12-20T010247.6",
833 const char *duration_string[] = {
843 printf(
"(now is 2012-03-17 09:14:13 +0100, local time is UTC+1)\n");
845 printf(
"%-24s -> ", time_string[i]);
851 printf(
"%14"PRIi64
".%06d = %04d-%02d-%02dT%02d:%02d:%02dZ\n",
852 tv / 1000000, (
int)(tv % 1000000),
853 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
854 tm->tm_hour, tm->tm_min, tm->tm_sec);
858 printf(
"%-24s -> ", duration_string[i]);
862 printf(
"%+21"PRIi64
"\n", tv);
time_t av_timegm(struct tm *tm)
Convert the decomposed UTC time in tm to a time_t value.
int av_parse_ratio(AVRational *q, const char *str, int max, int log_offset, void *log_ctx)
Parse str and store the parsed ratio in q.
const char * name
a string representing the name of the color
int av_parse_video_rate(AVRational *rate, const char *arg)
Parse str and store the detected values in *rate.
int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str)
Parse str and put in width_ptr and height_ptr the detected values.
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
Parse timestr and return in *time a corresponding number of microseconds.
if max(w)>1 w=0.9 *w/max(w)
int av_isdigit(int c)
Locale-independent conversion of ASCII isdigit.
#define FF_ARRAY_ELEMS(a)
char * av_small_strptime(const char *p, const char *fmt, struct tm *dt)
Parse the input string p according to the format string fmt and store its results in the structure dt...
double strtod(const char *, char **)
int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
Attempt to find a specific tag in a URL.
uint8_t rgb_color[3]
RGB values for the color.
int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, void *log_ctx)
Put the RGBA values that correspond to color_string in rgba_color.
int av_expr_parse_and_eval(double *d, const char *s, const char *const *const_names, const double *const_values, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), void *opaque, int log_offset, void *log_ctx)
Parse and evaluate an expression.
static double alpha(void *priv, double x, double y)
void av_log(void *avcl, int level, const char *fmt,...)
void av_log_set_level(int level)
int av_isspace(int c)
Locale-independent conversion of ASCII isspace.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
static int color_table_compare(const void *lhs, const void *rhs)
static const ColorEntry color_table[]
static const VideoRateAbbr video_rate_abbrs[]
static int date_get_num(const char **pp, int n_min, int n_max, int len_max)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
BYTE int const BYTE int int int height
synthesis window for stochastic i
rational number numerator/denominator
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static const VideoSizeAbbr video_size_abbrs[]
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
common internal and external API header
printf("static const uint8_t my_array[100] = {\n")
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
int main(int argc, char **argv)
#define MKTAG(a, b, c, d)
#define av_parse_ratio_quiet(rate, str, max)
simple arithmetic expression evaluator