Commit db36ea5b authored by Stefano Sabatini's avatar Stefano Sabatini

lavfi/settb: add support for named options

parent 0407a79e
...@@ -6618,12 +6618,14 @@ ffmpeg -nostats -i input.mp3 -filter_complex ebur128 -f null - ...@@ -6618,12 +6618,14 @@ ffmpeg -nostats -i input.mp3 -filter_complex ebur128 -f null -
Set the timebase to use for the output frames timestamps. Set the timebase to use for the output frames timestamps.
It is mainly useful for testing timebase configuration. It is mainly useful for testing timebase configuration.
It accepts in input an arithmetic expression representing a rational. This filter accepts a single option @option{tb}, which can be
The expression can contain the constants "AVTB" (the specified either by setting @option{tb}=@var{VALUE} or setting the
default timebase), "intb" (the input timebase) and "sr" (the sample rate, value alone.
audio only).
The value for @option{tb} is an arithmetic expression representing a
The default value for the input is "intb". rational. The expression can contain the constants "AVTB" (the default
timebase), "intb" (the input timebase) and "sr" (the sample rate,
audio only). Default value is "intb".
@subsection Examples @subsection Examples
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "libavutil/eval.h" #include "libavutil/eval.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/mathematics.h" #include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include "libavutil/rational.h" #include "libavutil/rational.h"
#include "avfilter.h" #include "avfilter.h"
#include "internal.h" #include "internal.h"
...@@ -51,21 +52,40 @@ enum var_name { ...@@ -51,21 +52,40 @@ enum var_name {
}; };
typedef struct { typedef struct {
char tb_expr[256]; const AVClass *class;
char *tb_expr;
double var_values[VAR_VARS_NB]; double var_values[VAR_VARS_NB];
} SetTBContext; } SetTBContext;
static av_cold int init(AVFilterContext *ctx, const char *args) #define OFFSET(x) offsetof(SetTBContext, x)
#define DEFINE_OPTIONS(filt_name, filt_type) \
static const AVOption filt_name##_options[] = { \
{ "tb", "set timebase expression", OFFSET(tb_expr), AV_OPT_TYPE_STRING, {.str="intb"}, \
.flags=AV_OPT_FLAG_##filt_type##_PARAM|AV_OPT_FLAG_FILTERING_PARAM }, \
{ NULL } \
}
static av_cold int init(AVFilterContext *ctx, const char *args, const AVClass *class)
{ {
SetTBContext *settb = ctx->priv; SetTBContext *settb = ctx->priv;
av_strlcpy(settb->tb_expr, "intb", sizeof(settb->tb_expr)); static const char *shorthand[] = { "tb", NULL };
int ret;
if (args) settb->class = class;
sscanf(args, "%255[^:]", settb->tb_expr); av_opt_set_defaults(settb);
if ((ret = av_opt_set_from_string(settb, args, shorthand, "=", ":")) < 0)
return ret;
return 0; return 0;
} }
static av_cold void uninit(AVFilterContext *ctx)
{
SetTBContext *settb = ctx->priv;
av_opt_free(settb);
}
static int config_output_props(AVFilterLink *outlink) static int config_output_props(AVFilterLink *outlink)
{ {
AVFilterContext *ctx = outlink->src; AVFilterContext *ctx = outlink->src;
...@@ -120,6 +140,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) ...@@ -120,6 +140,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
} }
#if CONFIG_SETTB_FILTER #if CONFIG_SETTB_FILTER
DEFINE_OPTIONS(settb, VIDEO);
AVFILTER_DEFINE_CLASS(settb);
static av_cold int settb_init(AVFilterContext *ctx, const char *args)
{
return init(ctx, args, &settb_class);
}
static const AVFilterPad avfilter_vf_settb_inputs[] = { static const AVFilterPad avfilter_vf_settb_inputs[] = {
{ {
.name = "default", .name = "default",
...@@ -142,16 +171,27 @@ static const AVFilterPad avfilter_vf_settb_outputs[] = { ...@@ -142,16 +171,27 @@ static const AVFilterPad avfilter_vf_settb_outputs[] = {
AVFilter avfilter_vf_settb = { AVFilter avfilter_vf_settb = {
.name = "settb", .name = "settb",
.description = NULL_IF_CONFIG_SMALL("Set timebase for the video output link."), .description = NULL_IF_CONFIG_SMALL("Set timebase for the video output link."),
.init = init, .init = settb_init,
.uninit = uninit,
.priv_size = sizeof(SetTBContext), .priv_size = sizeof(SetTBContext),
.inputs = avfilter_vf_settb_inputs, .inputs = avfilter_vf_settb_inputs,
.outputs = avfilter_vf_settb_outputs, .outputs = avfilter_vf_settb_outputs,
.priv_class = &settb_class,
}; };
#endif #endif
#if CONFIG_ASETTB_FILTER #if CONFIG_ASETTB_FILTER
DEFINE_OPTIONS(asettb, AUDIO);
AVFILTER_DEFINE_CLASS(asettb);
static av_cold int asettb_init(AVFilterContext *ctx, const char *args)
{
return init(ctx, args, &asettb_class);
}
static const AVFilterPad avfilter_af_asettb_inputs[] = { static const AVFilterPad avfilter_af_asettb_inputs[] = {
{ {
.name = "default", .name = "default",
...@@ -174,10 +214,12 @@ static const AVFilterPad avfilter_af_asettb_outputs[] = { ...@@ -174,10 +214,12 @@ static const AVFilterPad avfilter_af_asettb_outputs[] = {
AVFilter avfilter_af_asettb = { AVFilter avfilter_af_asettb = {
.name = "asettb", .name = "asettb",
.description = NULL_IF_CONFIG_SMALL("Set timebase for the audio output link."), .description = NULL_IF_CONFIG_SMALL("Set timebase for the audio output link."),
.init = init, .init = asettb_init,
.uninit = uninit,
.priv_size = sizeof(SetTBContext), .priv_size = sizeof(SetTBContext),
.inputs = avfilter_af_asettb_inputs, .inputs = avfilter_af_asettb_inputs,
.outputs = avfilter_af_asettb_outputs, .outputs = avfilter_af_asettb_outputs,
.priv_class = &asettb_class,
}; };
#endif #endif
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 47 #define LIBAVFILTER_VERSION_MINOR 47
#define LIBAVFILTER_VERSION_MICRO 101 #define LIBAVFILTER_VERSION_MICRO 102
#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, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment