FFmpeg
Loading...
Searching...
No Matches
af_aderivative.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "libavutil/opt.h"
20#include "audio.h"
21#include "avfilter.h"
22#include "filters.h"
23
24typedef struct ADerivativeContext {
25 const AVClass *class;
27 void (*filter)(void **dst, void **prv, const void **src,
28 int nb_samples, int channels);
30
31#define DERIVATIVE(name, type) \
32static void aderivative_## name ##p(void **d, void **p, const void **s, \
33 int nb_samples, int channels) \
34{ \
35 int n, c; \
36 \
37 for (c = 0; c < channels; c++) { \
38 const type *src = s[c]; \
39 type *dst = d[c]; \
40 type *prv = p[c]; \
41 \
42 for (n = 0; n < nb_samples; n++) { \
43 const type current = src[n]; \
44 \
45 dst[n] = current - prv[0]; \
46 prv[0] = current; \
47 } \
48 } \
49}
50
51DERIVATIVE(flt, float)
52DERIVATIVE(dbl, double)
53DERIVATIVE(s16, int16_t)
55
56#define INTEGRAL(name, type) \
57static void aintegral_## name ##p(void **d, void **p, const void **s, \
58 int nb_samples, int channels) \
59{ \
60 int n, c; \
61 \
62 for (c = 0; c < channels; c++) { \
63 const type *src = s[c]; \
64 type *dst = d[c]; \
65 type *prv = p[c]; \
66 \
67 for (n = 0; n < nb_samples; n++) { \
68 const type current = src[n]; \
69 \
70 dst[n] = current + prv[0]; \
71 prv[0] = dst[n]; \
72 } \
73 } \
74}
75
76INTEGRAL(flt, float)
77INTEGRAL(dbl, double)
78
79static int config_input(AVFilterLink *inlink)
80{
81 AVFilterContext *ctx = inlink->dst;
82 ADerivativeContext *s = ctx->priv;
83
84 switch (inlink->format) {
85 case AV_SAMPLE_FMT_FLTP: s->filter = aderivative_fltp; break;
86 case AV_SAMPLE_FMT_DBLP: s->filter = aderivative_dblp; break;
87 case AV_SAMPLE_FMT_S32P: s->filter = aderivative_s32p; break;
88 case AV_SAMPLE_FMT_S16P: s->filter = aderivative_s16p; break;
89 }
90
91 if (strcmp(ctx->filter->name, "aintegral"))
92 return 0;
93
94 switch (inlink->format) {
95 case AV_SAMPLE_FMT_FLTP: s->filter = aintegral_fltp; break;
96 case AV_SAMPLE_FMT_DBLP: s->filter = aintegral_dblp; break;
97 }
98
99 return 0;
100}
101
102static int filter_frame(AVFilterLink *inlink, AVFrame *in)
103{
104 AVFilterContext *ctx = inlink->dst;
105 ADerivativeContext *s = ctx->priv;
106 AVFilterLink *outlink = ctx->outputs[0];
107 AVFrame *out;
108
109 if (ctx->is_disabled) {
110 if (s->prev)
111 av_samples_set_silence(s->prev->extended_data, 0, 1,
112 s->prev->ch_layout.nb_channels,
113 s->prev->format);
114
115 return ff_filter_frame(outlink, in);
116 }
117
118 out = ff_get_audio_buffer(outlink, in->nb_samples);
119 if (!out) {
120 av_frame_free(&in);
121 return AVERROR(ENOMEM);
122 }
124
125 if (!s->prev) {
126 s->prev = ff_get_audio_buffer(inlink, 1);
127 if (!s->prev) {
128 av_frame_free(&in);
130 return AVERROR(ENOMEM);
131 }
132 }
133
134 s->filter((void **)out->extended_data, (void **)s->prev->extended_data, (const void **)in->extended_data,
136
137 av_frame_free(&in);
138 return ff_filter_frame(outlink, out);
139}
140
142{
143 ADerivativeContext *s = ctx->priv;
144
145 av_frame_free(&s->prev);
146}
147
149 {
150 .name = "default",
151 .type = AVMEDIA_TYPE_AUDIO,
152 .filter_frame = filter_frame,
153 .config_props = config_input,
154 },
155};
156
158 { NULL }
159};
160
161AVFILTER_DEFINE_CLASS_EXT(aderivative, "aderivative/aintegral", aderivative_options);
162
164 .p.name = "aderivative",
165 .p.description = NULL_IF_CONFIG_SMALL("Compute derivative of input audio."),
166 .p.priv_class = &aderivative_class,
168 .priv_size = sizeof(ADerivativeContext),
169 .uninit = uninit,
174};
175
177 .p.name = "aintegral",
178 .p.description = NULL_IF_CONFIG_SMALL("Compute integral of input audio."),
179 .p.priv_class = &aderivative_class,
181 .priv_size = sizeof(ADerivativeContext),
182 .uninit = uninit,
186};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
static int config_input(AVFilterLink *inlink)
const FFFilter ff_af_aintegral
#define DERIVATIVE(name, type)
static const AVFilterPad aderivative_inputs[]
const FFFilter ff_af_aderivative
#define INTEGRAL(name, type)
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static av_cold void uninit(AVFilterContext *ctx)
static const AVOption aderivative_options[]
channels
Definition aptx.h:31
const AVFilterPad ff_audio_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_AUDIO.
Definition audio.c:34
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
Definition audio.c:74
int32_t
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
Main libavfilter public API header.
#define s(width, name)
Definition cbs_vp9.c:198
#define NULL
Definition coverity.c:32
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will have its filter_frame() c...
Definition avfilter.h:204
#define AVERROR(e)
Definition error.h:45
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition frame.c:599
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition samplefmt.h:66
@ AV_SAMPLE_FMT_S16P
signed 16 bits, planar
Definition samplefmt.h:64
@ AV_SAMPLE_FMT_S32P
signed 32 bits, planar
Definition samplefmt.h:65
@ AV_SAMPLE_FMT_DBLP
double, planar
Definition samplefmt.h:67
int av_samples_set_silence(uint8_t *const *audio_data, int offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
Fill an audio buffer with silence.
Definition samplefmt.c:246
if(svq3)
static av_cold void uninit(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define FILTER_SAMPLEFMTS(...)
Definition filters.h:252
#define AVFILTER_DEFINE_CLASS_EXT(name, desc, options)
Definition filters.h:470
#define av_cold
Definition attributes.h:117
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
AVOptions.
void(* filter)(void **dst, void **prv, const void **src, int nb_samples, int channels)
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
An instance of a filter.
Definition avfilter.h:273
A filter pad used for either input or output.
Definition filters.h:40
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
int nb_samples
number of audio samples (per channel) described by this frame
Definition frame.h:552
AVChannelLayout ch_layout
Channel layout of the audio data.
Definition frame.h:815
uint8_t ** extended_data
pointers to the data planes/channels.
Definition frame.h:533
AVOption.
Definition opt.h:428
#define src
Definition vp8dsp.c:248
static FILE * out
Definition movenc.c:55
static AVFormatContext * ctx
Definition movenc.c:49