patch-libavutil_opt_c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. $OpenBSD: patch-libavutil_opt_c,v 1.3 2016/05/03 06:05:49 ajacoutot Exp $
  2. avutil/opt: add AV_OPT_TYPE_BOOL
  3. --- libavutil/opt.c.orig Wed Apr 27 00:56:52 2016
  4. +++ libavutil/opt.c Wed Apr 27 01:08:36 2016
  5. @@ -67,6 +67,7 @@ static int read_number(const AVOption *o, const void *
  6. case AV_OPT_TYPE_FLAGS: *intnum = *(unsigned int*)dst;return 0;
  7. case AV_OPT_TYPE_PIXEL_FMT: *intnum = *(enum AVPixelFormat *)dst;return 0;
  8. case AV_OPT_TYPE_SAMPLE_FMT:*intnum = *(enum AVSampleFormat*)dst;return 0;
  9. + case AV_OPT_TYPE_BOOL:
  10. case AV_OPT_TYPE_INT: *intnum = *(int *)dst;return 0;
  11. case AV_OPT_TYPE_CHANNEL_LAYOUT:
  12. case AV_OPT_TYPE_DURATION:
  13. @@ -103,6 +104,7 @@ static int write_number(void *obj, const AVOption *o,
  14. switch (o->type) {
  15. case AV_OPT_TYPE_PIXEL_FMT: *(enum AVPixelFormat *)dst = llrint(num/den) * intnum; break;
  16. case AV_OPT_TYPE_SAMPLE_FMT:*(enum AVSampleFormat*)dst = llrint(num/den) * intnum; break;
  17. + case AV_OPT_TYPE_BOOL:
  18. case AV_OPT_TYPE_FLAGS:
  19. case AV_OPT_TYPE_INT: *(int *)dst= llrint(num/den)*intnum; break;
  20. case AV_OPT_TYPE_DURATION:
  21. @@ -304,6 +306,44 @@ static int set_string_color(void *obj, const AVOption
  22. return 0;
  23. }
  24. +static const char *get_bool_name(int val)
  25. +{
  26. + if (val < 0)
  27. + return "auto";
  28. + return val ? "true" : "false";
  29. +}
  30. +
  31. +static int set_string_bool(void *obj, const AVOption *o, const char *val, int *dst)
  32. +{
  33. + int n;
  34. +
  35. + if (!val)
  36. + return 0;
  37. +
  38. + if (!strcmp(val, "auto")) {
  39. + n = -1;
  40. + } else if (av_match_name(val, "true,y,yes,enable,enabled,on")) {
  41. + n = 1;
  42. + } else if (av_match_name(val, "false,n,no,disable,disabled,off")) {
  43. + n = 0;
  44. + } else {
  45. + char *end = NULL;
  46. + n = strtol(val, &end, 10);
  47. + if (val + strlen(val) != end)
  48. + goto fail;
  49. + }
  50. +
  51. + if (n < o->min || n > o->max)
  52. + goto fail;
  53. +
  54. + *dst = n;
  55. + return 0;
  56. +
  57. +fail:
  58. + av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as boolean\n", val);
  59. + return AVERROR(EINVAL);
  60. +}
  61. +
  62. static int set_string_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst,
  63. int fmt_nb, int ((*get_fmt)(const char *)), const char *desc)
  64. {
  65. @@ -377,7 +417,7 @@ int av_opt_set(void *obj, const char *name, const char
  66. o->type != AV_OPT_TYPE_PIXEL_FMT && o->type != AV_OPT_TYPE_SAMPLE_FMT &&
  67. o->type != AV_OPT_TYPE_IMAGE_SIZE && o->type != AV_OPT_TYPE_VIDEO_RATE &&
  68. o->type != AV_OPT_TYPE_DURATION && o->type != AV_OPT_TYPE_COLOR &&
  69. - o->type != AV_OPT_TYPE_CHANNEL_LAYOUT))
  70. + o->type != AV_OPT_TYPE_CHANNEL_LAYOUT && o->type != AV_OPT_TYPE_BOOL))
  71. return AVERROR(EINVAL);
  72. if (o->flags & AV_OPT_FLAG_READONLY)
  73. @@ -385,6 +425,7 @@ int av_opt_set(void *obj, const char *name, const char
  74. dst = ((uint8_t*)target_obj) + o->offset;
  75. switch (o->type) {
  76. + case AV_OPT_TYPE_BOOL: return set_string_bool(obj, o, val, dst);
  77. case AV_OPT_TYPE_STRING: return set_string(obj, o, val, dst);
  78. case AV_OPT_TYPE_BINARY: return set_string_binary(obj, o, val, dst);
  79. case AV_OPT_TYPE_FLAGS:
  80. @@ -701,6 +742,9 @@ int av_opt_get(void *obj, const char *name, int search
  81. buf[0] = 0;
  82. switch (o->type) {
  83. + case AV_OPT_TYPE_BOOL:
  84. + ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(get_bool_name(*(int *)dst), "invalid"));
  85. + break;
  86. case AV_OPT_TYPE_FLAGS: ret = snprintf(buf, sizeof(buf), "0x%08X", *(int *)dst);break;
  87. case AV_OPT_TYPE_INT: ret = snprintf(buf, sizeof(buf), "%d" , *(int *)dst);break;
  88. case AV_OPT_TYPE_INT64: ret = snprintf(buf, sizeof(buf), "%"PRId64, *(int64_t*)dst);break;
  89. @@ -1076,6 +1120,9 @@ static void opt_list(void *obj, void *av_log_obj, cons
  90. case AV_OPT_TYPE_CHANNEL_LAYOUT:
  91. av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<channel_layout>");
  92. break;
  93. + case AV_OPT_TYPE_BOOL:
  94. + av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<boolean>");
  95. + break;
  96. case AV_OPT_TYPE_CONST:
  97. default:
  98. av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "");
  99. @@ -1121,6 +1168,9 @@ static void opt_list(void *obj, void *av_log_obj, cons
  100. !opt->default_val.str)) {
  101. av_log(av_log_obj, AV_LOG_INFO, " (default ");
  102. switch (opt->type) {
  103. + case AV_OPT_TYPE_BOOL:
  104. + av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(get_bool_name(opt->default_val.i64), "invalid"));
  105. + break;
  106. case AV_OPT_TYPE_FLAGS:
  107. av_log(av_log_obj, AV_LOG_INFO, "%"PRIX64, opt->default_val.i64);
  108. break;
  109. @@ -1196,6 +1246,7 @@ void av_opt_set_defaults2(void *s, int mask, int flags
  110. case AV_OPT_TYPE_CONST:
  111. /* Nothing to be done here */
  112. break;
  113. + case AV_OPT_TYPE_BOOL:
  114. case AV_OPT_TYPE_FLAGS:
  115. case AV_OPT_TYPE_INT:
  116. case AV_OPT_TYPE_INT64:
  117. @@ -1555,6 +1606,7 @@ void *av_opt_ptr(const AVClass *class, void *obj, cons
  118. static int opt_size(enum AVOptionType type)
  119. {
  120. switch(type) {
  121. + case AV_OPT_TYPE_BOOL:
  122. case AV_OPT_TYPE_INT:
  123. case AV_OPT_TYPE_FLAGS: return sizeof(int);
  124. case AV_OPT_TYPE_DURATION:
  125. @@ -1672,6 +1724,7 @@ int av_opt_query_ranges_default(AVOptionRanges **range
  126. range->value_max = field->max;
  127. switch (field->type) {
  128. + case AV_OPT_TYPE_BOOL:
  129. case AV_OPT_TYPE_INT:
  130. case AV_OPT_TYPE_INT64:
  131. case AV_OPT_TYPE_PIXEL_FMT:
  132. @@ -1755,6 +1808,7 @@ int av_opt_is_set_to_default(void *obj, const AVOption
  133. switch (o->type) {
  134. case AV_OPT_TYPE_CONST:
  135. return 1;
  136. + case AV_OPT_TYPE_BOOL:
  137. case AV_OPT_TYPE_FLAGS:
  138. case AV_OPT_TYPE_PIXEL_FMT:
  139. case AV_OPT_TYPE_SAMPLE_FMT:
  140. @@ -1918,6 +1972,9 @@ typedef struct TestContext
  141. float flt;
  142. double dbl;
  143. char *escape;
  144. + int bool1;
  145. + int bool2;
  146. + int bool3;
  147. } TestContext;
  148. #define OFFSET(x) offsetof(TestContext, x)
  149. @@ -1949,6 +2006,9 @@ static const AVOption test_options[]= {
  150. {"num64", "set num 64bit", OFFSET(num64), AV_OPT_TYPE_INT64, {.i64 = 1}, 0, 100, 1 },
  151. {"flt", "set float", OFFSET(flt), AV_OPT_TYPE_FLOAT, {.dbl = 1.0/3}, 0, 100, 1},
  152. {"dbl", "set double", OFFSET(dbl), AV_OPT_TYPE_DOUBLE, {.dbl = 1.0/3}, 0, 100, 1 },
  153. +{"bool1", "set boolean value", OFFSET(bool1), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, 1 },
  154. +{"bool2", "set boolean value", OFFSET(bool2), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, 1 },
  155. +{"bool3", "set boolean value", OFFSET(bool3), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, 1 },
  156. {NULL},
  157. };
  158. @@ -2114,6 +2174,8 @@ int main(void)
  159. "dbl=2.2",
  160. "dbl=-1",
  161. "dbl=101",
  162. + "bool1=true",
  163. + "bool2=auto",
  164. };
  165. test_ctx.class = &test_class;