diff options
author | Clément Bœsch <ubitux@gmail.com> | 2013-03-24 20:32:59 +0100 |
---|---|---|
committer | Clément Bœsch <ubitux@gmail.com> | 2013-03-24 20:38:12 +0100 |
commit | 386dc9a3a8bc8e4c751a5725f9030955bfb5f2da (patch) | |
tree | c7d2294e3a2928866bb4ff9bb9620576ac9fcf01 | |
parent | 3b811bcf674038ab298d5dd194992e4e4929d8f2 (diff) | |
download | ffmpeg-386dc9a3a8bc8e4c751a5725f9030955bfb5f2da.tar.gz |
lavfi/thumbnail: add support for named options.
-rw-r--r-- | doc/filters.texi | 24 | ||||
-rw-r--r-- | libavfilter/version.h | 2 | ||||
-rw-r--r-- | libavfilter/vf_thumbnail.c | 27 |
3 files changed, 36 insertions, 17 deletions
diff --git a/doc/filters.texi b/doc/filters.texi index e4aa9921c0..f96a10a75e 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -5251,22 +5251,36 @@ Swap U & V plane. @section thumbnail Select the most representative frame in a given sequence of consecutive frames. -It accepts as argument the frames batch size to analyze (default @var{N}=100); -in a set of @var{N} frames, the filter will pick one of them, and then handle -the next batch of @var{N} frames until the end. +The filter accepts parameters as a list of @var{key}=@var{value} +pairs, separated by ":". If the key of the first options is omitted, +the arguments are interpreted according to the syntax +thumbnail[=@var{n}]. + +@table @option +@item n +Set the frames batch size to analyze; in a set of @var{n} frames, the filter +will pick one of them, and then handle the next batch of @var{n} frames until +the end. Default is @code{100}. +@end table -Since the filter keeps track of the whole frames sequence, a bigger @var{N} +Since the filter keeps track of the whole frames sequence, a bigger @var{n} value will result in a higher memory usage, so a high value is not recommended. -The following example extract one picture each 50 frames: +@subsection Examples + +@itemize +@item +Extract one picture each 50 frames: @example thumbnail=50 @end example +@item Complete example of a thumbnail creation with @command{ffmpeg}: @example ffmpeg -i in.avi -vf thumbnail,scale=300:200 -frames:v 1 out.png @end example +@end itemize @section tile diff --git a/libavfilter/version.h b/libavfilter/version.h index 62a9e53948..b70e0f28fb 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MINOR 48 -#define LIBAVFILTER_VERSION_MICRO 101 +#define LIBAVFILTER_VERSION_MICRO 102 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ diff --git a/libavfilter/vf_thumbnail.c b/libavfilter/vf_thumbnail.c index b62bef6a0a..d32c6c7b29 100644 --- a/libavfilter/vf_thumbnail.c +++ b/libavfilter/vf_thumbnail.c @@ -27,6 +27,7 @@ * @see http://notbrainsurgery.livejournal.com/29773.html */ +#include "libavutil/opt.h" #include "avfilter.h" #include "internal.h" @@ -38,27 +39,27 @@ struct thumb_frame { }; typedef struct { + const AVClass *class; int n; ///< current frame int n_frames; ///< number of frames for analysis struct thumb_frame *frames; ///< the n_frames frames AVRational tb; ///< copy of the input timebase to ease access } ThumbContext; +#define OFFSET(x) offsetof(ThumbContext, x) +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM + +static const AVOption thumbnail_options[] = { + { "n", "set the frames batch size", OFFSET(n_frames), AV_OPT_TYPE_INT, {.i64=100}, 2, INT_MAX, FLAGS }, + { NULL } +}; + +AVFILTER_DEFINE_CLASS(thumbnail); + static av_cold int init(AVFilterContext *ctx, const char *args) { ThumbContext *thumb = ctx->priv; - if (!args) { - thumb->n_frames = 100; - } else { - int n = sscanf(args, "%d", &thumb->n_frames); - if (n != 1 || thumb->n_frames < 2) { - thumb->n_frames = 0; - av_log(ctx, AV_LOG_ERROR, - "Invalid number of frames specified (minimum is 2).\n"); - return AVERROR(EINVAL); - } - } thumb->frames = av_calloc(thumb->n_frames, sizeof(*thumb->frames)); if (!thumb->frames) { av_log(ctx, AV_LOG_ERROR, @@ -226,6 +227,8 @@ static const AVFilterPad thumbnail_outputs[] = { { NULL } }; +static const char *const shorthand[] = { "n", NULL }; + AVFilter avfilter_vf_thumbnail = { .name = "thumbnail", .description = NULL_IF_CONFIG_SMALL("Select the most representative frame in a given sequence of consecutive frames."), @@ -235,4 +238,6 @@ AVFilter avfilter_vf_thumbnail = { .query_formats = query_formats, .inputs = thumbnail_inputs, .outputs = thumbnail_outputs, + .priv_class = &thumbnail_class, + .shorthand = shorthand, }; |