[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