summaryrefslogtreecommitdiffstats
path: root/filters
diff options
context:
space:
mode:
Diffstat (limited to 'filters')
-rw-r--r--filters/f_auto_filters.c6
-rw-r--r--filters/f_decoder_wrapper.c2
-rw-r--r--filters/f_lavfi.c18
-rw-r--r--filters/f_lavfi.h2
-rw-r--r--filters/user_filters.c14
5 files changed, 38 insertions, 4 deletions
diff --git a/filters/f_auto_filters.c b/filters/f_auto_filters.c
index 6fa38b96c2..e151e2dc19 100644
--- a/filters/f_auto_filters.c
+++ b/filters/f_auto_filters.c
@@ -77,7 +77,7 @@ static void deint_process(struct mp_filter *f)
char *field_parity;
switch (opts->field_parity) {
case MP_FIELD_PARITY_TFF:
- field_parity = "tff";
+ field_parity = "tff";
break;
case MP_FIELD_PARITY_BFF:
field_parity = "bff";
@@ -88,7 +88,7 @@ static void deint_process(struct mp_filter *f)
bool has_filter = true;
if (img->imgfmt == IMGFMT_VDPAU) {
- char *args[] = {"deint", "yes",
+ char *args[] = {"deint", "yes",
"parity", field_parity, NULL};
p->sub.filter =
mp_create_user_filter(f, MP_OUTPUT_CHAIN_VIDEO, "vdpaupp", args);
@@ -108,7 +108,7 @@ static void deint_process(struct mp_filter *f)
mp_create_user_filter(f, MP_OUTPUT_CHAIN_VIDEO, "bwdif_vulkan", args);
} else if (img->imgfmt == IMGFMT_VAAPI) {
char *args[] = {"deint", "motion-adaptive",
- "interlaced-only", "yes",
+ "interlaced-only", "yes",
"parity", field_parity, NULL};
p->sub.filter =
mp_create_user_filter(f, MP_OUTPUT_CHAIN_VIDEO, "vavpp", args);
diff --git a/filters/f_decoder_wrapper.c b/filters/f_decoder_wrapper.c
index 7abe95116d..a99c27b7af 100644
--- a/filters/f_decoder_wrapper.c
+++ b/filters/f_decoder_wrapper.c
@@ -367,6 +367,8 @@ static void decf_destroy(struct mp_filter *f)
MP_DBG(f, "Uninit decoder.\n");
talloc_free(p->decoder->f);
p->decoder = NULL;
+ p->codec->decoder = NULL;
+ p->codec->decoder_desc = NULL;
}
decf_reset(f);
diff --git a/filters/f_lavfi.c b/filters/f_lavfi.c
index afc9f2d445..3e447d16cf 100644
--- a/filters/f_lavfi.c
+++ b/filters/f_lavfi.c
@@ -987,6 +987,8 @@ static bool is_usable(const AVFilter *filter, int media_type)
int nb_inputs = avfilter_pad_count(filter->inputs),
nb_outputs = avfilter_pad_count(filter->outputs);
#endif
+ if (nb_inputs > 1 || nb_outputs > 1)
+ return false;
bool input_ok = filter->flags & AVFILTER_FLAG_DYNAMIC_INPUTS;
bool output_ok = filter->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS;
if (nb_inputs == 1)
@@ -1124,6 +1126,22 @@ static void print_help_a(struct mp_log *log)
print_help(log, AVMEDIA_TYPE_AUDIO, "audio", "--af=lavfi=[volume=0.5]");
}
+const char **mp_get_lavfi_filters(void *talloc_ctx, int media_type)
+{
+ const char **filters = NULL;
+ void *iter = NULL;
+ int num = 0;
+ for (;;) {
+ const AVFilter *filter = av_filter_iterate(&iter);
+ if (!filter)
+ break;
+ if (is_usable(filter, media_type))
+ MP_TARRAY_APPEND(talloc_ctx, filters, num, filter->name);
+ }
+ MP_TARRAY_APPEND(talloc_ctx, filters, num, NULL);
+ return filters;
+}
+
#define OPT_BASE_STRUCT struct lavfi_user_opts
const struct mp_user_filter_entry af_lavfi = {
diff --git a/filters/f_lavfi.h b/filters/f_lavfi.h
index b86ed90efd..47762a3e52 100644
--- a/filters/f_lavfi.h
+++ b/filters/f_lavfi.h
@@ -40,3 +40,5 @@ void print_lavfi_help(struct mp_log *log, const char *name, int media_type);
// Return whether the given filter exists and has the required media_type in/outs.
bool mp_lavfi_is_usable(const char *name, int media_type);
+
+const char **mp_get_lavfi_filters(void *talloc_ctx, int media_type);
diff --git a/filters/user_filters.c b/filters/user_filters.c
index b5f29adf18..73b6e3ccfd 100644
--- a/filters/user_filters.c
+++ b/filters/user_filters.c
@@ -63,6 +63,11 @@ static bool check_af_lavfi(const char *name)
return check_unknown_entry(name, AVMEDIA_TYPE_AUDIO);
}
+static const char **get_lavfi_audio_filters(void *talloc_ctx)
+{
+ return mp_get_lavfi_filters(talloc_ctx, AVMEDIA_TYPE_AUDIO);
+}
+
const struct m_obj_list af_obj_list = {
.get_desc = get_af_desc,
.description = "audio filters",
@@ -70,6 +75,7 @@ const struct m_obj_list af_obj_list = {
.check_unknown_entry = check_af_lavfi,
.print_help_list = print_af_help_list,
.print_unknown_entry_help = print_af_lavfi_help,
+ .get_lavfi_filters = get_lavfi_audio_filters,
};
// --vf option
@@ -94,7 +100,7 @@ const struct mp_user_filter_entry *vf_list[] = {
#if HAVE_D3D_HWACCEL
&vf_d3d11vpp,
#endif
-#if HAVE_GL && HAVE_EGL
+#if (HAVE_GL && HAVE_EGL) || HAVE_VULKAN
&vf_gpu,
#endif
};
@@ -119,6 +125,11 @@ static bool check_vf_lavfi(const char *name)
return check_unknown_entry(name, AVMEDIA_TYPE_VIDEO);
}
+static const char **get_lavfi_video_filters(void *talloc_ctx)
+{
+ return mp_get_lavfi_filters(talloc_ctx, AVMEDIA_TYPE_VIDEO);
+}
+
const struct m_obj_list vf_obj_list = {
.get_desc = get_vf_desc,
.description = "video filters",
@@ -126,6 +137,7 @@ const struct m_obj_list vf_obj_list = {
.check_unknown_entry = check_vf_lavfi,
.print_help_list = print_vf_help_list,
.print_unknown_entry_help = print_vf_lavfi_help,
+ .get_lavfi_filters = get_lavfi_video_filters,
};
// Create a bidir, single-media filter from command line arguments.