On Mon, Mar 31, 2014 at 6:01 AM, Timothy Gu <[email protected]> wrote: > > Thanks for doing this. Some comments and possible improvements: > > * Add support for "sr" as a variable name as in > http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=ba856c0be5599f21f241162e1f5f3f2506f3132c > * Add documentation > * Remove a couple of extra newlines > * Change filename to f_settb.c (in a separate patch) > * Back port rest of FFmpeg's changes to settb
Thanks, Timothy. I've added sr, documentation, ported the AVFILTER_DEFINE_CLASS macro, and removed some newlines; I think I've backported all the substantial changes. Patch 0002 does the rename. sr has somewhat odd behavior: ashowinfo's output is always pts:0 pts_time:0.000000 in the second ashowinfo in $ avconv -i /usr/share/doc/texlive-doc/latex/animate/files/click.mp3 -af 'ashowinfo,asettb=sr*10,ashowinfo' /tmp/test1.wav That said, it's the same in FFmpeg, and the resulting audio file plays correctly. Kat
From 3f008ee6b7d03dd94b469ae71c605ce4b85b6397 Mon Sep 17 00:00:00 2001 From: Katerina Barone-Adesi <[email protected]> Date: Mon, 31 Mar 2014 02:20:02 +0200 Subject: [PATCH 1/2] Added asettb support - setting timebases for audio Ported asettb (including the sr option for sample rate), DEFINE_OPTIONS and AVFILTER_DEFINE_CLASS macros, and documentation from ffmpeg. --- doc/filters.texi | 86 +++++++++++++++++++++++++++--------------------- libavfilter/Makefile | 1 + libavfilter/allfilters.c | 1 + libavfilter/internal.h | 8 +++++ libavfilter/vf_settb.c | 68 ++++++++++++++++++++++++++++---------- 5 files changed, 109 insertions(+), 55 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 93625c6..762f66a 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -2373,44 +2373,6 @@ For example to change the sample aspect ratio to 10:11, specify: setsar=sar=10/11 @end example -@section settb - -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), and "intb" (the input timebase). - -The default value for the input is "intb". - -Follow some examples. - -@example -# set the timebase to 1/25 -settb=expr=1/25 - -# set the timebase to 1/10 -settb=expr=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 -@end example - @section showinfo Show a line containing various information for each input video frame. @@ -2998,3 +2960,51 @@ mainly useful as a template and to be employed in analysis / debugging tools. @c man end VIDEO SINKS + +@chapter Multimedia Filters +@c man begin MULTIMEDIA FILTERS + +Below is a description of the currently available multimedia filters. + +@section settb, 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". + +Follow 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 + diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 5312c83..e66f4fa 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) += vf_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/internal.h b/libavfilter/internal.h index 6a752dc..43b9d54 100644 --- a/libavfilter/internal.h +++ b/libavfilter/internal.h @@ -209,6 +209,14 @@ int ff_poll_frame(AVFilterLink *link); */ int ff_request_frame(AVFilterLink *link); +#define AVFILTER_DEFINE_CLASS(fname) \ + static const AVClass fname##_class = { \ + .class_name = #fname, \ + .item_name = av_default_item_name, \ + .option = fname##_options, \ + .version = LIBAVUTIL_VERSION_INT, \ + } + /** * Send a frame of data to the next filter. * diff --git a/libavfilter/vf_settb.c b/libavfilter/vf_settb.c index 87b60a7..2dafa59 100644 --- a/libavfilter/vf_settb.c +++ b/libavfilter/vf_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) \ +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 } \ +} + + 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,19 +128,9 @@ 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 }, -}; - -static const AVClass settb_class = { - .class_name = "settb", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; +#if CONFIG_SETTB_FILTER +DEFINE_OPTIONS(settb, VIDEO); +AVFILTER_DEFINE_CLASS(settb); static const AVFilterPad avfilter_vf_settb_inputs[] = { { @@ -150,12 +153,43 @@ 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, }; +#endif /* CONFIG_SETTB_FILTER */ + +#if CONFIG_ASETTB_FILTER +DEFINE_OPTIONS(asettb, AUDIO); +AVFILTER_DEFINE_CLASS(asettb); + +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 */ -- 1.8.3.2
From 8156a834e3aa9dc433aa4c985df1a4c67c14fb25 Mon Sep 17 00:00:00 2001 From: Katerina Barone-Adesi <[email protected]> Date: Mon, 31 Mar 2014 16:20:50 +0200 Subject: [PATCH 2/2] Renamed vf_settb.c to f_settb.c. The equivalent file in FFmpeg is also named f_settb.c; the f prefix is used for multimedia filters that aren't only one of audio or video, such as settb (which contains an audio and a video filter). --- libavfilter/Makefile | 4 +- libavfilter/f_settb.c | 195 +++++++++++++++++++++++++++++++++++++++++++++++++ libavfilter/vf_settb.c | 195 ------------------------------------------------- 3 files changed, 197 insertions(+), 197 deletions(-) create mode 100644 libavfilter/f_settb.c delete mode 100644 libavfilter/vf_settb.c diff --git a/libavfilter/Makefile b/libavfilter/Makefile index e66f4fa..d556fbf 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -28,7 +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) += vf_settb.o +OBJS-$(CONFIG_ASETTB_FILTER) += f_settb.o OBJS-$(CONFIG_ASHOWINFO_FILTER) += af_ashowinfo.o OBJS-$(CONFIG_ASPLIT_FILTER) += split.o OBJS-$(CONFIG_ASYNCTS_FILTER) += af_asyncts.o @@ -77,7 +77,7 @@ OBJS-$(CONFIG_SELECT_FILTER) += vf_select.o OBJS-$(CONFIG_SETDAR_FILTER) += vf_aspect.o OBJS-$(CONFIG_SETPTS_FILTER) += setpts.o OBJS-$(CONFIG_SETSAR_FILTER) += vf_aspect.o -OBJS-$(CONFIG_SETTB_FILTER) += vf_settb.o +OBJS-$(CONFIG_SETTB_FILTER) += f_settb.o OBJS-$(CONFIG_SHOWINFO_FILTER) += vf_showinfo.o OBJS-$(CONFIG_SHUFFLEPLANES_FILTER) += vf_shuffleplanes.o OBJS-$(CONFIG_SPLIT_FILTER) += split.o diff --git a/libavfilter/f_settb.c b/libavfilter/f_settb.c new file mode 100644 index 0000000..2dafa59 --- /dev/null +++ b/libavfilter/f_settb.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2010 Stefano Sabatini + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * Set timebase for the output link. + */ + +#include <inttypes.h> +#include <stdio.h> + +#include "libavutil/avstring.h" +#include "libavutil/eval.h" +#include "libavutil/internal.h" +#include "libavutil/mathematics.h" +#include "libavutil/opt.h" +#include "libavutil/rational.h" +#include "audio.h" +#include "avfilter.h" +#include "internal.h" +#include "video.h" + +static const char *const var_names[] = { + "E", + "PHI", + "PI", + "AVTB", /* default timebase 1/AV_TIME_BASE */ + "intb", /* input timebase */ + "sr", /* sample rate */ + NULL +}; + +enum var_name { + VAR_E, + VAR_PHI, + VAR_PI, + VAR_AVTB, + VAR_INTB, + VAR_SR, + VAR_VARS_NB +}; + +typedef struct { + const AVClass *class; + char *tb_expr; + double var_values[VAR_VARS_NB]; +} SetTBContext; + +#define OFFSET(x) offsetof(SetTBContext, x) +#define DEFINE_OPTIONS(filt_name, filt_type) \ +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 } \ +} + + +static int config_output_props(AVFilterLink *outlink) +{ + AVFilterContext *ctx = outlink->src; + SetTBContext *settb = ctx->priv; + AVFilterLink *inlink = ctx->inputs[0]; + AVRational time_base; + int ret; + double res; + + settb->var_values[VAR_E] = M_E; + settb->var_values[VAR_PHI] = M_PHI; + 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; + + if ((ret = av_expr_parse_and_eval(&res, settb->tb_expr, var_names, settb->var_values, + NULL, NULL, NULL, NULL, NULL, 0, NULL)) < 0) { + av_log(ctx, AV_LOG_ERROR, "Invalid expression '%s' for timebase.\n", settb->tb_expr); + return ret; + } + time_base = av_d2q(res, INT_MAX); + if (time_base.num <= 0 || time_base.den <= 0) { + av_log(ctx, AV_LOG_ERROR, + "Invalid non-positive values for the timebase num:%d or den:%d.\n", + time_base.num, time_base.den); + return AVERROR(EINVAL); + } + + outlink->time_base = time_base; + av_log(outlink->src, AV_LOG_VERBOSE, "tb:%d/%d -> tb:%d/%d\n", + inlink ->time_base.num, inlink ->time_base.den, + outlink->time_base.num, outlink->time_base.den); + + return 0; +} + +static int filter_frame(AVFilterLink *inlink, AVFrame *frame) +{ + AVFilterContext *ctx = inlink->dst; + AVFilterLink *outlink = ctx->outputs[0]; + + if (av_cmp_q(inlink->time_base, outlink->time_base)) { + int64_t orig_pts = frame->pts; + frame->pts = av_rescale_q(frame->pts, inlink->time_base, outlink->time_base); + av_log(ctx, AV_LOG_DEBUG, "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n", + inlink ->time_base.num, inlink ->time_base.den, orig_pts, + outlink->time_base.num, outlink->time_base.den, frame->pts); + } + + return ff_filter_frame(outlink, frame); +} + +#if CONFIG_SETTB_FILTER +DEFINE_OPTIONS(settb, VIDEO); +AVFILTER_DEFINE_CLASS(settb); + +static const AVFilterPad avfilter_vf_settb_inputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .get_video_buffer = ff_null_get_video_buffer, + .filter_frame = filter_frame, + }, + { NULL } +}; + +static const AVFilterPad avfilter_vf_settb_outputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .config_props = config_output_props, + }, + { NULL } +}; + +AVFilter ff_vf_settb = { + .name = "settb", + .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, +}; +#endif /* CONFIG_SETTB_FILTER */ + +#if CONFIG_ASETTB_FILTER +DEFINE_OPTIONS(asettb, AUDIO); +AVFILTER_DEFINE_CLASS(asettb); + +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 */ diff --git a/libavfilter/vf_settb.c b/libavfilter/vf_settb.c deleted file mode 100644 index 2dafa59..0000000 --- a/libavfilter/vf_settb.c +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2010 Stefano Sabatini - * - * This file is part of Libav. - * - * Libav is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * Libav is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * Set timebase for the output link. - */ - -#include <inttypes.h> -#include <stdio.h> - -#include "libavutil/avstring.h" -#include "libavutil/eval.h" -#include "libavutil/internal.h" -#include "libavutil/mathematics.h" -#include "libavutil/opt.h" -#include "libavutil/rational.h" -#include "audio.h" -#include "avfilter.h" -#include "internal.h" -#include "video.h" - -static const char *const var_names[] = { - "E", - "PHI", - "PI", - "AVTB", /* default timebase 1/AV_TIME_BASE */ - "intb", /* input timebase */ - "sr", /* sample rate */ - NULL -}; - -enum var_name { - VAR_E, - VAR_PHI, - VAR_PI, - VAR_AVTB, - VAR_INTB, - VAR_SR, - VAR_VARS_NB -}; - -typedef struct { - const AVClass *class; - char *tb_expr; - double var_values[VAR_VARS_NB]; -} SetTBContext; - -#define OFFSET(x) offsetof(SetTBContext, x) -#define DEFINE_OPTIONS(filt_name, filt_type) \ -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 } \ -} - - -static int config_output_props(AVFilterLink *outlink) -{ - AVFilterContext *ctx = outlink->src; - SetTBContext *settb = ctx->priv; - AVFilterLink *inlink = ctx->inputs[0]; - AVRational time_base; - int ret; - double res; - - settb->var_values[VAR_E] = M_E; - settb->var_values[VAR_PHI] = M_PHI; - 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; - - if ((ret = av_expr_parse_and_eval(&res, settb->tb_expr, var_names, settb->var_values, - NULL, NULL, NULL, NULL, NULL, 0, NULL)) < 0) { - av_log(ctx, AV_LOG_ERROR, "Invalid expression '%s' for timebase.\n", settb->tb_expr); - return ret; - } - time_base = av_d2q(res, INT_MAX); - if (time_base.num <= 0 || time_base.den <= 0) { - av_log(ctx, AV_LOG_ERROR, - "Invalid non-positive values for the timebase num:%d or den:%d.\n", - time_base.num, time_base.den); - return AVERROR(EINVAL); - } - - outlink->time_base = time_base; - av_log(outlink->src, AV_LOG_VERBOSE, "tb:%d/%d -> tb:%d/%d\n", - inlink ->time_base.num, inlink ->time_base.den, - outlink->time_base.num, outlink->time_base.den); - - return 0; -} - -static int filter_frame(AVFilterLink *inlink, AVFrame *frame) -{ - AVFilterContext *ctx = inlink->dst; - AVFilterLink *outlink = ctx->outputs[0]; - - if (av_cmp_q(inlink->time_base, outlink->time_base)) { - int64_t orig_pts = frame->pts; - frame->pts = av_rescale_q(frame->pts, inlink->time_base, outlink->time_base); - av_log(ctx, AV_LOG_DEBUG, "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n", - inlink ->time_base.num, inlink ->time_base.den, orig_pts, - outlink->time_base.num, outlink->time_base.den, frame->pts); - } - - return ff_filter_frame(outlink, frame); -} - -#if CONFIG_SETTB_FILTER -DEFINE_OPTIONS(settb, VIDEO); -AVFILTER_DEFINE_CLASS(settb); - -static const AVFilterPad avfilter_vf_settb_inputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .get_video_buffer = ff_null_get_video_buffer, - .filter_frame = filter_frame, - }, - { NULL } -}; - -static const AVFilterPad avfilter_vf_settb_outputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .config_props = config_output_props, - }, - { NULL } -}; - -AVFilter ff_vf_settb = { - .name = "settb", - .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, -}; -#endif /* CONFIG_SETTB_FILTER */ - -#if CONFIG_ASETTB_FILTER -DEFINE_OPTIONS(asettb, AUDIO); -AVFILTER_DEFINE_CLASS(asettb); - -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 */ -- 1.8.3.2
_______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
