lavfi: implement asettb filter.

This commit is contained in:
Nicolas George 2012-06-23 12:19:14 +02:00
parent 99622f6678
commit ba856c0be5
6 changed files with 57 additions and 5 deletions

View File

@ -21,6 +21,7 @@ version next:
- RealText demuxer and decoder
- Heart Of Darkness PAF playback support
- iec61883 device
- asettb filter
version 0.11:

View File

@ -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".

View File

@ -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

View File

@ -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);

View File

@ -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, \

View File

@ -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