diff options
-rw-r--r-- | options/m_property.c | 36 | ||||
-rw-r--r-- | options/m_property.h | 11 |
2 files changed, 47 insertions, 0 deletions
diff --git a/options/m_property.c b/options/m_property.c index 9ac5ab43bd..d678601648 100644 --- a/options/m_property.c +++ b/options/m_property.c @@ -29,6 +29,8 @@ #include <libavutil/common.h> +#include "libmpv/client.h" + #include "talloc.h" #include "m_option.h" #include "m_property.h" @@ -192,6 +194,40 @@ int m_property_do(struct mp_log *log, const m_option_t *prop_list, } return do_action(prop_list, name, M_PROPERTY_SET, arg, ctx); } + case M_PROPERTY_GET_NODE: { + if ((r = do_action(prop_list, name, M_PROPERTY_GET_NODE, arg, ctx)) != + M_PROPERTY_NOT_IMPLEMENTED) + return r; + if ((r = do_action(prop_list, name, M_PROPERTY_GET, &val, ctx)) <= 0) + return r; + struct mpv_node *node = arg; + int err = m_option_get_node(&opt, NULL, node, &val); + if (err == M_OPT_UNKNOWN) { + r = M_PROPERTY_NOT_IMPLEMENTED; + } else if (r < 0) { + r = M_PROPERTY_INVALID_FORMAT; + } else { + r = M_PROPERTY_OK; + } + m_option_free(&opt, &val); + return r; + } + case M_PROPERTY_SET_NODE: { + if ((r = do_action(prop_list, name, M_PROPERTY_SET_NODE, arg, ctx)) != + M_PROPERTY_NOT_IMPLEMENTED) + return r; + struct mpv_node *node = arg; + int err = m_option_set_node(&opt, &val, node); + if (err == M_OPT_UNKNOWN) { + r = M_PROPERTY_NOT_IMPLEMENTED; + } else if (r < 0) { + r = M_PROPERTY_INVALID_FORMAT; + } else { + r = do_action(prop_list, name, M_PROPERTY_SET, &val, ctx); + } + m_option_free(&opt, &val); + return r; + } default: return do_action(prop_list, name, action, arg, ctx); } diff --git a/options/m_property.h b/options/m_property.h index 460f8a986c..6fc27301b5 100644 --- a/options/m_property.h +++ b/options/m_property.h @@ -68,6 +68,14 @@ enum mp_property_action { // arg: char* M_PROPERTY_SET_STRING, + // Set a mpv_node value. + // arg: mpv_node* + M_PROPERTY_GET_NODE, + + // Get a mpv_node value. + // arg: mpv_node* + M_PROPERTY_SET_NODE, + // Pass down an action to a sub-property. // arg: struct m_property_action_arg* M_PROPERTY_KEY_ACTION, @@ -102,6 +110,9 @@ enum mp_property_return { // Returned when asking for a property that doesn't exist. M_PROPERTY_UNKNOWN = -3, + + // When trying to set invalid or incorrectly formatted data. + M_PROPERTY_INVALID_FORMAT = -4, }; // Access a property. |