| @@ -256,7 +256,7 @@ int av_opt_set(void *obj, const char *name, const char *val, int search_flags) · 255 unmodified lines |
| 256 | 256 | return AVERROR_OPTION_NOT_FOUND; |
| 257 | 257 | if (!val && (o->type != AV_OPT_TYPE_STRING && |
| 258 | 258 | o->type != AV_OPT_TYPE_PIXEL_FMT && o->type != AV_OPT_TYPE_SAMPLE_FMT && |
| 259 | | − o->type != AV_OPT_TYPE_IMAGE_SIZE)) |
| 259 | + o->type != AV_OPT_TYPE_IMAGE_SIZE && o->type != AV_OPT_TYPE_VIDEO_RATE)) |
| 260 | 260 | return AVERROR(EINVAL); |
| 261 | 261 | |
| 262 | 262 | dst = ((uint8_t*)target_obj) + o->offset; |
| @@ -278,6 +278,15 @@ int av_opt_set(void *obj, const char *name, const char *val, int search_flags) · 15 unmodified lines |
| 278 | 278 | if (ret < 0) |
| 279 | 279 | av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as image size\n", val); |
| 280 | 280 | return ret; |
| 281 | + case AV_OPT_TYPE_VIDEO_RATE: |
| 282 | + if (!val) { |
| 283 | + ret = AVERROR(EINVAL); |
| 284 | + } else { |
| 285 | + ret = av_parse_video_rate(dst, val); |
| 286 | + } |
| 287 | + if (ret < 0) |
| 288 | + av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as video rate\n", val); |
| 289 | + return ret; |
| 281 | 290 | case AV_OPT_TYPE_PIXEL_FMT: |
| 282 | 291 | if (!val || !strcmp(val, "none")) { |
| 283 | 292 | ret = AV_PIX_FMT_NONE; |
| @@ -436,6 +445,23 @@ int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_ · 152 unmodified lines |
| 436 | 445 | return 0; |
| 437 | 446 | } |
| 438 | 447 | |
| 448 | +int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags) |
| 449 | +{ |
| 450 | + void *target_obj; |
| 451 | + const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); |
| 452 | + |
| 453 | + if (!o || !target_obj) |
| 454 | + return AVERROR_OPTION_NOT_FOUND; |
| 455 | + if (o->type != AV_OPT_TYPE_VIDEO_RATE) { |
| 456 | + av_log(obj, AV_LOG_ERROR, |
| 457 | + "The value set by option '%s' is not a video rate.\n", o->name); |
| 458 | + return AVERROR(EINVAL); |
| 459 | + } |
| 460 | + if (val.num <= 0 || val.den <= 0) |
| 461 | + return AVERROR(EINVAL); |
| 462 | + return set_number(obj, name, val.num, val.den, 1, search_flags); |
| 463 | +} |
| 464 | + |
| 439 | 465 | static int set_format(void *obj, const char *name, int fmt, int search_flags, |
| 440 | 466 | enum AVOptionType type, const char *desc, int nb_fmts) |
| 441 | 467 | { |
| @@ -543,6 +569,7 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) · 101 unmodified lines |
| 543 | 569 | case AV_OPT_TYPE_INT64: ret = snprintf(buf, sizeof(buf), "%"PRId64, *(int64_t*)dst);break; |
| 544 | 570 | case AV_OPT_TYPE_FLOAT: ret = snprintf(buf, sizeof(buf), "%f" , *(float *)dst);break; |
| 545 | 571 | case AV_OPT_TYPE_DOUBLE: ret = snprintf(buf, sizeof(buf), "%f" , *(double *)dst);break; |
| 572 | + case AV_OPT_TYPE_VIDEO_RATE: |
| 546 | 573 | case AV_OPT_TYPE_RATIONAL: ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break; |
| 547 | 574 | case AV_OPT_TYPE_CONST: ret = snprintf(buf, sizeof(buf), "%f" , o->default_val.dbl);break; |
| 548 | 575 | case AV_OPT_TYPE_STRING: |
| @@ -695,6 +722,22 @@ int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_ · 146 unmodified lines |
| 695 | 722 | return 0; |
| 696 | 723 | } |
| 697 | 724 | |
| 725 | +int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val) |
| 726 | +{ |
| 727 | + int64_t intnum = 1; |
| 728 | + double num = 1; |
| 729 | + int ret, den = 1; |
| 730 | + |
| 731 | + if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0) |
| 732 | + return ret; |
| 733 | + |
| 734 | + if (num == 1.0 && (int)intnum == intnum) |
| 735 | + *out_val = (AVRational){intnum, den}; |
| 736 | + else |
| 737 | + *out_val = av_d2q(num*intnum/den, 1<<24); |
| 738 | + return 0; |
| 739 | +} |
| 740 | + |
| 698 | 741 | static int get_format(void *obj, const char *name, int search_flags, int *out_fmt, |
| 699 | 742 | enum AVOptionType type, const char *desc) |
| 700 | 743 | { |
| @@ -809,6 +852,9 @@ static void opt_list(void *obj, void *av_log_obj, const char *unit, · 108 unmodified lines |
| 809 | 852 | case AV_OPT_TYPE_IMAGE_SIZE: |
| 810 | 853 | av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<image_size>"); |
| 811 | 854 | break; |
| 855 | + case AV_OPT_TYPE_VIDEO_RATE: |
| 856 | + av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<video_rate>"); |
| 857 | + break; |
| 812 | 858 | case AV_OPT_TYPE_PIXEL_FMT: |
| 813 | 859 | av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<pix_fmt>"); |
| 814 | 860 | break; |
| @@ -908,6 +954,7 @@ void av_opt_set_defaults2(void *s, int mask, int flags) · 93 unmodified lines |
| 908 | 954 | break; |
| 909 | 955 | case AV_OPT_TYPE_STRING: |
| 910 | 956 | case AV_OPT_TYPE_IMAGE_SIZE: |
| 957 | + case AV_OPT_TYPE_VIDEO_RATE: |
| 911 | 958 | av_opt_set(s, opt->name, opt->default_val.str, 0); |
| 912 | 959 | break; |
| 913 | 960 | case AV_OPT_TYPE_PIXEL_FMT: |
| @@ -1270,6 +1317,12 @@ int av_opt_query_ranges_default(AVOptionRanges **ranges_arg, void *obj, const ch · 356 unmodified lines |
| 1270 | 1317 | range->value_min = 0; |
| 1271 | 1318 | range->value_max = INT_MAX/8; |
| 1272 | 1319 | break; |
| 1320 | + case AV_OPT_TYPE_VIDEO_RATE: |
| 1321 | + range->component_min = 1; |
| 1322 | + range->component_max = INT_MAX; |
| 1323 | + range->value_min = 1; |
| 1324 | + range->value_max = INT_MAX; |
| 1325 | + break; |
| 1273 | 1326 | default: |
| 1274 | 1327 | ret = AVERROR(ENOSYS); |
| 1275 | 1328 | goto fail; |
| @@ -1331,6 +1384,7 @@ static const AVOption test_options[]= { · 55 unmodified lines |
| 1331 | 1384 | {"size", "set size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE,{0}, 0, 0 }, |
| 1332 | 1385 | {"pix_fmt", "set pixfmt", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, -1, AV_PIX_FMT_NB-1}, |
| 1333 | 1386 | {"sample_fmt", "set samplefmt", OFFSET(sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64 = AV_SAMPLE_FMT_NONE}, -1, AV_SAMPLE_FMT_NB-1}, |
| 1387 | +{"video_rate", "set videorate", OFFSET(video_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0 }, |
| 1334 | 1388 | {NULL}, |
| 1335 | 1389 | }; |
| 1336 | 1390 | |
| @@ -1381,6 +1435,11 @@ int main(void) · 44 unmodified lines |
| 1381 | 1435 | "sample_fmt=s16", |
| 1382 | 1436 | "sample_fmt=2", |
| 1383 | 1437 | "sample_fmt=bogus", |
| 1438 | + "video_rate=pal", |
| 1439 | + "video_rate=25", |
| 1440 | + "video_rate=30000/1001", |
| 1441 | + "video_rate=30/1.001", |
| 1442 | + "video_rate=bogus", |
| 1384 | 1443 | }; |
| 1385 | 1444 | |
| 1386 | 1445 | test_ctx.class = &test_class; |