From e58e650a97a3938baeb7d8bb62cdae04ac6b6fb1 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 2 Nov 2019 17:50:24 +0100 Subject: video: mess with the filte chain to enable zimg IMGFMT_RGB30 output This was too hardcoded to libswscale. In particular, IMGFMT_RGB30 output is only possible with the zimg wrapper, so the context needs to be taken into account (since this depends on the --sws-allow-zimg option dynamically). This is still slightly risky, because zimg currently will still fall back to swscale in some cases, such as when it refuses to initialize the particular color conversion that is requested. f_autoconvert.c could actually handle this better, but I'm tool fucking lazy right now, and nobody cares anyway, so go away, OK? --- filters/f_autoconvert.c | 2 +- filters/f_swscale.c | 9 +++------ filters/f_swscale.h | 3 ++- video/sws_utils.c | 1 + 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/filters/f_autoconvert.c b/filters/f_autoconvert.c index 20c083de54..d563b1fcd3 100644 --- a/filters/f_autoconvert.c +++ b/filters/f_autoconvert.c @@ -309,7 +309,7 @@ static bool build_image_converter(struct mp_autoconvert *c, struct mp_log *log, goto fail; } - int out = mp_sws_find_best_out_format(src_fmt, fmts, num_fmts); + int out = mp_sws_find_best_out_format(sws, src_fmt, fmts, num_fmts); if (!out) { mp_err(log, "can't find video conversion for %s\n", mp_imgfmt_to_name(src_fmt)); diff --git a/filters/f_swscale.c b/filters/f_swscale.c index 6b4b5842ac..f9af4d18fb 100644 --- a/filters/f_swscale.c +++ b/filters/f_swscale.c @@ -40,17 +40,14 @@ #include "filter.h" #include "filter_internal.h" -int mp_sws_find_best_out_format(int in_format, int *out_formats, - int num_out_formats) +int mp_sws_find_best_out_format(struct mp_sws_filter *sws, int in_format, + int *out_formats, int num_out_formats) { - if (sws_isSupportedInput(imgfmt2pixfmt(in_format)) < 1) - return 0; - int best = 0; for (int n = 0; n < num_out_formats; n++) { int out_format = out_formats[n]; - if (sws_isSupportedOutput(imgfmt2pixfmt(out_format)) < 1) + if (!mp_sws_supports_formats(sws->sws, out_format, in_format)) continue; if (best) { diff --git a/filters/f_swscale.h b/filters/f_swscale.h index 6e26aef1ac..861ad029dd 100644 --- a/filters/f_swscale.h +++ b/filters/f_swscale.h @@ -23,7 +23,8 @@ struct mp_sws_filter *mp_sws_filter_create(struct mp_filter *parent); // formats. This tries to set the output format to the one that will result in // the least loss. Returns a format from out_formats[], or 0 if no format could // be chosen (or it's not supported by libswscale). -int mp_sws_find_best_out_format(int in_format, int *out_formats, +int mp_sws_find_best_out_format(struct mp_sws_filter *sws, + int in_format, int *out_formats, int num_out_formats); // Whether the given format is supported as input format. diff --git a/video/sws_utils.c b/video/sws_utils.c index 47af77ca50..c22b13109b 100644 --- a/video/sws_utils.c +++ b/video/sws_utils.c @@ -202,6 +202,7 @@ void mp_sws_enable_cmdline_opts(struct mp_sws_context *ctx, struct mpv_global *g ctx->opts_cache = m_config_cache_alloc(ctx, g, &sws_conf); ctx->force_reload = true; + mp_sws_update_from_cmdline(ctx); #if HAVE_ZIMG mp_zimg_enable_cmdline_opts(ctx->zimg, g); -- cgit v1.2.3