Commit ba856c0b authored by Nicolas George's avatar Nicolas George

lavfi: implement asettb filter.

parent 99622f66
...@@ -21,6 +21,7 @@ version next: ...@@ -21,6 +21,7 @@ version next:
- RealText demuxer and decoder - RealText demuxer and decoder
- Heart Of Darkness PAF playback support - Heart Of Darkness PAF playback support
- iec61883 device - iec61883 device
- asettb filter
version 0.11: version 0.11:
......
...@@ -2937,14 +2937,15 @@ setpts=N/(25*TB) ...@@ -2937,14 +2937,15 @@ setpts=N/(25*TB)
setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))' setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))'
@end example @end example
@section settb @section settb, asettb
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. It accepts in input an arithmetic expression representing a rational.
The expression can contain the constants "AVTB" (the The expression can contain the constants "AVTB" (the
default timebase), and "intb" (the input timebase). default timebase), "intb" (the input timebase) and "sr" (the sample rate,
audio only).
The default value for the input is "intb". The default value for the input is "intb".
......
...@@ -53,6 +53,7 @@ OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o ...@@ -53,6 +53,7 @@ OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o
OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o
OBJS-$(CONFIG_ARESAMPLE_FILTER) += af_aresample.o OBJS-$(CONFIG_ARESAMPLE_FILTER) += af_aresample.o
OBJS-$(CONFIG_ASETNSAMPLES_FILTER) += af_asetnsamples.o OBJS-$(CONFIG_ASETNSAMPLES_FILTER) += af_asetnsamples.o
OBJS-$(CONFIG_ASETTB_FILTER) += vf_settb.o
OBJS-$(CONFIG_ASHOWINFO_FILTER) += af_ashowinfo.o OBJS-$(CONFIG_ASHOWINFO_FILTER) += af_ashowinfo.o
OBJS-$(CONFIG_ASPLIT_FILTER) += split.o OBJS-$(CONFIG_ASPLIT_FILTER) += split.o
OBJS-$(CONFIG_ASTREAMSYNC_FILTER) += af_astreamsync.o OBJS-$(CONFIG_ASTREAMSYNC_FILTER) += af_astreamsync.o
......
...@@ -42,6 +42,7 @@ void avfilter_register_all(void) ...@@ -42,6 +42,7 @@ void avfilter_register_all(void)
REGISTER_FILTER (ANULL, anull, af); REGISTER_FILTER (ANULL, anull, af);
REGISTER_FILTER (ARESAMPLE, aresample, af); REGISTER_FILTER (ARESAMPLE, aresample, af);
REGISTER_FILTER (ASETNSAMPLES, asetnsamples, af); REGISTER_FILTER (ASETNSAMPLES, asetnsamples, af);
REGISTER_FILTER (ASETTB, asettb, af);
REGISTER_FILTER (ASHOWINFO, ashowinfo, af); REGISTER_FILTER (ASHOWINFO, ashowinfo, af);
REGISTER_FILTER (ASPLIT, asplit, af); REGISTER_FILTER (ASPLIT, asplit, af);
REGISTER_FILTER (ASTREAMSYNC, astreamsync, af); REGISTER_FILTER (ASTREAMSYNC, astreamsync, af);
......
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
#include "libavutil/avutil.h" #include "libavutil/avutil.h"
#define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 0 #define LIBAVFILTER_VERSION_MINOR 1
#define LIBAVFILTER_VERSION_MICRO 101 #define LIBAVFILTER_VERSION_MICRO 100
#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, \
......
...@@ -29,17 +29,20 @@ ...@@ -29,17 +29,20 @@
#include "libavutil/rational.h" #include "libavutil/rational.h"
#include "avfilter.h" #include "avfilter.h"
#include "internal.h" #include "internal.h"
#include "audio.h"
#include "video.h" #include "video.h"
static const char *const var_names[] = { static const char *const var_names[] = {
"AVTB", /* default timebase 1/AV_TIME_BASE */ "AVTB", /* default timebase 1/AV_TIME_BASE */
"intb", /* input timebase */ "intb", /* input timebase */
"sr", /* sample rate */
NULL NULL
}; };
enum var_name { enum var_name {
VAR_AVTB, VAR_AVTB,
VAR_INTB, VAR_INTB,
VAR_SR,
VAR_VARS_NB VAR_VARS_NB
}; };
...@@ -70,6 +73,7 @@ static int config_output_props(AVFilterLink *outlink) ...@@ -70,6 +73,7 @@ static int config_output_props(AVFilterLink *outlink)
settb->var_values[VAR_AVTB] = av_q2d(AV_TIME_BASE_Q); 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_INTB] = av_q2d(inlink->time_base);
settb->var_values[VAR_SR] = inlink->sample_rate;
outlink->w = inlink->w; outlink->w = inlink->w;
outlink->h = inlink->h; outlink->h = inlink->h;
...@@ -113,9 +117,28 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) ...@@ -113,9 +117,28 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
ff_start_frame(outlink, picref2); ff_start_frame(outlink, picref2);
} }
static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
{
AVFilterContext *ctx = inlink->dst;
AVFilterLink *outlink = ctx->outputs[0];
AVFilterBufferRef *outsamples = insamples;
if (av_cmp_q(inlink->time_base, outlink->time_base)) {
outsamples = avfilter_ref_buffer(insamples, ~0);
outsamples->pts = av_rescale_q(insamples->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, insamples ->pts,
outlink->time_base.num, outlink->time_base.den, outsamples->pts);
avfilter_unref_buffer(insamples);
}
ff_filter_samples(outlink, outsamples);
}
#if CONFIG_SETTB_FILTER
AVFilter avfilter_vf_settb = { AVFilter avfilter_vf_settb = {
.name = "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."),
.init = init, .init = init,
.priv_size = sizeof(SetTBContext), .priv_size = sizeof(SetTBContext),
...@@ -132,3 +155,28 @@ AVFilter avfilter_vf_settb = { ...@@ -132,3 +155,28 @@ AVFilter avfilter_vf_settb = {
.config_props = config_output_props, }, .config_props = config_output_props, },
{ .name = NULL}}, { .name = NULL}},
}; };
#endif
#if CONFIG_ASETTB_FILTER
AVFilter avfilter_af_asettb = {
.name = "asettb",
.description = NULL_IF_CONFIG_SMALL("Set timebase for the audio output link."),
.init = init,
.priv_size = sizeof(SetTBContext),
.inputs = (const AVFilterPad[]) {
{ .name = "default",
.type = AVMEDIA_TYPE_AUDIO,
.get_audio_buffer = ff_null_get_audio_buffer,
.filter_samples = filter_samples, },
{ .name = NULL }
},
.outputs = (const AVFilterPad[]) {
{ .name = "default",
.type = AVMEDIA_TYPE_AUDIO,
.config_props = config_output_props, },
{ .name = NULL}
},
};
#endif
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