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

Reply via email to