Signed-off-by: Paul B Mahol <onemda@gmail.com>
Paul B Mahol authored on 2015/11/30 07:08:22... | ... |
@@ -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); |