... | ... |
@@ -32,6 +32,7 @@ |
32 | 32 |
|
33 | 33 |
#include "audio.h" |
34 | 34 |
#include "avfilter.h" |
35 |
+#include "filters.h" |
|
35 | 36 |
#include "formats.h" |
36 | 37 |
#include "hermite.h" |
37 | 38 |
#include "internal.h" |
... | ... |
@@ -183,71 +184,76 @@ static void compressor(SidechainCompressContext *s, |
183 | 183 |
} |
184 | 184 |
|
185 | 185 |
#if CONFIG_SIDECHAINCOMPRESS_FILTER |
186 |
-static int filter_frame(AVFilterLink *link, AVFrame *frame) |
|
186 |
+static int activate(AVFilterContext *ctx) |
|
187 | 187 |
{ |
188 |
- AVFilterContext *ctx = link->dst; |
|
189 | 188 |
SidechainCompressContext *s = ctx->priv; |
190 |
- AVFilterLink *outlink = ctx->outputs[0]; |
|
191 | 189 |
AVFrame *out = NULL, *in[2] = { NULL }; |
190 |
+ int ret, i, status, nb_samples; |
|
192 | 191 |
double *dst; |
193 |
- int nb_samples; |
|
194 |
- int i; |
|
192 |
+ int64_t pts; |
|
195 | 193 |
|
196 |
- for (i = 0; i < 2; i++) |
|
197 |
- if (link == ctx->inputs[i]) |
|
198 |
- break; |
|
199 |
- av_assert0(i < 2); |
|
200 |
- av_audio_fifo_write(s->fifo[i], (void **)frame->extended_data, |
|
201 |
- frame->nb_samples); |
|
202 |
- av_frame_free(&frame); |
|
194 |
+ if ((ret = ff_inlink_consume_frame(ctx->inputs[0], &in[0])) > 0) { |
|
195 |
+ av_audio_fifo_write(s->fifo[0], (void **)in[0]->extended_data, |
|
196 |
+ in[0]->nb_samples); |
|
197 |
+ av_frame_free(&in[0]); |
|
198 |
+ } |
|
199 |
+ if (ret < 0) |
|
200 |
+ return ret; |
|
201 |
+ if ((ret = ff_inlink_consume_frame(ctx->inputs[1], &in[1])) > 0) { |
|
202 |
+ av_audio_fifo_write(s->fifo[1], (void **)in[1]->extended_data, |
|
203 |
+ in[1]->nb_samples); |
|
204 |
+ av_frame_free(&in[1]); |
|
205 |
+ } |
|
206 |
+ if (ret < 0) |
|
207 |
+ return ret; |
|
203 | 208 |
|
204 | 209 |
nb_samples = FFMIN(av_audio_fifo_size(s->fifo[0]), av_audio_fifo_size(s->fifo[1])); |
205 |
- if (!nb_samples) |
|
206 |
- return 0; |
|
207 |
- |
|
208 |
- out = ff_get_audio_buffer(outlink, nb_samples); |
|
209 |
- if (!out) |
|
210 |
- return AVERROR(ENOMEM); |
|
211 |
- for (i = 0; i < 2; i++) { |
|
212 |
- in[i] = ff_get_audio_buffer(ctx->inputs[i], nb_samples); |
|
213 |
- if (!in[i]) { |
|
214 |
- av_frame_free(&in[0]); |
|
215 |
- av_frame_free(&in[1]); |
|
216 |
- av_frame_free(&out); |
|
210 |
+ if (nb_samples) { |
|
211 |
+ out = ff_get_audio_buffer(ctx->outputs[0], nb_samples); |
|
212 |
+ if (!out) |
|
217 | 213 |
return AVERROR(ENOMEM); |
214 |
+ for (i = 0; i < 2; i++) { |
|
215 |
+ in[i] = ff_get_audio_buffer(ctx->inputs[i], nb_samples); |
|
216 |
+ if (!in[i]) { |
|
217 |
+ av_frame_free(&in[0]); |
|
218 |
+ av_frame_free(&in[1]); |
|
219 |
+ av_frame_free(&out); |
|
220 |
+ return AVERROR(ENOMEM); |
|
221 |
+ } |
|
222 |
+ av_audio_fifo_read(s->fifo[i], (void **)in[i]->data, nb_samples); |
|
218 | 223 |
} |
219 |
- av_audio_fifo_read(s->fifo[i], (void **)in[i]->data, nb_samples); |
|
220 |
- } |
|
221 | 224 |
|
222 |
- dst = (double *)out->data[0]; |
|
223 |
- out->pts = s->pts; |
|
224 |
- s->pts += nb_samples; |
|
225 |
+ dst = (double *)out->data[0]; |
|
226 |
+ out->pts = s->pts; |
|
227 |
+ s->pts += nb_samples; |
|
225 | 228 |
|
226 |
- compressor(s, (double *)in[0]->data[0], dst, |
|
227 |
- (double *)in[1]->data[0], nb_samples, |
|
228 |
- s->level_in, s->level_sc, |
|
229 |
- ctx->inputs[0], ctx->inputs[1]); |
|
229 |
+ compressor(s, (double *)in[0]->data[0], dst, |
|
230 |
+ (double *)in[1]->data[0], nb_samples, |
|
231 |
+ s->level_in, s->level_sc, |
|
232 |
+ ctx->inputs[0], ctx->inputs[1]); |
|
230 | 233 |
|
231 |
- av_frame_free(&in[0]); |
|
232 |
- av_frame_free(&in[1]); |
|
234 |
+ av_frame_free(&in[0]); |
|
235 |
+ av_frame_free(&in[1]); |
|
233 | 236 |
|
234 |
- return ff_filter_frame(outlink, out); |
|
235 |
-} |
|
236 |
- |
|
237 |
-static int request_frame(AVFilterLink *outlink) |
|
238 |
-{ |
|
239 |
- AVFilterContext *ctx = outlink->src; |
|
240 |
- SidechainCompressContext *s = ctx->priv; |
|
241 |
- int i; |
|
242 |
- |
|
243 |
- /* get a frame on each input */ |
|
244 |
- for (i = 0; i < 2; i++) { |
|
245 |
- AVFilterLink *inlink = ctx->inputs[i]; |
|
246 |
- if (!av_audio_fifo_size(s->fifo[i])) |
|
247 |
- return ff_request_frame(inlink); |
|
237 |
+ ret = ff_filter_frame(ctx->outputs[0], out); |
|
238 |
+ if (ret < 0) |
|
239 |
+ return ret; |
|
240 |
+ } |
|
241 |
+ if (ff_inlink_acknowledge_status(ctx->inputs[0], &status, &pts)) { |
|
242 |
+ ff_outlink_set_status(ctx->outputs[0], status, pts); |
|
243 |
+ return 0; |
|
244 |
+ } else if (ff_inlink_acknowledge_status(ctx->inputs[1], &status, &pts)) { |
|
245 |
+ ff_outlink_set_status(ctx->outputs[0], status, pts); |
|
246 |
+ return 0; |
|
247 |
+ } else { |
|
248 |
+ if (ff_outlink_frame_wanted(ctx->outputs[0])) { |
|
249 |
+ if (!av_audio_fifo_size(s->fifo[0])) |
|
250 |
+ ff_inlink_request_frame(ctx->inputs[0]); |
|
251 |
+ if (!av_audio_fifo_size(s->fifo[1])) |
|
252 |
+ ff_inlink_request_frame(ctx->inputs[1]); |
|
253 |
+ } |
|
254 |
+ return 0; |
|
248 | 255 |
} |
249 |
- |
|
250 |
- return 0; |
|
251 | 256 |
} |
252 | 257 |
|
253 | 258 |
static int query_formats(AVFilterContext *ctx) |
... | ... |
@@ -325,11 +331,9 @@ static const AVFilterPad sidechaincompress_inputs[] = { |
325 | 325 |
{ |
326 | 326 |
.name = "main", |
327 | 327 |
.type = AVMEDIA_TYPE_AUDIO, |
328 |
- .filter_frame = filter_frame, |
|
329 | 328 |
},{ |
330 | 329 |
.name = "sidechain", |
331 | 330 |
.type = AVMEDIA_TYPE_AUDIO, |
332 |
- .filter_frame = filter_frame, |
|
333 | 331 |
}, |
334 | 332 |
{ NULL } |
335 | 333 |
}; |
... | ... |
@@ -339,7 +343,6 @@ static const AVFilterPad sidechaincompress_outputs[] = { |
339 | 339 |
.name = "default", |
340 | 340 |
.type = AVMEDIA_TYPE_AUDIO, |
341 | 341 |
.config_props = config_output, |
342 |
- .request_frame = request_frame, |
|
343 | 342 |
}, |
344 | 343 |
{ NULL } |
345 | 344 |
}; |
... | ... |
@@ -350,6 +353,7 @@ AVFilter ff_af_sidechaincompress = { |
350 | 350 |
.priv_size = sizeof(SidechainCompressContext), |
351 | 351 |
.priv_class = &sidechaincompress_class, |
352 | 352 |
.query_formats = query_formats, |
353 |
+ .activate = activate, |
|
353 | 354 |
.uninit = uninit, |
354 | 355 |
.inputs = sidechaincompress_inputs, |
355 | 356 |
.outputs = sidechaincompress_outputs, |