[FFmpeg-devel] [PATCH 1/4] avutil: add av_format_option_for_user() callback system

Michael Niedermayer michaelni at gmx.at
Mon May 11 03:18:16 CEST 2015


Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 libavutil/opt.c |   32 ++++++++++++++++++++++++++++++++
 libavutil/opt.h |   21 +++++++++++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/libavutil/opt.c b/libavutil/opt.c
index 62db1b5..12b5532 100644
--- a/libavutil/opt.c
+++ b/libavutil/opt.c
@@ -1876,6 +1876,8 @@ int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
             continue;
         if (flags & AV_OPT_SERIALIZE_SKIP_DEFAULTS && av_opt_is_set_to_default(obj, o) > 0)
             continue;
+        if (o->type == AV_OPT_TYPE_PTR)
+            continue;
         if ((ret = av_opt_get(obj, o->name, 0, &buf)) < 0) {
             av_bprint_finalize(&bprint, NULL);
             return ret;
@@ -1893,6 +1895,36 @@ int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
     return 0;
 }
 
+static const char* default_format_option_for_user(void *obj, const char* name, const char* value, char *tmp, int tmp_len)
+{
+    snprintf(tmp, tmp_len, "set '%s' to '%s'", name, value);
+    return tmp;
+}
+
+const char* av_format_option_for_user(void *obj, const char* name, const char* value, char *tmp, int tmp_len)
+{
+    const AVClass *c = *(AVClass**)obj;
+    av_format_option_for_user_func *ptr = av_opt_ptr(c, obj, "format_option_for_user_func");
+    av_format_option_for_user_func format_option_for_user = NULL;
+
+    if (ptr)
+        format_option_for_user = *ptr;
+
+    if (!format_option_for_user)
+        format_option_for_user = default_format_option_for_user;
+
+    return format_option_for_user(obj, name, value, tmp, tmp_len);
+}
+
+void av_set_format_option_for_user_func(void *obj, av_format_option_for_user_func f)
+{
+    const AVClass *c = *(AVClass**)obj;
+    av_format_option_for_user_func *ptr = av_opt_ptr(c, obj, "format_option_for_user_func");
+
+    if (ptr)
+        *ptr = f;
+}
+
 #ifdef TEST
 
 typedef struct TestContext
diff --git a/libavutil/opt.h b/libavutil/opt.h
index 5fc8a9b..4283b83 100644
--- a/libavutil/opt.h
+++ b/libavutil/opt.h
@@ -218,6 +218,8 @@
  * before the file is actually opened.
  */
 
+typedef const char * (*av_format_option_for_user_func)(void *obj, const char* name, const char* value, char *tmp, int tmp_len);
+
 enum AVOptionType{
     AV_OPT_TYPE_FLAGS,
     AV_OPT_TYPE_INT,
@@ -236,6 +238,7 @@ enum AVOptionType{
     AV_OPT_TYPE_DURATION   = MKBETAG('D','U','R',' '),
     AV_OPT_TYPE_COLOR      = MKBETAG('C','O','L','R'),
     AV_OPT_TYPE_CHANNEL_LAYOUT = MKBETAG('C','H','L','A'),
+    AV_OPT_TYPE_PTR        = MKBETAG('P','T','R',' '),
 #if FF_API_OLD_AVOPTIONS
     FF_OPT_TYPE_FLAGS = 0,
     FF_OPT_TYPE_INT,
@@ -894,6 +897,24 @@ int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_fla
  */
 int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
                      const char key_val_sep, const char pairs_sep);
+
+/**
+ * Formats the given AVOption for display to the user.
+ *
+ * This uses a callback with the name "format_option_for_user_func" if such field
+ * exists in obj.
+ *
+ * @param obj   pointer to a AVClass based object.
+ * @param name  name of the AVOption
+ * @param value value to set the AVOption to, may be NULL
+ * @param tmp   space in which the formatted option is constructed
+ * @param tmp_len, length of the tmp array
+ * @returns pointer to the formated string, this may match tmp
+ */
+const char* av_format_option_for_user(void *obj, const char* name, const char* value, char *tmp, int tmp_len);
+
+void av_set_format_option_for_user_func(void *obj, av_format_option_for_user_func f);
+
 /**
  * @}
  */
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list