Trap negative values and zero denominators at the point where they're parsed.
Unified · Split
| @@ -1542,6 +1542,23 @@ struct stream_state · 1541 unmodified lines | ||
| 1542 | 1542 | }; |
| 1543 | 1543 | |
| 1544 | 1544 | |
| 1545 | +void validate_positive_rational(const char *msg, | |
| 1546 | + struct vpx_rational *rat) | |
| 1547 | +{ | |
| 1548 | + if (rat->den < 0) | |
| 1549 | + { | |
| 1550 | + rat->num *= -1; | |
| 1551 | + rat->den *= -1; | |
| 1552 | + } | |
| 1553 | + | |
| 1554 | + if (rat->num < 0) | |
| 1555 | + die("Error: %s must be positive\n", msg); | |
| 1556 | + | |
| 1557 | + if (!rat->den) | |
| 1558 | + die("Error: %s has zero denominator\n", msg); | |
| 1559 | +} | |
| 1560 | + | |
| 1561 | + | |
| 1545 | 1562 | static void parse_global_config(struct global_config *global, char **argv) |
| 1546 | 1563 | { |
| 1547 | 1564 | char **argi, **argj; |
| @@ -1610,6 +1627,7 @@ static void parse_global_config(struct global_config *global, char **argv) · 62 unmodified lines | ||
| 1610 | 1627 | else if (arg_match(&arg, &framerate, argi)) |
| 1611 | 1628 | { |
| 1612 | 1629 | global->framerate = arg_parse_rational(&arg); |
| 1630 | + validate_positive_rational(arg.name, &global->framerate); | |
| 1613 | 1631 | global->have_framerate = 1; |
| 1614 | 1632 | } |
| 1615 | 1633 | else if (arg_match(&arg,&out_part, argi)) |
| @@ -1807,7 +1825,10 @@ static int parse_stream_params(struct global_config *global, · 191 unmodified lines | ||
| 1807 | 1825 | else if (arg_match(&arg, &stereo_mode, argi)) |
| 1808 | 1826 | config->stereo_fmt = arg_parse_enum_or_int(&arg); |
| 1809 | 1827 | else if (arg_match(&arg, &timebase, argi)) |
| 1828 | + { | |
| 1810 | 1829 | config->cfg.g_timebase = arg_parse_rational(&arg); |
| 1830 | + validate_positive_rational(arg.name, &config->cfg.g_timebase); | |
| 1831 | + } | |
| 1811 | 1832 | else if (arg_match(&arg, &error_resilient, argi)) |
| 1812 | 1833 | config->cfg.g_error_resilient = arg_parse_uint(&arg); |
| 1813 | 1834 | else if (arg_match(&arg, &lag_in_frames, argi)) |