| @@ -41,6 +41,12 @@ enum SilenceDetect { · 40 unmodified lines |
| 41 | D_NB | 41 | D_NB |
| 42 | }; | 42 | }; |
| 43 | | 43 | |
| | 44 | enum TimestampMode { |
| | 45 | TS_WRITE, |
| | 46 | TS_COPY, |
| | 47 | TS_NB |
| | 48 | }; |
| | 49 | |
| 44 | enum ThresholdMode { | 50 | enum ThresholdMode { |
| 45 | T_ANY, | 51 | T_ANY, |
| 46 | T_ALL, | 52 | T_ALL, |
| @@ -67,6 +73,8 @@ typedef struct SilenceRemoveContext { · 20 unmodified lines |
| 67 | | 73 | |
| 68 | int64_t window_duration_opt; | 74 | int64_t window_duration_opt; |
| 69 | | 75 | |
| | 76 | int timestamp_mode; |
| | 77 | |
| 70 | int start_found_periods; | 78 | int start_found_periods; |
| 71 | int stop_found_periods; | 79 | int stop_found_periods; |
| 72 | | 80 | |
| @@ -138,6 +146,9 @@ static const AVOption silenceremove_options[] = { · 65 unmodified lines |
| 138 | { "median", "use median of absolute values of samples", 0, AV_OPT_TYPE_CONST, {.i64=D_MEDIAN},0, 0, AF, "detection" }, | 146 | { "median", "use median of absolute values of samples", 0, AV_OPT_TYPE_CONST, {.i64=D_MEDIAN},0, 0, AF, "detection" }, |
| 139 | { "ptp", "use absolute of max peak to min peak difference", 0, AV_OPT_TYPE_CONST, {.i64=D_PTP}, 0, 0, AF, "detection" }, | 147 | { "ptp", "use absolute of max peak to min peak difference", 0, AV_OPT_TYPE_CONST, {.i64=D_PTP}, 0, 0, AF, "detection" }, |
| 140 | { "window", "set duration of window for silence detection", OFFSET(window_duration_opt), AV_OPT_TYPE_DURATION, {.i64=20000}, 0, 100000000, AF }, | 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 | { NULL } | 152 | { NULL } |
| 142 | }; | 153 | }; |
| 143 | | 154 | |
| @@ -293,7 +304,10 @@ static int filter_frame(AVFilterLink *outlink, AVFrame *in) · 149 unmodified lines |
| 293 | return AVERROR(ENOMEM); | 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 | switch (outlink->format) { | 312 | switch (outlink->format) { |
| 299 | case AV_SAMPLE_FMT_FLT: | 313 | case AV_SAMPLE_FMT_FLT: |
| @@ -395,7 +409,8 @@ static int activate(AVFilterContext *ctx) · 95 unmodified lines |
| 395 | if (ret > 0) { | 409 | if (ret > 0) { |
| 396 | if (s->start_periods == 1 && s->stop_periods == 0 && | 410 | if (s->start_periods == 1 && s->stop_periods == 0 && |
| 397 | s->start_found_periods < 0) { | 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 | s->next_pts += in->nb_samples; | 414 | s->next_pts += in->nb_samples; |
| 400 | return ff_filter_frame(outlink, in); | 415 | return ff_filter_frame(outlink, in); |
| 401 | } | 416 | } |