| @@ -256,7 +256,7 @@ int av_opt_set(void *obj, const char *name, const char *val, int search_flags) · 255 unmodified lines |
| 256 | return AVERROR_OPTION_NOT_FOUND; | 256 | return AVERROR_OPTION_NOT_FOUND; |
| 257 | if (!val && (o->type != AV_OPT_TYPE_STRING && | 257 | if (!val && (o->type != AV_OPT_TYPE_STRING && |
| 258 | o->type != AV_OPT_TYPE_PIXEL_FMT && o->type != AV_OPT_TYPE_SAMPLE_FMT && | 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 | return AVERROR(EINVAL); | 260 | return AVERROR(EINVAL); |
| 261 | | 261 | |
| 262 | dst = ((uint8_t*)target_obj) + o->offset; | 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 | if (ret < 0) | 278 | if (ret < 0) |
| 279 | av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as image size\n", val); | 279 | av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as image size\n", val); |
| 280 | return ret; | 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 | case AV_OPT_TYPE_PIXEL_FMT: | 290 | case AV_OPT_TYPE_PIXEL_FMT: |
| 282 | if (!val || !strcmp(val, "none")) { | 291 | if (!val || !strcmp(val, "none")) { |
| 283 | ret = AV_PIX_FMT_NONE; | 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 | return 0; | 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 | static int set_format(void *obj, const char *name, int fmt, int search_flags, | 465 | static int set_format(void *obj, const char *name, int fmt, int search_flags, |
| 440 | enum AVOptionType type, const char *desc, int nb_fmts) | 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 | case AV_OPT_TYPE_INT64: ret = snprintf(buf, sizeof(buf), "%"PRId64, *(int64_t*)dst);break; | 569 | case AV_OPT_TYPE_INT64: ret = snprintf(buf, sizeof(buf), "%"PRId64, *(int64_t*)dst);break; |
| 544 | case AV_OPT_TYPE_FLOAT: ret = snprintf(buf, sizeof(buf), "%f" , *(float *)dst);break; | 570 | case AV_OPT_TYPE_FLOAT: ret = snprintf(buf, sizeof(buf), "%f" , *(float *)dst);break; |
| 545 | case AV_OPT_TYPE_DOUBLE: ret = snprintf(buf, sizeof(buf), "%f" , *(double *)dst);break; | 571 | case AV_OPT_TYPE_DOUBLE: ret = snprintf(buf, sizeof(buf), "%f" , *(double *)dst);break; |
| | 572 | case AV_OPT_TYPE_VIDEO_RATE: |
| 546 | case AV_OPT_TYPE_RATIONAL: ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break; | 573 | case AV_OPT_TYPE_RATIONAL: ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break; |
| 547 | case AV_OPT_TYPE_CONST: ret = snprintf(buf, sizeof(buf), "%f" , o->default_val.dbl);break; | 574 | case AV_OPT_TYPE_CONST: ret = snprintf(buf, sizeof(buf), "%f" , o->default_val.dbl);break; |
| 548 | case AV_OPT_TYPE_STRING: | 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 | return 0; | 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 | static int get_format(void *obj, const char *name, int search_flags, int *out_fmt, | 741 | static int get_format(void *obj, const char *name, int search_flags, int *out_fmt, |
| 699 | enum AVOptionType type, const char *desc) | 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 | case AV_OPT_TYPE_IMAGE_SIZE: | 852 | case AV_OPT_TYPE_IMAGE_SIZE: |
| 810 | av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<image_size>"); | 853 | av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<image_size>"); |
| 811 | break; | 854 | break; |
| | 855 | case AV_OPT_TYPE_VIDEO_RATE: |
| | 856 | av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<video_rate>"); |
| | 857 | break; |
| 812 | case AV_OPT_TYPE_PIXEL_FMT: | 858 | case AV_OPT_TYPE_PIXEL_FMT: |
| 813 | av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<pix_fmt>"); | 859 | av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<pix_fmt>"); |
| 814 | break; | 860 | break; |
| @@ -908,6 +954,7 @@ void av_opt_set_defaults2(void *s, int mask, int flags) · 93 unmodified lines |
| 908 | break; | 954 | break; |
| 909 | case AV_OPT_TYPE_STRING: | 955 | case AV_OPT_TYPE_STRING: |
| 910 | case AV_OPT_TYPE_IMAGE_SIZE: | 956 | case AV_OPT_TYPE_IMAGE_SIZE: |
| | 957 | case AV_OPT_TYPE_VIDEO_RATE: |
| 911 | av_opt_set(s, opt->name, opt->default_val.str, 0); | 958 | av_opt_set(s, opt->name, opt->default_val.str, 0); |
| 912 | break; | 959 | break; |
| 913 | case AV_OPT_TYPE_PIXEL_FMT: | 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 | range->value_min = 0; | 1317 | range->value_min = 0; |
| 1271 | range->value_max = INT_MAX/8; | 1318 | range->value_max = INT_MAX/8; |
| 1272 | break; | 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 | default: | 1326 | default: |
| 1274 | ret = AVERROR(ENOSYS); | 1327 | ret = AVERROR(ENOSYS); |
| 1275 | goto fail; | 1328 | goto fail; |
| @@ -1331,6 +1384,7 @@ static const AVOption test_options[]= { · 55 unmodified lines |
| 1331 | {"size", "set size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE,{0}, 0, 0 }, | 1384 | {"size", "set size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE,{0}, 0, 0 }, |
| 1332 | {"pix_fmt", "set pixfmt", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, -1, AV_PIX_FMT_NB-1}, | 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 | {"sample_fmt", "set samplefmt", OFFSET(sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64 = AV_SAMPLE_FMT_NONE}, -1, AV_SAMPLE_FMT_NB-1}, | 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 | {NULL}, | 1388 | {NULL}, |
| 1335 | }; | 1389 | }; |
| 1336 | | 1390 | |
| @@ -1381,6 +1435,11 @@ int main(void) · 44 unmodified lines |
| 1381 | "sample_fmt=s16", | 1435 | "sample_fmt=s16", |
| 1382 | "sample_fmt=2", | 1436 | "sample_fmt=2", |
| 1383 | "sample_fmt=bogus", | 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 | test_ctx.class = &test_class; | 1445 | test_ctx.class = &test_class; |