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 | static void parse_global_config(struct global_config *global, char **argv) | 1562 | static void parse_global_config(struct global_config *global, char **argv) |
| 1546 | { | 1563 | { |
| 1547 | char **argi, **argj; | 1564 | char **argi, **argj; |
| @@ -1610,6 +1627,7 @@ static void parse_global_config(struct global_config *global, char **argv) · 62 unmodified lines | |||
| 1610 | else if (arg_match(&arg, &framerate, argi)) | 1627 | else if (arg_match(&arg, &framerate, argi)) |
| 1611 | { | 1628 | { |
| 1612 | global->framerate = arg_parse_rational(&arg); | 1629 | global->framerate = arg_parse_rational(&arg); |
| 1630 | validate_positive_rational(arg.name, &global->framerate); | ||
| 1613 | global->have_framerate = 1; | 1631 | global->have_framerate = 1; |
| 1614 | } | 1632 | } |
| 1615 | else if (arg_match(&arg,&out_part, argi)) | 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 | else if (arg_match(&arg, &stereo_mode, argi)) | 1825 | else if (arg_match(&arg, &stereo_mode, argi)) |
| 1808 | config->stereo_fmt = arg_parse_enum_or_int(&arg); | 1826 | config->stereo_fmt = arg_parse_enum_or_int(&arg); |
| 1809 | else if (arg_match(&arg, &timebase, argi)) | 1827 | else if (arg_match(&arg, &timebase, argi)) |
| 1828 | { | ||
| 1810 | config->cfg.g_timebase = arg_parse_rational(&arg); | 1829 | config->cfg.g_timebase = arg_parse_rational(&arg); |
| 1830 | validate_positive_rational(arg.name, &config->cfg.g_timebase); | ||
| 1831 | } | ||
| 1811 | else if (arg_match(&arg, &error_resilient, argi)) | 1832 | else if (arg_match(&arg, &error_resilient, argi)) |
| 1812 | config->cfg.g_error_resilient = arg_parse_uint(&arg); | 1833 | config->cfg.g_error_resilient = arg_parse_uint(&arg); |
| 1813 | else if (arg_match(&arg, &lag_in_frames, argi)) | 1834 | else if (arg_match(&arg, &lag_in_frames, argi)) |