[FFmpeg-devel] [PATCH 4/5] avcodec/libsvtav1: support cores and socket options for svt av1

Mark Thompson sw at jkqxz.net
Sat Aug 1 15:47:54 EEST 2020


On 01/08/2020 12:22, lance.lmwang at gmail.com wrote:
> From: Limin Wang <lance.lmwang at gmail.com>
> 
> Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
> ---
>   doc/encoders.texi      | 9 +++++++++
>   libavcodec/libsvtav1.c | 9 +++++++++
>   2 files changed, 18 insertions(+)
> 
> diff --git a/doc/encoders.texi b/doc/encoders.texi
> index 2f5457f..da0b68d 100644
> --- a/doc/encoders.texi
> +++ b/doc/encoders.texi
> @@ -1747,6 +1747,15 @@ Set log2 of the number of rows of tiles to use (0-6).
>   @item tile_columns
>   Set log2 of the number of columns of tiles to use (0-4).
>   
> + at item cores
> +Set the number of logical processor which encoder threads run on. Default is: 0
> +which is unset. If cores and socket are not set, threads are managed by OS thread
> +scheduler.
> +
> + at item socket
> +Set which target socket to run on. For multiple socket systems, this can specify which
> +socket the encoder runs on. Default is: -1 which is unset.
> +
>   @end table
>   
>   @section libkvazaar
> diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c
> index 3e3b907..78e0ee5 100644
> --- a/libavcodec/libsvtav1.c
> +++ b/libavcodec/libsvtav1.c
> @@ -71,6 +71,9 @@ typedef struct SvtContext {
>   
>       int tile_columns;
>       int tile_rows;
> +
> +    int cores;
> +    int socket;
>   } SvtContext;
>   
>   static const struct {
> @@ -204,6 +207,10 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
>   
>       param->tile_columns = svt_enc->tile_columns;
>       param->tile_rows    = svt_enc->tile_rows;
> +    if (svt_enc->cores > 0)
> +        param->logical_processors = svt_enc->cores;
> +    if (svt_enc->socket >= 0)
> +        param->target_socket      = svt_enc->socket;
>   
>       return 0;
>   }
> @@ -519,6 +526,8 @@ static const AVOption options[] = {
>   
>       { "tile_columns", "Log2 of number of tile columns to use", OFFSET(tile_columns), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 4, VE},
>       { "tile_rows", "Log2 of number of tile rows to use", OFFSET(tile_rows), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 6, VE},
> +    { "cores", "Number of logical cores, 0: unset",   OFFSET(cores),  AV_OPT_TYPE_INT, {.i64 = 0},   0, INT_MAX, VE},

I think you'd be better using the standard option -threads (AVCodecContext.thread_count) rather than inventing a special one for this encoder only.

> +    { "socket", "Target socket to run on. -1: unset", OFFSET(socket), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},

This sort of thing has always been supported by OS-level tools, so it's not obvious to me that a special crude option here is helpful.

Why would you use this rather than your favourite OS-level tool?  E.g. the Linux tools (taskset, numactl) and APIs (sched_setaffinity(), set_mempolicy()) are more flexible than this option and also 
work on all other encoders.

>   
>       {NULL},
>   };
> 

- Mark


More information about the ffmpeg-devel mailing list