summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-12-30 14:04:53 +0100
committerDiogo Franco (Kovensky) <diogomfranco@gmail.com>2015-01-25 17:00:09 +0900
commit74a3d29f21d9faf290ba0fd6e86abb9682c0ac17 (patch)
tree1ae1e11c1b1eb594ab538565c5c0e5dbdc93d5d4
parent07acf5cb9aceb028043ccb25ce89b6ad22713259 (diff)
downloadmpv-74a3d29f21d9faf290ba0fd6e86abb9682c0ac17.tar.bz2
mpv-74a3d29f21d9faf290ba0fd6e86abb9682c0ac17.tar.xz
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.
-rw-r--r--player/command.c17
-rw-r--r--video/filter/vf.c7
2 files changed, 10 insertions, 14 deletions
diff --git a/player/command.c b/player/command.c
index b44d218f52..893bbd9a94 100644
--- a/player/command.c
+++ b/player/command.c
@@ -1034,8 +1034,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;
@@ -1102,22 +1104,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;
@@ -1131,7 +1127,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 7a5b08bcd9..6a7c98aef2 100644
--- a/video/filter/vf.c
+++ b/video/filter/vf.c
@@ -174,10 +174,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)