static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) { AVFilterLink *outlink = inlink->dst->outputs[0]; int16_t *taps, *endin, *in, *out; AVFrame *outsamples = ff_get_audio_buffer(inlink, insamples->nb_samples); int len; if (!outsamples) { av_frame_free(&insamples); return AVERROR(ENOMEM); } av_frame_copy_props(outsamples, insamples); taps = ((EarwaxContext *)inlink->dst->priv)->taps; out = (int16_t *)outsamples->data[0]; in = (int16_t *)insamples ->data[0]; len = FFMIN(NUMTAPS, 2*insamples->nb_samples); // copy part of new input and process with saved input memcpy(taps+NUMTAPS, in, len * sizeof(*taps)); out = scalarproduct(taps, taps + len, out); // process current input if (2*insamples->nb_samples >= NUMTAPS ){ endin = in + insamples->nb_samples * 2 - NUMTAPS; scalarproduct(in, endin, out); // save part of input for next round memcpy(taps, endin, NUMTAPS * sizeof(*taps)); } else memmove(taps, taps + 2*insamples->nb_samples, NUMTAPS * sizeof(*taps)); av_frame_free(&insamples); return ff_filter_frame(outlink, outsamples); }
static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples) { AVFilterLink *outlink = inlink->dst->outputs[0]; int16_t *taps, *endin, *in, *out; AVFilterBufferRef *outsamples = ff_get_audio_buffer(inlink, AV_PERM_WRITE, insamples->audio->nb_samples); int ret; avfilter_copy_buffer_ref_props(outsamples, insamples); taps = ((EarwaxContext *)inlink->dst->priv)->taps; out = (int16_t *)outsamples->data[0]; in = (int16_t *)insamples ->data[0]; // copy part of new input and process with saved input memcpy(taps+NUMTAPS, in, NUMTAPS * sizeof(*taps)); out = scalarproduct(taps, taps + NUMTAPS, out); // process current input endin = in + insamples->audio->nb_samples * 2 - NUMTAPS; out = scalarproduct(in, endin, out); // save part of input for next round memcpy(taps, endin, NUMTAPS * sizeof(*taps)); ret = ff_filter_samples(outlink, outsamples); avfilter_unref_buffer(insamples); return ret; }
static double length( double ax, double ay, double az ) { return sqrt( scalarproduct( ax, ay, az, ax, ay, az ) ); }
static double scalarproduct_v( double const * const a, double const * const b ) { return scalarproduct( a[0], a[1], a[2], b[0], b[1], b[2] ); }