[FFmpeg-devel] [PATCH] lavfi: add erosion & dilation filter

Clément Bœsch u at pkh.me
Thu Feb 26 22:33:01 CET 2015


On Wed, Feb 25, 2015 at 02:55:58PM +0000, Paul B Mahol wrote:
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
>  doc/filters.texi          |  34 ++++++
>  libavfilter/Makefile      |   2 +
>  libavfilter/allfilters.c  |   2 +
>  libavfilter/vf_neighbor.c | 289 ++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 327 insertions(+)
>  create mode 100644 libavfilter/vf_neighbor.c
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index baef346..13ba797 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -3728,6 +3728,23 @@ FFmpeg was configured with @code{--enable-opencl}. Default value is 0.
>  
>  @end table
>  
> + at section dilation
> +
> +Apply dilation effect to the video.
> +
> +This filter replaces the pixel by the local(3x3) maximum.
> +
> +It accepts the following parameters:
> +
> + at table @option
> + at item threshold
> +Allows to limit the maximum change, default is 65535.
> +
> + at item coordinates
> +Flag which specifies the pixel to refer to. Default is 255 ie. all eight
> +pixels are used.
> + at end table
> +
>  @section drawbox
>  
>  Draw a colored box on the input image.
> @@ -4437,6 +4454,23 @@ value.
>  
>  @end table
>  
> + at section erosion
> +
> +Apply erosion effect to the video.
> +
> +This filter replaces the pixel by the local(3x3) minimum.
> +
> +It accepts the following parameters:
> +
> + at table @option
> + at item threshold
> +Allows to limit the maximum change, default is 65535.
> +
> + at item coordinates
> +Flag which specifies the pixel to refer to. Default is 255 ie. all eight
> +pixels are used.
> + at end table
> +
[...]
> +static int config_input(AVFilterLink *inlink)
> +{
> +    EDContext *s = inlink->dst->priv;
> +    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
> +    int ret;
> +
> +    if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
> +        return ret;
> +
> +    s->planeheight[1] = s->planeheight[2] = FF_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
> +    s->planeheight[0] = s->planeheight[3] = inlink->h;
> +
> +    s->nb_planes = av_pix_fmt_count_planes(inlink->format);

> +    s->buffer = av_malloc(3 * (s->linesize[0] + 32));

av_malloc_array() relevant?

> +    if (!s->buffer)
> +        return AVERROR(ENOMEM);
> +
> +    return 0;
> +}
> +
> +static inline void line_copy8(uint8_t *line, const uint8_t *srcp, int width, int mergin)
> +{
> +    memcpy(line, srcp, width);
> +

> +    for (int i = mergin; i > 0; i--) {

int should be declared out of the scope

> +        line[-i] = line[i];
> +        line[width - 1 + i] = line[width - 1 - i];
> +    }
> +}
> +
[...]

No other comment from me. May I ask if there was a special use case of
this or that's just because the effect were neat and simple to implement?

-- 
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150226/4b262ee6/attachment.asc>


More information about the ffmpeg-devel mailing list