summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/av_common.c11
-rw-r--r--common/av_common.h1
2 files changed, 10 insertions, 2 deletions
diff --git a/common/av_common.c b/common/av_common.c
index 2c959ffe4f..3ea1ceb872 100644
--- a/common/av_common.c
+++ b/common/av_common.c
@@ -313,7 +313,7 @@ void mp_avdict_print_unset(struct mp_log *log, int msgl, AVDictionary *dict)
// to the name of the n-th parameter.
static void resolve_positional_arg(void *avobj, char **name)
{
- if (!*name || (*name)[0] != '@')
+ if (!*name || (*name)[0] != '@' || !avobj)
return;
char *end = NULL;
@@ -345,11 +345,18 @@ static void resolve_positional_arg(void *avobj, char **name)
// Returns: >=0 success, <0 failed to set an option
int mp_set_avopts(struct mp_log *log, void *avobj, char **kv)
{
+ return mp_set_avopts_pos(log, avobj, avobj, kv);
+}
+
+// Like mp_set_avopts(), but the posargs argument is used to resolve positional
+// arguments. If posargs==NULL, positional args are disabled.
+int mp_set_avopts_pos(struct mp_log *log, void *avobj, void *posargs, char **kv)
+{
int success = 0;
for (int n = 0; kv && kv[n * 2]; n++) {
char *k = kv[n * 2 + 0];
char *v = kv[n * 2 + 1];
- resolve_positional_arg(avobj, &k);
+ resolve_positional_arg(posargs, &k);
int r = av_opt_set(avobj, k, v, AV_OPT_SEARCH_CHILDREN);
if (r == AVERROR_OPTION_NOT_FOUND) {
mp_err(log, "AVOption '%s' not found.\n", k);
diff --git a/common/av_common.h b/common/av_common.h
index 6cbadb4a96..4037afa0ad 100644
--- a/common/av_common.h
+++ b/common/av_common.h
@@ -47,5 +47,6 @@ const char *mp_codec_from_av_codec_id(int codec_id);
void mp_set_avdict(struct AVDictionary **dict, char **kv);
void mp_avdict_print_unset(struct mp_log *log, int msgl, struct AVDictionary *d);
int mp_set_avopts(struct mp_log *log, void *avobj, char **kv);
+int mp_set_avopts_pos(struct mp_log *log, void *avobj, void *posargs, char **kv);
#endif