[FFmpeg-devel] [PATCH] avfilter/mandelbrot: add duration option.

wm4 nfxjfg at googlemail.com
Sun May 4 12:14:52 CEST 2014


On Sun,  4 May 2014 11:08:01 +0200
Clément Bœsch <u at pkh.me> wrote:

> ---
>  doc/filters.texi              |  3 +++
>  libavfilter/vsrc_mandelbrot.c | 11 ++++++++++-
>  2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 923551f..265b6b8 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -8914,6 +8914,9 @@ Default value is @var{normalized_iteration_count}.
>  Set frame rate, expressed as number of frames per second. Default
>  value is "25".
>  
> + at item duration, d
> +Specify the duration of the generated audio stream.
> +
>  @item size, s
>  Set frame size. For the syntax of this option, check the "Video
>  size" section in the ffmpeg-utils manual. Default value is "640x480".
> diff --git a/libavfilter/vsrc_mandelbrot.c b/libavfilter/vsrc_mandelbrot.c
> index 19dddf9..b67e695 100644
> --- a/libavfilter/vsrc_mandelbrot.c
> +++ b/libavfilter/vsrc_mandelbrot.c
> @@ -61,6 +61,7 @@ typedef struct {
>      const AVClass *class;
>      int w, h;
>      AVRational frame_rate;
> +    int64_t duration;
>      uint64_t pts;
>      int maxiter;
>      double start_x;
> @@ -91,6 +92,8 @@ static const AVOption mandelbrot_options[] = {
>      {"s",           "set frame size",                OFFSET(w),       AV_OPT_TYPE_IMAGE_SIZE, {.str="640x480"},  CHAR_MIN, CHAR_MAX, FLAGS },
>      {"rate",        "set frame rate",                OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"},  CHAR_MIN, CHAR_MAX, FLAGS },
>      {"r",           "set frame rate",                OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"},  CHAR_MIN, CHAR_MAX, FLAGS },
> +    {"duration",    "set video duration",            OFFSET(duration), AV_OPT_TYPE_DURATION,  {.i64 = -1}, -1, INT64_MAX, FLAGS },
> +    {"d",           "set video duration",            OFFSET(duration), AV_OPT_TYPE_DURATION,  {.i64 = -1}, -1, INT64_MAX, FLAGS },
>      {"maxiter",     "set max iterations number",     OFFSET(maxiter), AV_OPT_TYPE_INT,        {.i64=7189},  1,        INT_MAX, FLAGS },
>      {"start_x",     "set the initial x position",    OFFSET(start_x), AV_OPT_TYPE_DOUBLE,     {.dbl=-0.743643887037158704752191506114774}, -100, 100, FLAGS },
>      {"start_y",     "set the initial y position",    OFFSET(start_y), AV_OPT_TYPE_DOUBLE,     {.dbl=-0.131825904205311970493132056385139}, -100, 100, FLAGS },
> @@ -396,7 +399,13 @@ static void draw_mandelbrot(AVFilterContext *ctx, uint32_t *color, int linesize,
>  static int request_frame(AVFilterLink *link)
>  {
>      MBContext *mb = link->src->priv;
> -    AVFrame *picref = ff_get_video_buffer(link, mb->w, mb->h);
> +    AVFrame *picref;
> +
> +    if (mb->duration >= 0 &&
> +        av_rescale_q(mb->pts, link->time_base, AV_TIME_BASE_Q) >= mb->duration)
> +        return AVERROR_EOF;
> +
> +    picref = ff_get_video_buffer(link, mb->w, mb->h);
>      if (!picref)
>          return AVERROR(ENOMEM);
>  

Why is this needed, instead of another filter that makes the video EOF
after a certain duration?


More information about the ffmpeg-devel mailing list