return 0;
}
-static void flush(AVFrame *out, AVFilterLink *outlink,
+static void flush(SilenceRemoveContext *s,
+ AVFrame *out, AVFilterLink *outlink,
int *nb_samples_written, int *ret)
{
if (*nb_samples_written) {
out->nb_samples = *nb_samples_written / outlink->channels;
+
+ out->pts = s->next_pts;
+ s->next_pts += av_rescale_q(out->nb_samples,
+ (AVRational){1, outlink->sample_rate},
+ outlink->time_base);
+
*ret = ff_filter_frame(outlink, out);
*nb_samples_written = 0;
} else {
memcpy(out->data[0], &s->start_holdoff[s->start_holdoff_offset],
nbs * sizeof(double));
+
+ out->pts = s->next_pts;
+ s->next_pts += av_rescale_q(out->nb_samples,
+ (AVRational){1, outlink->sample_rate},
+ outlink->time_base);
+
s->start_holdoff_offset += nbs;
ret = ff_filter_frame(outlink, out);
if (threshold && s->stop_holdoff_end && !s->leave_silence) {
s->mode = SILENCE_COPY_FLUSH;
- flush(out, outlink, &nb_samples_written, &ret);
+ flush(s, out, outlink, &nb_samples_written, &ret);
goto silence_copy_flush;
} else if (threshold) {
for (j = 0; j < inlink->channels; j++) {
if (!s->restart) {
s->mode = SILENCE_STOP;
- flush(out, outlink, &nb_samples_written, &ret);
+ flush(s, out, outlink, &nb_samples_written, &ret);
goto silence_stop;
} else {
s->stop_found_periods = 0;
s->start_holdoff_end = 0;
clear_window(s);
s->mode = SILENCE_TRIM;
- flush(out, outlink, &nb_samples_written, &ret);
+ flush(s, out, outlink, &nb_samples_written, &ret);
goto silence_trim;
}
}
s->mode = SILENCE_COPY_FLUSH;
- flush(out, outlink, &nb_samples_written, &ret);
+ flush(s, out, outlink, &nb_samples_written, &ret);
goto silence_copy_flush;
}
}
}
- flush(out, outlink, &nb_samples_written, &ret);
+ flush(s, out, outlink, &nb_samples_written, &ret);
} else {
memcpy(obuf, ibuf, sizeof(double) * nbs * inlink->channels);
+
+ out->pts = s->next_pts;
+ s->next_pts += av_rescale_q(out->nb_samples,
+ (AVRational){1, outlink->sample_rate},
+ outlink->time_base);
+
ret = ff_filter_frame(outlink, out);
}
break;
nbs * sizeof(double));
s->stop_holdoff_offset += nbs;
+ out->pts = s->next_pts;
+ s->next_pts += av_rescale_q(out->nb_samples,
+ (AVRational){1, outlink->sample_rate},
+ outlink->time_base);
+
ret = ff_filter_frame(outlink, out);
if (s->stop_holdoff_offset == s->stop_holdoff_end) {
memcpy(frame->data[0], &s->stop_holdoff[s->stop_holdoff_offset],
nbs * sizeof(double));
+
+ frame->pts = s->next_pts;
+ s->next_pts += av_rescale_q(frame->nb_samples,
+ (AVRational){1, outlink->sample_rate},
+ outlink->time_base);
+
ret = ff_filter_frame(ctx->inputs[0], frame);
}
s->mode = SILENCE_STOP;