Browse code

avfilter/af_silenceremove: set output timestamps

Signed-off-by: Paul B Mahol <onemda@gmail.com>

Paul B Mahol authored on 2017/05/15 21:05:17
Showing 1 changed files
... ...
@@ -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;