Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Gyan



On 01-06-2019 02:06 AM, Carl Eugen Hoyos wrote:

Am Fr., 31. Mai 2019 um 16:40 Uhr schrieb Lynne :


Number of threads should not have any impact at all on quality ever.

Afair, it has for x264...
(not necessarily related to this patch though)
Definitely x265: 
https://bitbucket.org/multicoreware/x265/issues/449/distortion-in-idr-frame-higher-ratefactor


Gyan
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Paul B Mahol
On 5/31/19, Pavel Koshevoy  wrote:
> On Fri, May 31, 2019 at 2:17 PM Paul B Mahol  wrote:
>>
>> On 5/31/19, Pavel Koshevoy  wrote:
>> > On Fri, May 31, 2019 at 2:03 PM Paul B Mahol  wrote:
>> >>
>> >> On 5/31/19, Pavel Koshevoy  wrote:
>> >> > On Fri, May 31, 2019 at 1:44 PM Pavel Koshevoy 
>> >> > wrote:
>
> 
>
>
>> >> >> I've had to use zscale to convert 10-bit 4k60p video from HLG HDR to
>> >> >> SDR
>> >> >> (bt709).   It was ~36x times slower than real time.  What I ended up
>> >> >> doing
>> >> >> to speed it up was to generate CLUT image (16-bit yuv444 65x65x65
>> >> >> sampling
>> >> >> of input color space), lay it out as a 2D image (512x537), and run
>> >> >> it
>> >> >> through zscale to generate the HDR->SDR transform CLUT.  Then I used
>> >> >> the
>> >> >> CLUT instead of zscale for every frame...  that got me to about
>> >> >> ~3.5x
>> >> >> times slower than realtime converting 60fps 10-bit 4k HLG to SDR
>> >> >> (and
>> >> >> I
>> >> >> don't know any assembly, so I didn't attempt to optimize the CLUT
>> >> >> trilinear optimization with SIMD, so maybe it could be faster
>> >> >> still).
>> >> >> I
>> >> >> then ported to CUDA and was able to convert 4k60p HLG->SDR faster
>> >> >> than
>> >> >> realtime on a Pascal GPU.
>> >> >>
>> >> >
>> >> > I meant trilinear interpolation
>> >> >
>> >> >
>> >> >> So, I'm not sure that adding slice threading to zscale is the best
>> >> >> optimization for it.  I think capturing the effect of zscale in a
>> >> >> CLUT
>> >> >> would be a more significant optimization.
>> >> >>
>> >> >> Just my 2 cents, hope this helps.
>> >>
>> >> Your logic is completely flawed.
>> >> You can not rescale images with LUT tables.
>> >
>> >
>> > I was not resizing the image from 4K to 1080p ... the output was till
>> > 4K.  I was converting from 10-bit in whatever HDR input colorspace
>> > (HLG, or HDR10), to 8-bit SDR output colorspace.  You most definitely
>> > can approximate that transformation with a CLUT.
>> >
>>
>> Seen lut3d filter?
>
> lut3d works with RGB images, my input and output are all YUV  (P010
> actually)
> also, lut3d requires a file parameter, not great for my use case.  I
> could generate a CLUT with zscale and dump it to disk so I could
> initialize lut3d with it, but I hope you see how inconvenient that is
> from API view point.

lut3d could work with any colorspace, its just current limitation.

>
>
>> > Since zscale is capable of resizing and colorspace conversion --
>> > perhaps this functionality should be split into separate filters so
>> > each can be otpimized differently.
>>
>> You logic is completely flawed yet again.
>> zscale is wrapper around another library.
>
> I know, zimg, C++11.

I think there is option for zimg and available for zscale to speed up
some extremly slow conversions.

Dunno what version of zscale you used, but see agamma option. (This is
pure guessing on my side)
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Carl Eugen Hoyos
Am Fr., 31. Mai 2019 um 16:40 Uhr schrieb Lynne :

> Number of threads should not have any impact at all on quality ever.

Afair, it has for x264...
(not necessarily related to this patch though)

Carl Eugen
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Pavel Koshevoy
On Fri, May 31, 2019 at 2:17 PM Paul B Mahol  wrote:
>
> On 5/31/19, Pavel Koshevoy  wrote:
> > On Fri, May 31, 2019 at 2:03 PM Paul B Mahol  wrote:
> >>
> >> On 5/31/19, Pavel Koshevoy  wrote:
> >> > On Fri, May 31, 2019 at 1:44 PM Pavel Koshevoy 
> >> > wrote:




> >> >> I've had to use zscale to convert 10-bit 4k60p video from HLG HDR to
> >> >> SDR
> >> >> (bt709).   It was ~36x times slower than real time.  What I ended up
> >> >> doing
> >> >> to speed it up was to generate CLUT image (16-bit yuv444 65x65x65
> >> >> sampling
> >> >> of input color space), lay it out as a 2D image (512x537), and run it
> >> >> through zscale to generate the HDR->SDR transform CLUT.  Then I used
> >> >> the
> >> >> CLUT instead of zscale for every frame...  that got me to about ~3.5x
> >> >> times slower than realtime converting 60fps 10-bit 4k HLG to SDR  (and
> >> >> I
> >> >> don't know any assembly, so I didn't attempt to optimize the CLUT
> >> >> trilinear optimization with SIMD, so maybe it could be faster still).
> >> >> I
> >> >> then ported to CUDA and was able to convert 4k60p HLG->SDR faster than
> >> >> realtime on a Pascal GPU.
> >> >>
> >> >
> >> > I meant trilinear interpolation
> >> >
> >> >
> >> >> So, I'm not sure that adding slice threading to zscale is the best
> >> >> optimization for it.  I think capturing the effect of zscale in a CLUT
> >> >> would be a more significant optimization.
> >> >>
> >> >> Just my 2 cents, hope this helps.
> >>
> >> Your logic is completely flawed.
> >> You can not rescale images with LUT tables.
> >
> >
> > I was not resizing the image from 4K to 1080p ... the output was till
> > 4K.  I was converting from 10-bit in whatever HDR input colorspace
> > (HLG, or HDR10), to 8-bit SDR output colorspace.  You most definitely
> > can approximate that transformation with a CLUT.
> >
>
> Seen lut3d filter?

lut3d works with RGB images, my input and output are all YUV  (P010 actually)
also, lut3d requires a file parameter, not great for my use case.  I
could generate a CLUT with zscale and dump it to disk so I could
initialize lut3d with it, but I hope you see how inconvenient that is
from API view point.


> > Since zscale is capable of resizing and colorspace conversion --
> > perhaps this functionality should be split into separate filters so
> > each can be otpimized differently.
>
> You logic is completely flawed yet again.
> zscale is wrapper around another library.

I know, zimg, C++11.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Paul B Mahol
On 5/31/19, Pavel Koshevoy  wrote:
> On Fri, May 31, 2019 at 2:03 PM Paul B Mahol  wrote:
>>
>> On 5/31/19, Pavel Koshevoy  wrote:
>> > On Fri, May 31, 2019 at 1:44 PM Pavel Koshevoy 
>> > wrote:
>> >>
>> >>
>> >>
>> >>
>> >> On Fri, May 31, 2019 at 4:46 AM Paul B Mahol  wrote:
>> >> >
>> >> > Signed-off-by: Paul B Mahol 
>> >> > ---
>> >> >  libavfilter/vf_zscale.c | 335
>> >> > +---
>> >> >  1 file changed, 214 insertions(+), 121 deletions(-)
>> >> >
>> >> > diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c
>> >> > index f0309272fa..c53bb08ccc 100644
>> >> > --- a/libavfilter/vf_zscale.c
>> >> > +++ b/libavfilter/vf_zscale.c
>> >> > @@ -74,6 +74,16 @@ enum var_name {
>> >> >  VARS_NB
>> >> >  };
>> >> >
>> >> > +typedef struct ZScaleThreadContext {
>> >> > +void *tmp;
>> >> > +size_t tmp_size;
>> >> > +
>> >> > +zimg_image_format src_format, dst_format;
>> >> > +zimg_image_format alpha_src_format, alpha_dst_format;
>> >> > +zimg_graph_builder_params alpha_params, params;
>> >> > +zimg_filter_graph *alpha_graph, *graph;
>> >> > +} ZScaleThreadContext;
>> >> > +
>> >> >  typedef struct ZScaleContext {
>> >> >  const AVClass *class;
>> >> >
>> >> > @@ -100,6 +110,8 @@ typedef struct ZScaleContext {
>> >> >  double nominal_peak_luminance;
>> >> >  int approximate_gamma;
>> >> >
>> >> > +int nb_threads;
>> >> > +
>> >> >  char *w_expr;   ///< width  expression string
>> >> >  char *h_expr;   ///< height expression string
>> >> >
>> >> > @@ -110,13 +122,7 @@ typedef struct ZScaleContext {
>> >> >
>> >> >  int force_original_aspect_ratio;
>> >> >
>> >> > -void *tmp;
>> >> > -size_t tmp_size;
>> >> > -
>> >> > -zimg_image_format src_format, dst_format;
>> >> > -zimg_image_format alpha_src_format, alpha_dst_format;
>> >> > -zimg_graph_builder_params alpha_params, params;
>> >> > -zimg_filter_graph *alpha_graph, *graph;
>> >> > +ZScaleThreadContext *ztd;
>> >> >
>> >> >  enum AVColorSpace in_colorspace, out_colorspace;
>> >> >  enum AVColorTransferCharacteristic in_trc, out_trc;
>> >> > @@ -204,6 +210,12 @@ static int config_props(AVFilterLink *outlink)
>> >> >  int ret;
>> >> >  int factor_w, factor_h;
>> >> >
>> >> > +s->nb_threads = ff_filter_get_nb_threads(ctx);
>> >> > +av_freep(>ztd);
>> >> > +s->ztd = av_calloc(s->nb_threads, sizeof(*s->ztd));
>> >> > +if (!s->ztd)
>> >> > +return AVERROR(ENOMEM);
>> >> > +
>> >> >  var_values[VAR_IN_W]  = var_values[VAR_IW] = inlink->w;
>> >> >  var_values[VAR_IN_H]  = var_values[VAR_IH] = inlink->h;
>> >> >  var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN;
>> >> > @@ -458,10 +470,12 @@ static int convert_range(enum AVColorRange
>> >> > color_range)
>> >> >  }
>> >> >
>> >> >  static void format_init(zimg_image_format *format, AVFrame *frame,
>> >> > const AVPixFmtDescriptor *desc,
>> >> > -int colorspace, int primaries, int transfer,
>> >> > int range, int location)
>> >> > +int colorspace, int primaries, int transfer,
>> >> > int range, int location,
>> >> > +int width, int height,
>> >> > +double active_top, double active_height, int
>> >> > set_active)
>> >> >  {
>> >> > -format->width = frame->width;
>> >> > -format->height = frame->height;
>> >> > +format->width = width;
>> >> > +format->height = height;
>> >> >  format->subsample_w = desc->log2_chroma_w;
>> >> >  format->subsample_h = desc->log2_chroma_h;
>> >> >  format->depth = desc->comp[0].depth;
>> >> > @@ -472,6 +486,10 @@ static void format_init(zimg_image_format
>> >> > *format,
>> >> > AVFrame *frame, const AVPixFm
>> >> >  format->transfer_characteristics = transfer == - 1 ?
>> >> > convert_trc(frame->color_trc) : transfer;
>> >> >  format->pixel_range = (desc->flags & AV_PIX_FMT_FLAG_RGB) ?
>> >> > ZIMG_RANGE_FULL : range == -1 ? convert_range(frame->color_range) :
>> >> > range;
>> >> >  format->chroma_location = location == -1 ?
>> >> > convert_chroma_location(frame->chroma_location) : location;
>> >> > +if (!set_active)
>> >> > +return;
>> >> > +format->active_region.top = active_top;
>> >> > +format->active_region.height = active_height;
>> >> >  }
>> >> >
>> >> >  static int graph_build(zimg_filter_graph **graph,
>> >> > zimg_graph_builder_params *params,
>> >> > @@ -502,16 +520,163 @@ static int graph_build(zimg_filter_graph
>> >> > **graph,
>> >> > zimg_graph_builder_params *par
>> >> >  return 0;
>> >> >  }
>> >> >
>> >> > +typedef struct ThreadData {
>> >> > +AVFrame *in, *out;
>> >> > +const AVPixFmtDescriptor *desc, *odesc;
>> >> > +} ThreadData;
>> >> > +
>> >> > +static int prepare_graph(AVFilterContext *ctx, void *arg, int jobnr,
>> >> > int nb_jobs)
>> >> > +{
>> >> > +ZScaleContext *s = ctx->priv;
>> >> > +

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Pavel Koshevoy
On Fri, May 31, 2019 at 2:03 PM Paul B Mahol  wrote:
>
> On 5/31/19, Pavel Koshevoy  wrote:
> > On Fri, May 31, 2019 at 1:44 PM Pavel Koshevoy  wrote:
> >>
> >>
> >>
> >>
> >> On Fri, May 31, 2019 at 4:46 AM Paul B Mahol  wrote:
> >> >
> >> > Signed-off-by: Paul B Mahol 
> >> > ---
> >> >  libavfilter/vf_zscale.c | 335 +---
> >> >  1 file changed, 214 insertions(+), 121 deletions(-)
> >> >
> >> > diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c
> >> > index f0309272fa..c53bb08ccc 100644
> >> > --- a/libavfilter/vf_zscale.c
> >> > +++ b/libavfilter/vf_zscale.c
> >> > @@ -74,6 +74,16 @@ enum var_name {
> >> >  VARS_NB
> >> >  };
> >> >
> >> > +typedef struct ZScaleThreadContext {
> >> > +void *tmp;
> >> > +size_t tmp_size;
> >> > +
> >> > +zimg_image_format src_format, dst_format;
> >> > +zimg_image_format alpha_src_format, alpha_dst_format;
> >> > +zimg_graph_builder_params alpha_params, params;
> >> > +zimg_filter_graph *alpha_graph, *graph;
> >> > +} ZScaleThreadContext;
> >> > +
> >> >  typedef struct ZScaleContext {
> >> >  const AVClass *class;
> >> >
> >> > @@ -100,6 +110,8 @@ typedef struct ZScaleContext {
> >> >  double nominal_peak_luminance;
> >> >  int approximate_gamma;
> >> >
> >> > +int nb_threads;
> >> > +
> >> >  char *w_expr;   ///< width  expression string
> >> >  char *h_expr;   ///< height expression string
> >> >
> >> > @@ -110,13 +122,7 @@ typedef struct ZScaleContext {
> >> >
> >> >  int force_original_aspect_ratio;
> >> >
> >> > -void *tmp;
> >> > -size_t tmp_size;
> >> > -
> >> > -zimg_image_format src_format, dst_format;
> >> > -zimg_image_format alpha_src_format, alpha_dst_format;
> >> > -zimg_graph_builder_params alpha_params, params;
> >> > -zimg_filter_graph *alpha_graph, *graph;
> >> > +ZScaleThreadContext *ztd;
> >> >
> >> >  enum AVColorSpace in_colorspace, out_colorspace;
> >> >  enum AVColorTransferCharacteristic in_trc, out_trc;
> >> > @@ -204,6 +210,12 @@ static int config_props(AVFilterLink *outlink)
> >> >  int ret;
> >> >  int factor_w, factor_h;
> >> >
> >> > +s->nb_threads = ff_filter_get_nb_threads(ctx);
> >> > +av_freep(>ztd);
> >> > +s->ztd = av_calloc(s->nb_threads, sizeof(*s->ztd));
> >> > +if (!s->ztd)
> >> > +return AVERROR(ENOMEM);
> >> > +
> >> >  var_values[VAR_IN_W]  = var_values[VAR_IW] = inlink->w;
> >> >  var_values[VAR_IN_H]  = var_values[VAR_IH] = inlink->h;
> >> >  var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN;
> >> > @@ -458,10 +470,12 @@ static int convert_range(enum AVColorRange
> >> > color_range)
> >> >  }
> >> >
> >> >  static void format_init(zimg_image_format *format, AVFrame *frame,
> >> > const AVPixFmtDescriptor *desc,
> >> > -int colorspace, int primaries, int transfer,
> >> > int range, int location)
> >> > +int colorspace, int primaries, int transfer,
> >> > int range, int location,
> >> > +int width, int height,
> >> > +double active_top, double active_height, int
> >> > set_active)
> >> >  {
> >> > -format->width = frame->width;
> >> > -format->height = frame->height;
> >> > +format->width = width;
> >> > +format->height = height;
> >> >  format->subsample_w = desc->log2_chroma_w;
> >> >  format->subsample_h = desc->log2_chroma_h;
> >> >  format->depth = desc->comp[0].depth;
> >> > @@ -472,6 +486,10 @@ static void format_init(zimg_image_format *format,
> >> > AVFrame *frame, const AVPixFm
> >> >  format->transfer_characteristics = transfer == - 1 ?
> >> > convert_trc(frame->color_trc) : transfer;
> >> >  format->pixel_range = (desc->flags & AV_PIX_FMT_FLAG_RGB) ?
> >> > ZIMG_RANGE_FULL : range == -1 ? convert_range(frame->color_range) :
> >> > range;
> >> >  format->chroma_location = location == -1 ?
> >> > convert_chroma_location(frame->chroma_location) : location;
> >> > +if (!set_active)
> >> > +return;
> >> > +format->active_region.top = active_top;
> >> > +format->active_region.height = active_height;
> >> >  }
> >> >
> >> >  static int graph_build(zimg_filter_graph **graph,
> >> > zimg_graph_builder_params *params,
> >> > @@ -502,16 +520,163 @@ static int graph_build(zimg_filter_graph **graph,
> >> > zimg_graph_builder_params *par
> >> >  return 0;
> >> >  }
> >> >
> >> > +typedef struct ThreadData {
> >> > +AVFrame *in, *out;
> >> > +const AVPixFmtDescriptor *desc, *odesc;
> >> > +} ThreadData;
> >> > +
> >> > +static int prepare_graph(AVFilterContext *ctx, void *arg, int jobnr,
> >> > int nb_jobs)
> >> > +{
> >> > +ZScaleContext *s = ctx->priv;
> >> > +ThreadData *td = arg;
> >> > +AVFrame *in = td->in;
> >> > +AVFrame *out = td->out;
> >> > +const AVPixFmtDescriptor *desc = td->desc;
> >> > +const AVPixFmtDescriptor *odesc = 

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Paul B Mahol
On 5/31/19, Pavel Koshevoy  wrote:
> On Fri, May 31, 2019 at 1:44 PM Pavel Koshevoy  wrote:
>>
>>
>>
>>
>> On Fri, May 31, 2019 at 4:46 AM Paul B Mahol  wrote:
>> >
>> > Signed-off-by: Paul B Mahol 
>> > ---
>> >  libavfilter/vf_zscale.c | 335 +---
>> >  1 file changed, 214 insertions(+), 121 deletions(-)
>> >
>> > diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c
>> > index f0309272fa..c53bb08ccc 100644
>> > --- a/libavfilter/vf_zscale.c
>> > +++ b/libavfilter/vf_zscale.c
>> > @@ -74,6 +74,16 @@ enum var_name {
>> >  VARS_NB
>> >  };
>> >
>> > +typedef struct ZScaleThreadContext {
>> > +void *tmp;
>> > +size_t tmp_size;
>> > +
>> > +zimg_image_format src_format, dst_format;
>> > +zimg_image_format alpha_src_format, alpha_dst_format;
>> > +zimg_graph_builder_params alpha_params, params;
>> > +zimg_filter_graph *alpha_graph, *graph;
>> > +} ZScaleThreadContext;
>> > +
>> >  typedef struct ZScaleContext {
>> >  const AVClass *class;
>> >
>> > @@ -100,6 +110,8 @@ typedef struct ZScaleContext {
>> >  double nominal_peak_luminance;
>> >  int approximate_gamma;
>> >
>> > +int nb_threads;
>> > +
>> >  char *w_expr;   ///< width  expression string
>> >  char *h_expr;   ///< height expression string
>> >
>> > @@ -110,13 +122,7 @@ typedef struct ZScaleContext {
>> >
>> >  int force_original_aspect_ratio;
>> >
>> > -void *tmp;
>> > -size_t tmp_size;
>> > -
>> > -zimg_image_format src_format, dst_format;
>> > -zimg_image_format alpha_src_format, alpha_dst_format;
>> > -zimg_graph_builder_params alpha_params, params;
>> > -zimg_filter_graph *alpha_graph, *graph;
>> > +ZScaleThreadContext *ztd;
>> >
>> >  enum AVColorSpace in_colorspace, out_colorspace;
>> >  enum AVColorTransferCharacteristic in_trc, out_trc;
>> > @@ -204,6 +210,12 @@ static int config_props(AVFilterLink *outlink)
>> >  int ret;
>> >  int factor_w, factor_h;
>> >
>> > +s->nb_threads = ff_filter_get_nb_threads(ctx);
>> > +av_freep(>ztd);
>> > +s->ztd = av_calloc(s->nb_threads, sizeof(*s->ztd));
>> > +if (!s->ztd)
>> > +return AVERROR(ENOMEM);
>> > +
>> >  var_values[VAR_IN_W]  = var_values[VAR_IW] = inlink->w;
>> >  var_values[VAR_IN_H]  = var_values[VAR_IH] = inlink->h;
>> >  var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN;
>> > @@ -458,10 +470,12 @@ static int convert_range(enum AVColorRange
>> > color_range)
>> >  }
>> >
>> >  static void format_init(zimg_image_format *format, AVFrame *frame,
>> > const AVPixFmtDescriptor *desc,
>> > -int colorspace, int primaries, int transfer,
>> > int range, int location)
>> > +int colorspace, int primaries, int transfer,
>> > int range, int location,
>> > +int width, int height,
>> > +double active_top, double active_height, int
>> > set_active)
>> >  {
>> > -format->width = frame->width;
>> > -format->height = frame->height;
>> > +format->width = width;
>> > +format->height = height;
>> >  format->subsample_w = desc->log2_chroma_w;
>> >  format->subsample_h = desc->log2_chroma_h;
>> >  format->depth = desc->comp[0].depth;
>> > @@ -472,6 +486,10 @@ static void format_init(zimg_image_format *format,
>> > AVFrame *frame, const AVPixFm
>> >  format->transfer_characteristics = transfer == - 1 ?
>> > convert_trc(frame->color_trc) : transfer;
>> >  format->pixel_range = (desc->flags & AV_PIX_FMT_FLAG_RGB) ?
>> > ZIMG_RANGE_FULL : range == -1 ? convert_range(frame->color_range) :
>> > range;
>> >  format->chroma_location = location == -1 ?
>> > convert_chroma_location(frame->chroma_location) : location;
>> > +if (!set_active)
>> > +return;
>> > +format->active_region.top = active_top;
>> > +format->active_region.height = active_height;
>> >  }
>> >
>> >  static int graph_build(zimg_filter_graph **graph,
>> > zimg_graph_builder_params *params,
>> > @@ -502,16 +520,163 @@ static int graph_build(zimg_filter_graph **graph,
>> > zimg_graph_builder_params *par
>> >  return 0;
>> >  }
>> >
>> > +typedef struct ThreadData {
>> > +AVFrame *in, *out;
>> > +const AVPixFmtDescriptor *desc, *odesc;
>> > +} ThreadData;
>> > +
>> > +static int prepare_graph(AVFilterContext *ctx, void *arg, int jobnr,
>> > int nb_jobs)
>> > +{
>> > +ZScaleContext *s = ctx->priv;
>> > +ThreadData *td = arg;
>> > +AVFrame *in = td->in;
>> > +AVFrame *out = td->out;
>> > +const AVPixFmtDescriptor *desc = td->desc;
>> > +const AVPixFmtDescriptor *odesc = td->odesc;
>> > +const int in_slice_start = (in->height * jobnr) / nb_jobs;
>> > +const int in_slice_end = (in->height * (jobnr+1)) / nb_jobs;
>> > +const int out_slice_start = (out->height * jobnr) / nb_jobs;
>> > +const int out_slice_end = (out->height * (jobnr+1)) / nb_jobs;
>> > +const 

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Pavel Koshevoy
On Fri, May 31, 2019 at 1:44 PM Pavel Koshevoy  wrote:
>
>
>
>
> On Fri, May 31, 2019 at 4:46 AM Paul B Mahol  wrote:
> >
> > Signed-off-by: Paul B Mahol 
> > ---
> >  libavfilter/vf_zscale.c | 335 +---
> >  1 file changed, 214 insertions(+), 121 deletions(-)
> >
> > diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c
> > index f0309272fa..c53bb08ccc 100644
> > --- a/libavfilter/vf_zscale.c
> > +++ b/libavfilter/vf_zscale.c
> > @@ -74,6 +74,16 @@ enum var_name {
> >  VARS_NB
> >  };
> >
> > +typedef struct ZScaleThreadContext {
> > +void *tmp;
> > +size_t tmp_size;
> > +
> > +zimg_image_format src_format, dst_format;
> > +zimg_image_format alpha_src_format, alpha_dst_format;
> > +zimg_graph_builder_params alpha_params, params;
> > +zimg_filter_graph *alpha_graph, *graph;
> > +} ZScaleThreadContext;
> > +
> >  typedef struct ZScaleContext {
> >  const AVClass *class;
> >
> > @@ -100,6 +110,8 @@ typedef struct ZScaleContext {
> >  double nominal_peak_luminance;
> >  int approximate_gamma;
> >
> > +int nb_threads;
> > +
> >  char *w_expr;   ///< width  expression string
> >  char *h_expr;   ///< height expression string
> >
> > @@ -110,13 +122,7 @@ typedef struct ZScaleContext {
> >
> >  int force_original_aspect_ratio;
> >
> > -void *tmp;
> > -size_t tmp_size;
> > -
> > -zimg_image_format src_format, dst_format;
> > -zimg_image_format alpha_src_format, alpha_dst_format;
> > -zimg_graph_builder_params alpha_params, params;
> > -zimg_filter_graph *alpha_graph, *graph;
> > +ZScaleThreadContext *ztd;
> >
> >  enum AVColorSpace in_colorspace, out_colorspace;
> >  enum AVColorTransferCharacteristic in_trc, out_trc;
> > @@ -204,6 +210,12 @@ static int config_props(AVFilterLink *outlink)
> >  int ret;
> >  int factor_w, factor_h;
> >
> > +s->nb_threads = ff_filter_get_nb_threads(ctx);
> > +av_freep(>ztd);
> > +s->ztd = av_calloc(s->nb_threads, sizeof(*s->ztd));
> > +if (!s->ztd)
> > +return AVERROR(ENOMEM);
> > +
> >  var_values[VAR_IN_W]  = var_values[VAR_IW] = inlink->w;
> >  var_values[VAR_IN_H]  = var_values[VAR_IH] = inlink->h;
> >  var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN;
> > @@ -458,10 +470,12 @@ static int convert_range(enum AVColorRange 
> > color_range)
> >  }
> >
> >  static void format_init(zimg_image_format *format, AVFrame *frame, const 
> > AVPixFmtDescriptor *desc,
> > -int colorspace, int primaries, int transfer, int 
> > range, int location)
> > +int colorspace, int primaries, int transfer, int 
> > range, int location,
> > +int width, int height,
> > +double active_top, double active_height, int 
> > set_active)
> >  {
> > -format->width = frame->width;
> > -format->height = frame->height;
> > +format->width = width;
> > +format->height = height;
> >  format->subsample_w = desc->log2_chroma_w;
> >  format->subsample_h = desc->log2_chroma_h;
> >  format->depth = desc->comp[0].depth;
> > @@ -472,6 +486,10 @@ static void format_init(zimg_image_format *format, 
> > AVFrame *frame, const AVPixFm
> >  format->transfer_characteristics = transfer == - 1 ? 
> > convert_trc(frame->color_trc) : transfer;
> >  format->pixel_range = (desc->flags & AV_PIX_FMT_FLAG_RGB) ? 
> > ZIMG_RANGE_FULL : range == -1 ? convert_range(frame->color_range) : range;
> >  format->chroma_location = location == -1 ? 
> > convert_chroma_location(frame->chroma_location) : location;
> > +if (!set_active)
> > +return;
> > +format->active_region.top = active_top;
> > +format->active_region.height = active_height;
> >  }
> >
> >  static int graph_build(zimg_filter_graph **graph, 
> > zimg_graph_builder_params *params,
> > @@ -502,16 +520,163 @@ static int graph_build(zimg_filter_graph **graph, 
> > zimg_graph_builder_params *par
> >  return 0;
> >  }
> >
> > +typedef struct ThreadData {
> > +AVFrame *in, *out;
> > +const AVPixFmtDescriptor *desc, *odesc;
> > +} ThreadData;
> > +
> > +static int prepare_graph(AVFilterContext *ctx, void *arg, int jobnr, int 
> > nb_jobs)
> > +{
> > +ZScaleContext *s = ctx->priv;
> > +ThreadData *td = arg;
> > +AVFrame *in = td->in;
> > +AVFrame *out = td->out;
> > +const AVPixFmtDescriptor *desc = td->desc;
> > +const AVPixFmtDescriptor *odesc = td->odesc;
> > +const int in_slice_start = (in->height * jobnr) / nb_jobs;
> > +const int in_slice_end = (in->height * (jobnr+1)) / nb_jobs;
> > +const int out_slice_start = (out->height * jobnr) / nb_jobs;
> > +const int out_slice_end = (out->height * (jobnr+1)) / nb_jobs;
> > +const double scale_h = (double)in->height / (double)out->height;
> > +double active_top = out_slice_start * scale_h;
> > +double active_height = (out_slice_end 

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Pavel Koshevoy
On Fri, May 31, 2019 at 4:46 AM Paul B Mahol  wrote:
>
> Signed-off-by: Paul B Mahol 
> ---
>  libavfilter/vf_zscale.c | 335 +---
>  1 file changed, 214 insertions(+), 121 deletions(-)
>
> diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c
> index f0309272fa..c53bb08ccc 100644
> --- a/libavfilter/vf_zscale.c
> +++ b/libavfilter/vf_zscale.c
> @@ -74,6 +74,16 @@ enum var_name {
>  VARS_NB
>  };
>
> +typedef struct ZScaleThreadContext {
> +void *tmp;
> +size_t tmp_size;
> +
> +zimg_image_format src_format, dst_format;
> +zimg_image_format alpha_src_format, alpha_dst_format;
> +zimg_graph_builder_params alpha_params, params;
> +zimg_filter_graph *alpha_graph, *graph;
> +} ZScaleThreadContext;
> +
>  typedef struct ZScaleContext {
>  const AVClass *class;
>
> @@ -100,6 +110,8 @@ typedef struct ZScaleContext {
>  double nominal_peak_luminance;
>  int approximate_gamma;
>
> +int nb_threads;
> +
>  char *w_expr;   ///< width  expression string
>  char *h_expr;   ///< height expression string
>
> @@ -110,13 +122,7 @@ typedef struct ZScaleContext {
>
>  int force_original_aspect_ratio;
>
> -void *tmp;
> -size_t tmp_size;
> -
> -zimg_image_format src_format, dst_format;
> -zimg_image_format alpha_src_format, alpha_dst_format;
> -zimg_graph_builder_params alpha_params, params;
> -zimg_filter_graph *alpha_graph, *graph;
> +ZScaleThreadContext *ztd;
>
>  enum AVColorSpace in_colorspace, out_colorspace;
>  enum AVColorTransferCharacteristic in_trc, out_trc;
> @@ -204,6 +210,12 @@ static int config_props(AVFilterLink *outlink)
>  int ret;
>  int factor_w, factor_h;
>
> +s->nb_threads = ff_filter_get_nb_threads(ctx);
> +av_freep(>ztd);
> +s->ztd = av_calloc(s->nb_threads, sizeof(*s->ztd));
> +if (!s->ztd)
> +return AVERROR(ENOMEM);
> +
>  var_values[VAR_IN_W]  = var_values[VAR_IW] = inlink->w;
>  var_values[VAR_IN_H]  = var_values[VAR_IH] = inlink->h;
>  var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN;
> @@ -458,10 +470,12 @@ static int convert_range(enum AVColorRange color_range)
>  }
>
>  static void format_init(zimg_image_format *format, AVFrame *frame, const 
> AVPixFmtDescriptor *desc,
> -int colorspace, int primaries, int transfer, int 
> range, int location)
> +int colorspace, int primaries, int transfer, int 
> range, int location,
> +int width, int height,
> +double active_top, double active_height, int 
> set_active)
>  {
> -format->width = frame->width;
> -format->height = frame->height;
> +format->width = width;
> +format->height = height;
>  format->subsample_w = desc->log2_chroma_w;
>  format->subsample_h = desc->log2_chroma_h;
>  format->depth = desc->comp[0].depth;
> @@ -472,6 +486,10 @@ static void format_init(zimg_image_format *format, 
> AVFrame *frame, const AVPixFm
>  format->transfer_characteristics = transfer == - 1 ? 
> convert_trc(frame->color_trc) : transfer;
>  format->pixel_range = (desc->flags & AV_PIX_FMT_FLAG_RGB) ? 
> ZIMG_RANGE_FULL : range == -1 ? convert_range(frame->color_range) : range;
>  format->chroma_location = location == -1 ? 
> convert_chroma_location(frame->chroma_location) : location;
> +if (!set_active)
> +return;
> +format->active_region.top = active_top;
> +format->active_region.height = active_height;
>  }
>
>  static int graph_build(zimg_filter_graph **graph, zimg_graph_builder_params 
> *params,
> @@ -502,16 +520,163 @@ static int graph_build(zimg_filter_graph **graph, 
> zimg_graph_builder_params *par
>  return 0;
>  }
>
> +typedef struct ThreadData {
> +AVFrame *in, *out;
> +const AVPixFmtDescriptor *desc, *odesc;
> +} ThreadData;
> +
> +static int prepare_graph(AVFilterContext *ctx, void *arg, int jobnr, int 
> nb_jobs)
> +{
> +ZScaleContext *s = ctx->priv;
> +ThreadData *td = arg;
> +AVFrame *in = td->in;
> +AVFrame *out = td->out;
> +const AVPixFmtDescriptor *desc = td->desc;
> +const AVPixFmtDescriptor *odesc = td->odesc;
> +const int in_slice_start = (in->height * jobnr) / nb_jobs;
> +const int in_slice_end = (in->height * (jobnr+1)) / nb_jobs;
> +const int out_slice_start = (out->height * jobnr) / nb_jobs;
> +const int out_slice_end = (out->height * (jobnr+1)) / nb_jobs;
> +const double scale_h = (double)in->height / (double)out->height;
> +double active_top = out_slice_start * scale_h;
> +double active_height = (out_slice_end - out_slice_start) * scale_h;
> +int ret;
> +
> +zimg_image_format_default(>ztd[jobnr].src_format, ZIMG_API_VERSION);
> +zimg_image_format_default(>ztd[jobnr].dst_format, ZIMG_API_VERSION);
> +zimg_graph_builder_params_default(>ztd[jobnr].params, 
> ZIMG_API_VERSION);
> +
> +

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Paul B Mahol
On 5/31/19, Hendrik Leppkes  wrote:
> On Fri, May 31, 2019 at 5:32 PM Paul B Mahol  wrote:
>>
>> On 5/31/19, Lynne  wrote:
>> >
>> >
>> >
>> > May 31, 2019, 2:33 PM by one...@gmail.com:
>> >
>> >> On 5/31/19, Lynne  wrote:
>> >>
>> >>>
>> >>>
>> >>>
>> >>> May 31, 2019, 2:16 PM by one...@gmail.com:
>> >>>
>>  On 5/31/19, Lynne  wrote:
>> 
>> > May 31, 2019, 11:45 AM by one...@gmail.com
>> > :
>> >
>> >> Signed-off-by: Paul B Mahol <> one...@gmail.com
>> >> >
>> >> >
>> >> ---
>> >> libavfilter/vf_zscale.c | 335
>> >> +---
>> >> 1 file changed, 214 insertions(+), 121 deletions(-)
>> >>
>> >
>> > This will create discontinuities between each slice.
>> >
>> 
>>  Have you actually tried it?
>> 
>>  I had and its just fine.
>> 
>> >>>
>> >>> Bitexact results with non-nearest scaling? Should be even worse with
>> >>> anything better than bilinear.
>> >>>
>> >>
>> >> Results are always bitexact. It just not bitexact with single
>> >> threading and differences are irrelevant.
>> >>
>> >
>> > Number of threads should not have any impact at all on quality ever.
>>
>> Agreed. And it doesn't have any such impact.
>>
>
> If there is a difference between 1 thread (single threaded), and many
> threads, then there is an impact, and thats not good. Don't downplay
> it for your convenience.
>

I'm ignoring this comment.

> - Hendrik
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Hendrik Leppkes
On Fri, May 31, 2019 at 5:32 PM Paul B Mahol  wrote:
>
> On 5/31/19, Lynne  wrote:
> >
> >
> >
> > May 31, 2019, 2:33 PM by one...@gmail.com:
> >
> >> On 5/31/19, Lynne  wrote:
> >>
> >>>
> >>>
> >>>
> >>> May 31, 2019, 2:16 PM by one...@gmail.com:
> >>>
>  On 5/31/19, Lynne  wrote:
> 
> > May 31, 2019, 11:45 AM by one...@gmail.com :
> >
> >> Signed-off-by: Paul B Mahol <> one...@gmail.com
> >> >
> >> >
> >> ---
> >> libavfilter/vf_zscale.c | 335 +---
> >> 1 file changed, 214 insertions(+), 121 deletions(-)
> >>
> >
> > This will create discontinuities between each slice.
> >
> 
>  Have you actually tried it?
> 
>  I had and its just fine.
> 
> >>>
> >>> Bitexact results with non-nearest scaling? Should be even worse with
> >>> anything better than bilinear.
> >>>
> >>
> >> Results are always bitexact. It just not bitexact with single
> >> threading and differences are irrelevant.
> >>
> >
> > Number of threads should not have any impact at all on quality ever.
>
> Agreed. And it doesn't have any such impact.
>

If there is a difference between 1 thread (single threaded), and many
threads, then there is an impact, and thats not good. Don't downplay
it for your convenience.

- Hendrik
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Paul B Mahol
On 5/31/19, Lynne  wrote:
>
>
>
> May 31, 2019, 2:33 PM by one...@gmail.com:
>
>> On 5/31/19, Lynne  wrote:
>>
>>>
>>>
>>>
>>> May 31, 2019, 2:16 PM by one...@gmail.com:
>>>
 On 5/31/19, Lynne  wrote:

> May 31, 2019, 11:45 AM by one...@gmail.com :
>
>> Signed-off-by: Paul B Mahol <> one...@gmail.com
>> >
>> >
>> ---
>> libavfilter/vf_zscale.c | 335 +---
>> 1 file changed, 214 insertions(+), 121 deletions(-)
>>
>
> This will create discontinuities between each slice.
>

 Have you actually tried it?

 I had and its just fine.

>>>
>>> Bitexact results with non-nearest scaling? Should be even worse with
>>> anything better than bilinear.
>>>
>>
>> Results are always bitexact. It just not bitexact with single
>> threading and differences are irrelevant.
>>
>
> Number of threads should not have any impact at all on quality ever.

Agreed. And it doesn't have any such impact.


> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Lynne



May 31, 2019, 2:33 PM by one...@gmail.com:

> On 5/31/19, Lynne  wrote:
>
>>
>>
>>
>> May 31, 2019, 2:16 PM by one...@gmail.com:
>>
>>> On 5/31/19, Lynne  wrote:
>>>
 May 31, 2019, 11:45 AM by one...@gmail.com :

> Signed-off-by: Paul B Mahol <> one...@gmail.com
> >
> >
> ---
> libavfilter/vf_zscale.c | 335 +---
> 1 file changed, 214 insertions(+), 121 deletions(-)
>

 This will create discontinuities between each slice.

>>>
>>> Have you actually tried it?
>>>
>>> I had and its just fine.
>>>
>>
>> Bitexact results with non-nearest scaling? Should be even worse with
>> anything better than bilinear.
>>
>
> Results are always bitexact. It just not bitexact with single
> threading and differences are irrelevant.
>

Number of threads should not have any impact at all on quality ever.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Paul B Mahol
On 5/31/19, Lynne  wrote:
>
>
>
> May 31, 2019, 2:16 PM by one...@gmail.com:
>
>> On 5/31/19, Lynne  wrote:
>>
>>> May 31, 2019, 11:45 AM by one...@gmail.com :
>>>
 Signed-off-by: Paul B Mahol <> one...@gmail.com
 >
 >
 ---
 libavfilter/vf_zscale.c | 335 +---
 1 file changed, 214 insertions(+), 121 deletions(-)

>>>
>>> This will create discontinuities between each slice.
>>>
>>
>> Have you actually tried it?
>>
>> I had and its just fine.
>>
>
> Bitexact results with non-nearest scaling? Should be even worse with
> anything better than bilinear.

Results are always bitexact. It just not bitexact with single
threading and differences are irrelevant.

> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Lynne



May 31, 2019, 2:16 PM by one...@gmail.com:

> On 5/31/19, Lynne  wrote:
>
>> May 31, 2019, 11:45 AM by one...@gmail.com :
>>
>>> Signed-off-by: Paul B Mahol <> one...@gmail.com >
>>> >
>>> ---
>>> libavfilter/vf_zscale.c | 335 +---
>>> 1 file changed, 214 insertions(+), 121 deletions(-)
>>>
>>
>> This will create discontinuities between each slice.
>>
>
> Have you actually tried it?
>
> I had and its just fine.
>

Bitexact results with non-nearest scaling? Should be even worse with anything 
better than bilinear.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Paul B Mahol
On 5/31/19, Lynne  wrote:
> May 31, 2019, 11:45 AM by one...@gmail.com :
>
>> Signed-off-by: Paul B Mahol <> one...@gmail.com >
>> >
>> ---
>> libavfilter/vf_zscale.c | 335 +---
>> 1 file changed, 214 insertions(+), 121 deletions(-)
>>
>
> This will create discontinuities between each slice.

Have you actually tried it?

I had and its just fine.

>
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/2] avfilter/vf_zscale: add slice threading

2019-05-31 Thread Lynne
May 31, 2019, 11:45 AM by one...@gmail.com :

> Signed-off-by: Paul B Mahol <> one...@gmail.com > >
> ---
> libavfilter/vf_zscale.c | 335 +---
> 1 file changed, 214 insertions(+), 121 deletions(-)
>

This will create discontinuities between each slice.

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".