Browse code

avfilter/af_agate: prepare for adding sidechain version

Signed-off-by: Paul B Mahol <onemda@gmail.com>

Paul B Mahol authored on 2015/11/30 07:08:22
Showing 1 changed files
... ...
@@ -149,46 +149,29 @@ static double output_gain(double lin_slope, double ratio, double thres,
149 149
     return 1.;
150 150
 }
151 151
 
152
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
152
+static void gate(AudioGateContext *s, const double *src, double *dst, const double *scsrc,
153
+                 int nb_samples, AVFilterLink *inlink, AVFilterLink *sclink)
153 154
 {
154
-    AVFilterContext *ctx = inlink->dst;
155
-    AVFilterLink *outlink = ctx->outputs[0];
156
-    AudioGateContext *s = ctx->priv;
157
-    const double *src = (const double *)in->data[0];
158 155
     const double makeup = s->makeup;
159 156
     const double attack_coeff = s->attack_coeff;
160 157
     const double release_coeff = s->release_coeff;
161 158
     const double level_in = s->level_in;
162
-    AVFrame *out;
163
-    double *dst;
164 159
     int n, c;
165 160
 
166
-    if (av_frame_is_writable(in)) {
167
-        out = in;
168
-    } else {
169
-        out = ff_get_audio_buffer(inlink, in->nb_samples);
170
-        if (!out) {
171
-            av_frame_free(&in);
172
-            return AVERROR(ENOMEM);
173
-        }
174
-        av_frame_copy_props(out, in);
175
-    }
176
-    dst = (double *)out->data[0];
177
-
178
-    for (n = 0; n < in->nb_samples; n++, src += inlink->channels, dst += inlink->channels) {
179
-        double abs_sample = fabs(src[0]), gain = 1.0;
161
+    for (n = 0; n < nb_samples; n++, src += inlink->channels, dst += inlink->channels, scsrc += sclink->channels) {
162
+        double abs_sample = fabs(scsrc[0]), gain = 1.0;
180 163
 
181 164
         for (c = 0; c < inlink->channels; c++)
182 165
             dst[c] = src[c] * level_in;
183 166
 
184 167
         if (s->link == 1) {
185
-            for (c = 1; c < inlink->channels; c++)
186
-                abs_sample = FFMAX(fabs(src[c]), abs_sample);
168
+            for (c = 1; c < sclink->channels; c++)
169
+                abs_sample = FFMAX(fabs(scsrc[c]), abs_sample);
187 170
         } else {
188
-            for (c = 1; c < inlink->channels; c++)
189
-                abs_sample += fabs(src[c]);
171
+            for (c = 1; c < sclink->channels; c++)
172
+                abs_sample += fabs(scsrc[c]);
190 173
 
191
-            abs_sample /= inlink->channels;
174
+            abs_sample /= sclink->channels;
192 175
         }
193 176
 
194 177
         if (s->detection)
... ...
@@ -203,6 +186,30 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
203 203
         for (c = 0; c < inlink->channels; c++)
204 204
             dst[c] *= gain * makeup;
205 205
     }
206
+}
207
+
208
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
209
+{
210
+    const double *src = (const double *)in->data[0];
211
+    AVFilterContext *ctx = inlink->dst;
212
+    AVFilterLink *outlink = ctx->outputs[0];
213
+    AudioGateContext *s = ctx->priv;
214
+    AVFrame *out;
215
+    double *dst;
216
+
217
+    if (av_frame_is_writable(in)) {
218
+        out = in;
219
+    } else {
220
+        out = ff_get_audio_buffer(inlink, in->nb_samples);
221
+        if (!out) {
222
+            av_frame_free(&in);
223
+            return AVERROR(ENOMEM);
224
+        }
225
+        av_frame_copy_props(out, in);
226
+    }
227
+    dst = (double *)out->data[0];
228
+
229
+    gate(s, src, dst, src, in->nb_samples, inlink, inlink);
206 230
 
207 231
     if (out != in)
208 232
         av_frame_free(&in);