diff options
Diffstat (limited to 'filters')
-rw-r--r-- | filters/f_auto_filters.c | 6 | ||||
-rw-r--r-- | filters/f_decoder_wrapper.c | 2 | ||||
-rw-r--r-- | filters/f_lavfi.c | 18 | ||||
-rw-r--r-- | filters/f_lavfi.h | 2 | ||||
-rw-r--r-- | filters/user_filters.c | 14 |
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. |