[FFmpeg-devel] Patch: Add-multithreading-for-swscale-filter
Nicolas George
george at nsup.org
Fri Jul 19 15:40:43 EEST 2019
Pawlowski, Slawomir (12019-07-19):
> From 3ce39207e95eb4697abb0fbaccd37cc451559e49 Mon Sep 17 00:00:00 2001
> From: Slawomir Pawlowski <slawomir.pawlowski at intel.com>
> Date: Fri, 19 Jul 2019 13:16:16 +0200
> Subject: [PATCH] Add multithreading for swscale filter.
>
> Use with option "-filter_scale_threads <num_threads>"
> Split slice in scaler in to parts.
>
> Signed-off-by: Slawomir Pawlowski <slawomir.pawlowski at intel.com>
> Signed-off-by: Tomasz Szumski <tomasz.szumski at intel.com>
Thanks for the patch. Just a quick review for the most visible issues.
> ---
> fftools/ffmpeg.h | 1 +
> fftools/ffmpeg_filter.c | 3 +
> fftools/ffmpeg_opt.c | 7 +
> libavfilter/avfilter.h | 18 ++
> libavfilter/avfiltergraph.c | 4 +
> libavfilter/vf_scale.c | 4 +
> libswscale/options.c | 3 +
> libswscale/slice.c | 32 +++-
> libswscale/swscale.c | 414 +++++++++++++++++++++++++++++-------------
> libswscale/swscale_internal.h | 46 +++++
> libswscale/utils.c | 152 +++++++++++++++-
> 11 files changed, 547 insertions(+), 137 deletions(-)
This patch probably needs to be split: swscale, lavfi infrastructure,
scale filter, command-line tool.
>
> diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
> index eb1eaf6..ea1cef5 100644
> --- a/fftools/ffmpeg.h
> +++ b/fftools/ffmpeg.h
> @@ -609,6 +609,7 @@ extern char *videotoolbox_pixfmt;
>
> extern int filter_nbthreads;
> extern int filter_complex_nbthreads;
> +extern int filter_scale_nbthreads;
> extern int vstats_version;
>
> extern const AVIOInterruptCB int_cb;
> diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
> index 6518d50..793d3e9 100644
> --- a/fftools/ffmpeg_filter.c
> +++ b/fftools/ffmpeg_filter.c
> @@ -1011,6 +1011,9 @@ int configure_filtergraph(FilterGraph *fg)
> AVDictionaryEntry *e = NULL;
>
> fg->graph->nb_threads = filter_nbthreads;
> +#if HAVE_THREADS
> + fg->graph->sws_nbthreads = filter_scale_nbthreads;
> +#endif
Here and elsewhere: there is no need for HAVE_THREADS to just define a
field and set it. Do not litter the code with unnecessary conditional
compilation.
>
> args[0] = 0;
> while ((e = av_dict_get(ost->sws_dict, "", e,
> diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
> index d4851a2..37791ff 100644
> --- a/fftools/ffmpeg_opt.c
> +++ b/fftools/ffmpeg_opt.c
> @@ -109,6 +109,9 @@ int frame_bits_per_raw_sample = 0;
> float max_error_rate = 2.0/3;
> int filter_nbthreads = 0;
> int filter_complex_nbthreads = 0;
> +#if HAVE_THREADS
> +int filter_scale_nbthreads = 0;
> +#endif
> int vstats_version = 2;
>
>
> @@ -3497,6 +3500,10 @@ const OptionDef options[] = {
> { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
> OPT_OUTPUT, { .off = OFFSET(disposition) },
> "disposition", "" },
> +#if HAVE_THREADS
> + { "filter_scale_threads", HAS_ARG | OPT_INT, { &filter_scale_nbthreads },
> + "number of threads for scale filter" },
> +#endif
> { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
> { .off = OFFSET(thread_queue_size) },
> "set the maximum number of queued packets from the demuxer" },
> diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> index 9d70e71..a2835d7 100644
> --- a/libavfilter/avfilter.h
> +++ b/libavfilter/avfilter.h
> @@ -422,6 +422,16 @@ struct AVFilterContext {
> * configured.
> */
> int extra_hw_frames;
> +
> +
> +#if HAVE_THREADS
> + /**
> + * Number of threads to processing scale
> + */
> + int sws_slice_nbthreads;
Adding a field to AVFilterContext that is relevant only for vf_scale is
not acceptable. Use the option system.
> +
> +#endif
> +
> };
>
> /**
> @@ -907,6 +917,14 @@ typedef struct AVFilterGraph {
> int sink_links_count;
>
> unsigned disable_auto_convert;
> +
> +#if HAVE_THREADS
> + /**
> + * Number of threads to processing scale
> + */
> + int sws_nbthreads;
> +#endif
> +
> } AVFilterGraph;
>
> /**
> diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
> index a149f8f..cbd6ad1 100644
> --- a/libavfilter/avfiltergraph.c
> +++ b/libavfilter/avfiltergraph.c
> @@ -257,6 +257,10 @@ static int graph_config_links(AVFilterGraph *graph, AVClass *log_ctx)
> for (i = 0; i < graph->nb_filters; i++) {
> filt = graph->filters[i];
>
> +#if HAVE_THREADS
> + filt->sws_slice_nbthreads = graph->sws_nbthreads;
> +#endif
> +
> if (!filt->nb_outputs) {
> if ((ret = avfilter_config_links(filt)))
> return ret;
> diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
> index f741419..5098aee 100644
> --- a/libavfilter/vf_scale.c
> +++ b/libavfilter/vf_scale.c
> @@ -299,6 +299,10 @@ static int config_props(AVFilterLink *outlink)
> av_opt_set_int(*s, "sws_flags", scale->flags, 0);
> av_opt_set_int(*s, "param0", scale->param[0], 0);
> av_opt_set_int(*s, "param1", scale->param[1], 0);
> +#if HAVE_THREADS
> + av_opt_set_int(*s, "sw_nbthreads", ctx->sws_slice_nbthreads, 0);
> +#endif
> +
> if (scale->in_range != AVCOL_RANGE_UNSPECIFIED)
> av_opt_set_int(*s, "src_range",
> scale->in_range == AVCOL_RANGE_JPEG, 0);
> diff --git a/libswscale/options.c b/libswscale/options.c
> index 7eb2752..942c12d 100644
> --- a/libswscale/options.c
> +++ b/libswscale/options.c
> @@ -80,6 +80,9 @@ static const AVOption swscale_options[] = {
> { "none", "ignore alpha", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_ALPHA_BLEND_NONE}, INT_MIN, INT_MAX, VE, "alphablend" },
> { "uniform_color", "blend onto a uniform color", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_ALPHA_BLEND_UNIFORM},INT_MIN, INT_MAX, VE, "alphablend" },
> { "checkerboard", "blend onto a checkerboard", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_ALPHA_BLEND_CHECKERBOARD},INT_MIN, INT_MAX, VE, "alphablend" },
> +#if HAVE_THREADS
> + { "sw_nbthreads", "Threads number for scaling", OFFSET(sw_nbthreads), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 128, VE },
Since this filter only does scaling, namespacing this option is not
necessary.
> +#endif
>
> { NULL }
> };
> diff --git a/libswscale/slice.c b/libswscale/slice.c
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190719/309c0afe/attachment.sig>
More information about the ffmpeg-devel
mailing list