From 63a414c708ea2986386639124fdfa9cdbd58e520 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 30 Dec 2014 14:04:53 +0100 Subject: command: make empty vf-metadata not an error If a filter exists, but has no metadata, just return success. This allows the user to distinguish between no metadata available, and filter not inserted. See #1408. --- player/command.c | 17 ++++++----------- video/filter/vf.c | 7 ++++--- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/player/command.c b/player/command.c index 97b890af5c..1739da76cb 100644 --- a/player/command.c +++ b/player/command.c @@ -1075,8 +1075,10 @@ static int tag_property(int action, void *arg, struct mp_tags *tags) res = talloc_asprintf_append_buffer(res, "%s: %s\n", tags->keys[n], tags->values[n]); } + if (!res) + res = talloc_strdup(NULL, "(empty)"); *(char **)arg = res; - return res ? M_PROPERTY_OK : M_PROPERTY_UNAVAILABLE; + return M_PROPERTY_OK; } case M_PROPERTY_KEY_ACTION: { struct m_property_action_arg *ka = arg; @@ -1153,22 +1155,16 @@ static int mp_property_vf_metadata(void *ctx, struct m_property *prop, return M_PROPERTY_UNAVAILABLE; struct vf_chain *vf = mpctx->d_video->vfilter; - switch(action) { - case M_PROPERTY_GET_TYPE: - case M_PROPERTY_GET: - case M_PROPERTY_GET_NODE: - return M_PROPERTY_NOT_IMPLEMENTED; - case M_PROPERTY_KEY_ACTION: { + if (action == M_PROPERTY_KEY_ACTION) { struct m_property_action_arg *ka = arg; bstr key; char *rem; m_property_split_path(ka->key, &key, &rem); - struct mp_tags vf_metadata; + struct mp_tags vf_metadata = {0}; switch (vf_control_by_label(vf, VFCTRL_GET_METADATA, &vf_metadata, key)) { - case CONTROL_NA: - return M_PROPERTY_UNAVAILABLE; case CONTROL_UNKNOWN: return M_PROPERTY_UNKNOWN; + case CONTROL_NA: // empty case CONTROL_OK: if (strlen(rem)) { struct m_property_action_arg next_ka = *ka; @@ -1182,7 +1178,6 @@ static int mp_property_vf_metadata(void *ctx, struct m_property *prop, return M_PROPERTY_ERROR; } } - } return M_PROPERTY_NOT_IMPLEMENTED; } diff --git a/video/filter/vf.c b/video/filter/vf.c index a424cc5856..8886c64ccb 100644 --- a/video/filter/vf.c +++ b/video/filter/vf.c @@ -170,10 +170,11 @@ int vf_control_by_label(struct vf_chain *c,int cmd, void *arg, bstr label) char *label_str = bstrdup0(NULL, label); struct vf_instance *cur = vf_find_by_label(c, label_str); talloc_free(label_str); - if (cur && cur->control) - return cur->control(cur, cmd, arg); - else + if (cur) { + return cur->control ? cur->control(cur, cmd, arg) : CONTROL_NA; + } else { return CONTROL_UNKNOWN; + } } static void vf_control_all(struct vf_chain *c, int cmd, void *arg) -- cgit v1.2.3