Commit ba856c0b authored by Nicolas George's avatar Nicolas George

lavfi: implement asettb filter.

parent 99622f66
......@@ -21,6 +21,7 @@ version next:
- RealText demuxer and decoder
- Heart Of Darkness PAF playback support
- iec61883 device
- asettb filter
version 0.11:
......
......@@ -2937,14 +2937,15 @@ setpts=N/(25*TB)
setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))'
@end example
@section settb
@section settb, asettb
Set the timebase to use for the output frames timestamps.
It is mainly useful for testing timebase configuration.
It accepts in input an arithmetic expression representing a rational.
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".
......
......@@ -53,6 +53,7 @@ OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o
OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o
OBJS-$(CONFIG_ARESAMPLE_FILTER) += af_aresample.o
OBJS-$(CONFIG_ASETNSAMPLES_FILTER) += af_asetnsamples.o
OBJS-$(CONFIG_ASETTB_FILTER) += vf_settb.o
OBJS-$(CONFIG_ASHOWINFO_FILTER) += af_ashowinfo.o
OBJS-$(CONFIG_ASPLIT_FILTER) += split.o
OBJS-$(CONFIG_ASTREAMSYNC_FILTER) += af_astreamsync.o
......
......@@ -42,6 +42,7 @@ void avfilter_register_all(void)
REGISTER_FILTER (ANULL, anull, af);
REGISTER_FILTER (ARESAMPLE, aresample, af);
REGISTER_FILTER (ASETNSAMPLES, asetnsamples, af);
REGISTER_FILTER (ASETTB, asettb, af);
REGISTER_FILTER (ASHOWINFO, ashowinfo, af);
REGISTER_FILTER (ASPLIT, asplit, af);
REGISTER_FILTER (ASTREAMSYNC, astreamsync, af);
......
......@@ -29,8 +29,8 @@
#include "libavutil/avutil.h"
#define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 0
#define LIBAVFILTER_VERSION_MICRO 101
#define LIBAVFILTER_VERSION_MINOR 1
#define LIBAVFILTER_VERSION_MICRO 100
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \
......
......@@ -29,17 +29,20 @@
#include "libavutil/rational.h"
#include "avfilter.h"
#include "internal.h"
#include "audio.h"
#include "video.h"
static const char *const var_names[] = {
"AVTB", /* default timebase 1/AV_TIME_BASE */
"intb", /* input timebase */
"sr", /* sample rate */
NULL
};
enum var_name {
VAR_AVTB,
VAR_INTB,
VAR_SR,
VAR_VARS_NB
};
......@@ -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_INTB] = av_q2d(inlink->time_base);
settb->var_values[VAR_SR] = inlink->sample_rate;
outlink->w = inlink->w;
outlink->h = inlink->h;
......@@ -113,9 +117,28 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
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 = {
.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,
.priv_size = sizeof(SetTBContext),
......@@ -132,3 +155,28 @@ AVFilter avfilter_vf_settb = {
.config_props = config_output_props, },
{ .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