lavfi/fade: accept shorthand syntax

This commit is contained in:
Stefano Sabatini 2013-01-18 18:56:29 +01:00
parent 44d5a28b7d
commit 2852bd704a
3 changed files with 21 additions and 58 deletions

View File

@ -2276,33 +2276,27 @@ edgedetect=low=0.1:high=0.4
Apply fade-in/out effect to input video. Apply fade-in/out effect to input video.
It accepts the parameters: The filter accepts parameters as a list of @var{key}=@var{value}
@var{type}:@var{start_frame}:@var{nb_frames}[:@var{options}] pairs, separated by ":". If the key of the first options is omitted,
the arguments are interpreted according to the syntax
@var{type}:@var{start_frame}:@var{nb_frames}.
@var{type} specifies if the effect type, can be either "in" for A description of the accepted parameters follows.
fade-in, or "out" for a fade-out effect.
@var{start_frame} specifies the number of the start frame for starting
to apply the fade effect.
@var{nb_frames} specifies the number of frames for which the fade
effect has to last. At the end of the fade-in effect the output video
will have the same intensity as the input video, at the end of the
fade-out transition the output video will be completely black.
@var{options} is an optional sequence of @var{key}=@var{value} pairs,
separated by ":". The description of the accepted options follows.
@table @option @table @option
@item type, t @item type, t
See @var{type}. Specify if the effect type, can be either @code{in} for fade-in, or
@code{out} for a fade-out effect. Default is @code{in}.
@item start_frame, s @item start_frame, s
See @var{start_frame}. Specify the number of the start frame for starting to apply the fade
effect. Default is 0.
@item nb_frames, n @item nb_frames, n
See @var{nb_frames}. Specify the number of frames for which the fade effect has to last. At
the end of the fade-in effect the output video will have the same
intensity as the input video, at the end of the fade-out transition
the output video will be completely black. Default is 25.
@item alpha @item alpha
If set to 1, fade only alpha channel, if one exists on the input. If set to 1, fade only alpha channel, if one exists on the input.

View File

@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 32 #define LIBAVFILTER_VERSION_MINOR 32
#define LIBAVFILTER_VERSION_MICRO 100 #define LIBAVFILTER_VERSION_MICRO 101
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \ LIBAVFILTER_VERSION_MINOR, \

View File

@ -78,41 +78,14 @@ AVFILTER_DEFINE_CLASS(fade);
static av_cold int init(AVFilterContext *ctx, const char *args) static av_cold int init(AVFilterContext *ctx, const char *args)
{ {
FadeContext *fade = ctx->priv; FadeContext *fade = ctx->priv;
int ret = 0; static const char *shorthand[] = { "type", "start_frame", "nb_frames", NULL };
char *args1, *expr, *bufptr = NULL; int ret;
fade->class = &fade_class; fade->class = &fade_class;
av_opt_set_defaults(fade); av_opt_set_defaults(fade);
if (!(args1 = av_strdup(args))) { if ((ret = av_opt_set_from_string(fade, args, shorthand, "=", ":")) < 0)
ret = AVERROR(ENOMEM); return ret;
goto end;
}
if (expr = av_strtok(args1, ":", &bufptr)) {
av_free(fade->type);
if (!(fade->type = av_strdup(expr))) {
ret = AVERROR(ENOMEM);
goto end;
}
}
if (expr = av_strtok(NULL, ":", &bufptr)) {
if ((ret = av_opt_set(fade, "start_frame", expr, 0)) < 0) {
av_log(ctx, AV_LOG_ERROR,
"Invalid value '%s' for start_frame option\n", expr);
goto end;
}
}
if (expr = av_strtok(NULL, ":", &bufptr)) {
if ((ret = av_opt_set(fade, "nb_frames", expr, 0)) < 0) {
av_log(ctx, AV_LOG_ERROR,
"Invalid value '%s' for nb_frames option\n", expr);
goto end;
}
}
if (bufptr && (ret = av_set_options_string(fade, bufptr, "=", ":")) < 0)
goto end;
fade->fade_per_frame = (1 << 16) / fade->nb_frames; fade->fade_per_frame = (1 << 16) / fade->nb_frames;
if (!strcmp(fade->type, "in")) if (!strcmp(fade->type, "in"))
@ -123,25 +96,21 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
} else { } else {
av_log(ctx, AV_LOG_ERROR, av_log(ctx, AV_LOG_ERROR,
"Type argument must be 'in' or 'out' but '%s' was specified\n", fade->type); "Type argument must be 'in' or 'out' but '%s' was specified\n", fade->type);
ret = AVERROR(EINVAL); return AVERROR(EINVAL);
goto end;
} }
fade->stop_frame = fade->start_frame + fade->nb_frames; fade->stop_frame = fade->start_frame + fade->nb_frames;
av_log(ctx, AV_LOG_VERBOSE, av_log(ctx, AV_LOG_VERBOSE,
"type:%s start_frame:%d nb_frames:%d alpha:%d\n", "type:%s start_frame:%d nb_frames:%d alpha:%d\n",
fade->type, fade->start_frame, fade->nb_frames, fade->alpha); fade->type, fade->start_frame, fade->nb_frames, fade->alpha);
return 0;
end:
av_free(args1);
return ret;
} }
static av_cold void uninit(AVFilterContext *ctx) static av_cold void uninit(AVFilterContext *ctx)
{ {
FadeContext *fade = ctx->priv; FadeContext *fade = ctx->priv;
av_freep(&fade->type); av_opt_free(fade);
} }
static int query_formats(AVFilterContext *ctx) static int query_formats(AVFilterContext *ctx)