Signed-off-by: Paul B Mahol <onemda@gmail.com>
Paul B Mahol authored on 2017/05/15 21:05:17... | ... |
@@ -217,11 +217,18 @@ static int config_input(AVFilterLink *inlink) |
217 | 217 |
return 0; |
218 | 218 |
} |
219 | 219 |
|
220 |
-static void flush(AVFrame *out, AVFilterLink *outlink, |
|
220 |
+static void flush(SilenceRemoveContext *s, |
|
221 |
+ AVFrame *out, AVFilterLink *outlink, |
|
221 | 222 |
int *nb_samples_written, int *ret) |
222 | 223 |
{ |
223 | 224 |
if (*nb_samples_written) { |
224 | 225 |
out->nb_samples = *nb_samples_written / outlink->channels; |
226 |
+ |
|
227 |
+ out->pts = s->next_pts; |
|
228 |
+ s->next_pts += av_rescale_q(out->nb_samples, |
|
229 |
+ (AVRational){1, outlink->sample_rate}, |
|
230 |
+ outlink->time_base); |
|
231 |
+ |
|
225 | 232 |
*ret = ff_filter_frame(outlink, out); |
226 | 233 |
*nb_samples_written = 0; |
227 | 234 |
} else { |
... | ... |
@@ -297,6 +304,12 @@ silence_trim_flush: |
297 | 297 |
|
298 | 298 |
memcpy(out->data[0], &s->start_holdoff[s->start_holdoff_offset], |
299 | 299 |
nbs * sizeof(double)); |
300 |
+ |
|
301 |
+ out->pts = s->next_pts; |
|
302 |
+ s->next_pts += av_rescale_q(out->nb_samples, |
|
303 |
+ (AVRational){1, outlink->sample_rate}, |
|
304 |
+ outlink->time_base); |
|
305 |
+ |
|
300 | 306 |
s->start_holdoff_offset += nbs; |
301 | 307 |
|
302 | 308 |
ret = ff_filter_frame(outlink, out); |
... | ... |
@@ -330,7 +343,7 @@ silence_copy: |
330 | 330 |
|
331 | 331 |
if (threshold && s->stop_holdoff_end && !s->leave_silence) { |
332 | 332 |
s->mode = SILENCE_COPY_FLUSH; |
333 |
- flush(out, outlink, &nb_samples_written, &ret); |
|
333 |
+ flush(s, out, outlink, &nb_samples_written, &ret); |
|
334 | 334 |
goto silence_copy_flush; |
335 | 335 |
} else if (threshold) { |
336 | 336 |
for (j = 0; j < inlink->channels; j++) { |
... | ... |
@@ -358,7 +371,7 @@ silence_copy: |
358 | 358 |
|
359 | 359 |
if (!s->restart) { |
360 | 360 |
s->mode = SILENCE_STOP; |
361 |
- flush(out, outlink, &nb_samples_written, &ret); |
|
361 |
+ flush(s, out, outlink, &nb_samples_written, &ret); |
|
362 | 362 |
goto silence_stop; |
363 | 363 |
} else { |
364 | 364 |
s->stop_found_periods = 0; |
... | ... |
@@ -367,19 +380,25 @@ silence_copy: |
367 | 367 |
s->start_holdoff_end = 0; |
368 | 368 |
clear_window(s); |
369 | 369 |
s->mode = SILENCE_TRIM; |
370 |
- flush(out, outlink, &nb_samples_written, &ret); |
|
370 |
+ flush(s, out, outlink, &nb_samples_written, &ret); |
|
371 | 371 |
goto silence_trim; |
372 | 372 |
} |
373 | 373 |
} |
374 | 374 |
s->mode = SILENCE_COPY_FLUSH; |
375 |
- flush(out, outlink, &nb_samples_written, &ret); |
|
375 |
+ flush(s, out, outlink, &nb_samples_written, &ret); |
|
376 | 376 |
goto silence_copy_flush; |
377 | 377 |
} |
378 | 378 |
} |
379 | 379 |
} |
380 |
- flush(out, outlink, &nb_samples_written, &ret); |
|
380 |
+ flush(s, out, outlink, &nb_samples_written, &ret); |
|
381 | 381 |
} else { |
382 | 382 |
memcpy(obuf, ibuf, sizeof(double) * nbs * inlink->channels); |
383 |
+ |
|
384 |
+ out->pts = s->next_pts; |
|
385 |
+ s->next_pts += av_rescale_q(out->nb_samples, |
|
386 |
+ (AVRational){1, outlink->sample_rate}, |
|
387 |
+ outlink->time_base); |
|
388 |
+ |
|
383 | 389 |
ret = ff_filter_frame(outlink, out); |
384 | 390 |
} |
385 | 391 |
break; |
... | ... |
@@ -401,6 +420,11 @@ silence_copy_flush: |
401 | 401 |
nbs * sizeof(double)); |
402 | 402 |
s->stop_holdoff_offset += nbs; |
403 | 403 |
|
404 |
+ out->pts = s->next_pts; |
|
405 |
+ s->next_pts += av_rescale_q(out->nb_samples, |
|
406 |
+ (AVRational){1, outlink->sample_rate}, |
|
407 |
+ outlink->time_base); |
|
408 |
+ |
|
404 | 409 |
ret = ff_filter_frame(outlink, out); |
405 | 410 |
|
406 | 411 |
if (s->stop_holdoff_offset == s->stop_holdoff_end) { |
... | ... |
@@ -439,6 +463,12 @@ static int request_frame(AVFilterLink *outlink) |
439 | 439 |
|
440 | 440 |
memcpy(frame->data[0], &s->stop_holdoff[s->stop_holdoff_offset], |
441 | 441 |
nbs * sizeof(double)); |
442 |
+ |
|
443 |
+ frame->pts = s->next_pts; |
|
444 |
+ s->next_pts += av_rescale_q(frame->nb_samples, |
|
445 |
+ (AVRational){1, outlink->sample_rate}, |
|
446 |
+ outlink->time_base); |
|
447 |
+ |
|
442 | 448 |
ret = ff_filter_frame(ctx->inputs[0], frame); |
443 | 449 |
} |
444 | 450 |
s->mode = SILENCE_STOP; |