On Mon, Mar 31, 2014 at 8:28 PM, Katerina Barone-Adesi <kateri...@gmail.com> wrote: > Ported asettb (including the sr option for audio sample rate), > and documentation from ffmpeg. > --- > doc/filters.texi | 43 +++++++++++++++++++++++++++++- > libavfilter/Makefile | 1 + > libavfilter/allfilters.c | 1 + > libavfilter/settb.c | 68 > ++++++++++++++++++++++++++++++++++++++++-------- > 4 files changed, 101 insertions(+), 12 deletions(-)
When you add a filter you should also bump (add a +1) the MINOR version number in version.h. This is because we can identify easily in which version a given filter was introduced. Also adding a new filter is a feature, so it should be mentioned in the Changelog too. > diff --git a/doc/filters.texi b/doc/filters.texi > index 93625c6..027bbfd 100644 > --- a/doc/filters.texi > +++ b/doc/filters.texi > @@ -260,6 +260,47 @@ asetpts=expr=N/SR/TB > asetpts='(RTCTIME - RTCSTART) / (TB * 1000000)" > @end example > > +@section asettb > + > +Set the timebase to use for the output frames timestamps. > +It is mainly useful for testing timebase configuration. > + > +This filter accepts the following options: > + > +@table @option > + > +@item expr > +The expression which is evaluated into the output timebase. > + > +@end table > + > +The expression can contain the constants "PI", "E", "PHI", "AVTB" (the > +default timebase), "intb" (the input timebase), and "sr" (the sample rate, > +audio only). > + > +The default value for the input is "intb". > + > +Some examples: > + > +@example > +# set the timebase to 1/25 > +settb=1/25 > + > +# set the timebase to 1/10 > +settb=0.1 > + > +#set the timebase to 1001/1000 > +settb=1+0.001 > + > +#set the timebase to 2*intb > +settb=2*intb > + > +#set the default timebase value > +settb=AVTB > + > +#set the timebase to twice the sample rate > +asettb=sr*2 > +@end example > > @section ashowinfo > > @@ -2392,7 +2433,7 @@ default timebase), and "intb" (the input timebase). > > The default value for the input is "intb". > > -Follow some examples. > +Some examples: This change is unneeded imho > > @example > # set the timebase to 1/25 > diff --git a/libavfilter/Makefile b/libavfilter/Makefile > index 1f5e433..9c5c666 100644 > --- a/libavfilter/Makefile > +++ b/libavfilter/Makefile > @@ -28,6 +28,7 @@ OBJS-$(CONFIG_AFORMAT_FILTER) += af_aformat.o > OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o > OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o > OBJS-$(CONFIG_ASETPTS_FILTER) += setpts.o > +OBJS-$(CONFIG_ASETTB_FILTER) += settb.o > OBJS-$(CONFIG_ASHOWINFO_FILTER) += af_ashowinfo.o > OBJS-$(CONFIG_ASPLIT_FILTER) += split.o > OBJS-$(CONFIG_ASYNCTS_FILTER) += af_asyncts.o > diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c > index ddca153..d7bb47a 100644 > --- a/libavfilter/allfilters.c > +++ b/libavfilter/allfilters.c > @@ -48,6 +48,7 @@ void avfilter_register_all(void) > REGISTER_FILTER(AMIX, amix, af); > REGISTER_FILTER(ANULL, anull, af); > REGISTER_FILTER(ASETPTS, asetpts, af); > + REGISTER_FILTER(ASETTB, asettb, af); > REGISTER_FILTER(ASHOWINFO, ashowinfo, af); > REGISTER_FILTER(ASPLIT, asplit, af); > REGISTER_FILTER(ASYNCTS, asyncts, af); > diff --git a/libavfilter/settb.c b/libavfilter/settb.c > index 87b60a7..83405f8 100644 > --- a/libavfilter/settb.c > +++ b/libavfilter/settb.c > @@ -32,6 +32,7 @@ > #include "libavutil/mathematics.h" > #include "libavutil/opt.h" > #include "libavutil/rational.h" > +#include "audio.h" > #include "avfilter.h" > #include "internal.h" > #include "video.h" > @@ -42,6 +43,7 @@ static const char *const var_names[] = { > "PI", > "AVTB", /* default timebase 1/AV_TIME_BASE */ > "intb", /* input timebase */ > + "sr", /* sample rate */ > NULL > }; > > @@ -51,6 +53,7 @@ enum var_name { > VAR_PI, > VAR_AVTB, > VAR_INTB, > + VAR_SR, > VAR_VARS_NB > }; > > @@ -60,6 +63,15 @@ typedef struct { > double var_values[VAR_VARS_NB]; > } SetTBContext; > > +#define OFFSET(x) offsetof(SetTBContext, x) > +#define DEFINE_OPTIONS(filt_name, filt_type) > \ I think you can achieve the same result without using this macro. See how it is done in setpts.c > +static const AVOption filt_name##_options[] = { > \ > + { "expr", "set expression determining the output timebase", > OFFSET(tb_expr), AV_OPT_TYPE_STRING, {.str="intb"}, \ > + .flags=AV_OPT_FLAG_##filt_type##_PARAM }, > \ > + { NULL } > \ > +} > + > + no double lines please > static int config_output_props(AVFilterLink *outlink) > { > AVFilterContext *ctx = outlink->src; > @@ -74,6 +86,7 @@ static int config_output_props(AVFilterLink *outlink) > settb->var_values[VAR_PI] = M_PI; > settb->var_values[VAR_AVTB] = av_q2d(AV_TIME_BASE_Q); > settb->var_values[VAR_INTB] = av_q2d(inlink->time_base); > + settb->var_values[VAR_SR] = inlink->sample_rate; > > outlink->w = inlink->w; > outlink->h = inlink->h; > @@ -115,17 +128,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame > *frame) > return ff_filter_frame(outlink, frame); > } > > -#define OFFSET(x) offsetof(SetTBContext, x) > -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM > -static const AVOption options[] = { > - { "expr", "Expression determining the output timebase", OFFSET(tb_expr), > AV_OPT_TYPE_STRING, { .str = "intb" }, .flags = FLAGS }, > - { NULL }, > -}; see above. Just add FLAGS AV_OPT_FLAG_AUDIO_PARAM to the FLAGS you'll automatically get this option applied for the audio filter too. > +#if CONFIG_SETTB_FILTER > +DEFINE_OPTIONS(settb, VIDEO); > > static const AVClass settb_class = { > .class_name = "settb", > .item_name = av_default_item_name, > - .option = options, > + .option = settb_options, > .version = LIBAVUTIL_VERSION_INT, > }; > > @@ -150,12 +159,49 @@ static const AVFilterPad avfilter_vf_settb_outputs[] = { > > AVFilter ff_vf_settb = { > .name = "settb", > - .description = NULL_IF_CONFIG_SMALL("Set timebase for the output link."), > - > + .description = NULL_IF_CONFIG_SMALL("Set timebase for the video output > link."), > .priv_size = sizeof(SetTBContext), > .priv_class = &settb_class, > - > .inputs = avfilter_vf_settb_inputs, > - > .outputs = avfilter_vf_settb_outputs, don't remove lines please > }; > +#endif /* CONFIG_SETTB_FILTER */ > + > +#if CONFIG_ASETTB_FILTER > +DEFINE_OPTIONS(asettb, AUDIO); if you use the same option trick of above you shouldn't need to put this under a conditional compilation > + > +static const AVClass asettb_class = { > + .class_name = "asettb", > + .item_name = av_default_item_name, > + .option = asettb_options, > + .version = LIBAVUTIL_VERSION_INT, > +}; > + > +static const AVFilterPad avfilter_af_asettb_inputs[] = { > + { > + .name = "default", > + .type = AVMEDIA_TYPE_AUDIO, > + .get_audio_buffer = ff_null_get_audio_buffer, > + .filter_frame = filter_frame, > + }, > + { NULL } > +}; > + > +static const AVFilterPad avfilter_af_asettb_outputs[] = { > + { > + .name = "default", > + .type = AVMEDIA_TYPE_AUDIO, > + .config_props = config_output_props, > + }, > + { NULL } > +}; > + > +AVFilter ff_af_asettb = { > + .name = "asettb", > + .description = NULL_IF_CONFIG_SMALL("Set timebase for the audio output > link."), > + .priv_size = sizeof(SetTBContext), > + .inputs = avfilter_af_asettb_inputs, > + .outputs = avfilter_af_asettb_outputs, > + .priv_class = &asettb_class, > +}; > +#endif /* CONFIG_ASETTB_FILTER */ Rest seems ok (plus what Timothy mentioned). -- Vittorio _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel