| @@ -41,6 +41,12 @@ enum SilenceDetect { · 40 unmodified lines |
| 41 | 41 | D_NB |
| 42 | 42 | }; |
| 43 | 43 | |
| 44 | +enum TimestampMode { |
| 45 | + TS_WRITE, |
| 46 | + TS_COPY, |
| 47 | + TS_NB |
| 48 | +}; |
| 49 | + |
| 44 | 50 | enum ThresholdMode { |
| 45 | 51 | T_ANY, |
| 46 | 52 | T_ALL, |
| @@ -67,6 +73,8 @@ typedef struct SilenceRemoveContext { · 20 unmodified lines |
| 67 | 73 | |
| 68 | 74 | int64_t window_duration_opt; |
| 69 | 75 | |
| 76 | + int timestamp_mode; |
| 77 | + |
| 70 | 78 | int start_found_periods; |
| 71 | 79 | int stop_found_periods; |
| 72 | 80 | |
| @@ -138,6 +146,9 @@ static const AVOption silenceremove_options[] = { · 65 unmodified lines |
| 138 | 146 | { "median", "use median of absolute values of samples", 0, AV_OPT_TYPE_CONST, {.i64=D_MEDIAN},0, 0, AF, "detection" }, |
| 139 | 147 | { "ptp", "use absolute of max peak to min peak difference", 0, AV_OPT_TYPE_CONST, {.i64=D_PTP}, 0, 0, AF, "detection" }, |
| 140 | 148 | { "window", "set duration of window for silence detection", OFFSET(window_duration_opt), AV_OPT_TYPE_DURATION, {.i64=20000}, 0, 100000000, AF }, |
| 149 | + { "timestamp", "set how every output frame timestamp is processed", OFFSET(timestamp_mode), AV_OPT_TYPE_INT, {.i64=TS_WRITE}, 0, TS_NB-1, AF, "timestamp" }, |
| 150 | + { "write", "full timestamps rewrite, keep only the start time", 0, AV_OPT_TYPE_CONST, {.i64=TS_WRITE}, 0, 0, AF, "timestamp" }, |
| 151 | + { "copy", "non-dropped frames are left with same timestamp", 0, AV_OPT_TYPE_CONST, {.i64=TS_COPY}, 0, 0, AF, "timestamp" }, |
| 141 | 152 | { NULL } |
| 142 | 153 | }; |
| 143 | 154 | |
| @@ -293,7 +304,10 @@ static int filter_frame(AVFilterLink *outlink, AVFrame *in) · 149 unmodified lines |
| 293 | 304 | return AVERROR(ENOMEM); |
| 294 | 305 | } |
| 295 | 306 | |
| 296 | | − out->pts = s->next_pts; |
| 307 | + if (s->timestamp_mode == TS_WRITE) |
| 308 | + out->pts = s->next_pts; |
| 309 | + else |
| 310 | + out->pts = in->pts; |
| 297 | 311 | |
| 298 | 312 | switch (outlink->format) { |
| 299 | 313 | case AV_SAMPLE_FMT_FLT: |
| @@ -395,7 +409,8 @@ static int activate(AVFilterContext *ctx) · 95 unmodified lines |
| 395 | 409 | if (ret > 0) { |
| 396 | 410 | if (s->start_periods == 1 && s->stop_periods == 0 && |
| 397 | 411 | s->start_found_periods < 0) { |
| 398 | | − in->pts = s->next_pts; |
| 412 | + if (s->timestamp_mode == TS_WRITE) |
| 413 | + in->pts = s->next_pts; |
| 399 | 414 | s->next_pts += in->nb_samples; |
| 400 | 415 | return ff_filter_frame(outlink, in); |
| 401 | 416 | } |