Browse code

lavfi/concat: fix silence duration computation.

Inside send_silence(), delta_ts was used inconsistently:
sometimes as the new value, sometimes as the old value.

Consistently use it as the new value, and add an argument
to know the last segment duration.

Nicolas George authored on 2013/03/16 20:21:14
Showing 1 changed files
... ...
@@ -232,7 +232,7 @@ static void close_input(AVFilterContext *ctx, unsigned in_no)
232 232
            ctx->input_pads[in_no].name, cat->nb_in_active);
233 233
 }
234 234
 
235
-static void find_next_delta_ts(AVFilterContext *ctx)
235
+static void find_next_delta_ts(AVFilterContext *ctx, int64_t *seg_delta)
236 236
 {
237 237
     ConcatContext *cat = ctx->priv;
238 238
     unsigned i = cat->cur_idx;
... ...
@@ -243,13 +243,15 @@ static void find_next_delta_ts(AVFilterContext *ctx)
243 243
     for (; i < imax; i++)
244 244
         pts = FFMAX(pts, cat->in[i].pts);
245 245
     cat->delta_ts += pts;
246
+    *seg_delta = pts;
246 247
 }
247 248
 
248
-static int send_silence(AVFilterContext *ctx, unsigned in_no, unsigned out_no)
249
+static int send_silence(AVFilterContext *ctx, unsigned in_no, unsigned out_no,
250
+                        int64_t seg_delta)
249 251
 {
250 252
     ConcatContext *cat = ctx->priv;
251 253
     AVFilterLink *outlink = ctx->outputs[out_no];
252
-    int64_t base_pts = cat->in[in_no].pts + cat->delta_ts;
254
+    int64_t base_pts = cat->in[in_no].pts + cat->delta_ts - seg_delta;
253 255
     int64_t nb_samples, sent = 0;
254 256
     int frame_nb_samples, ret;
255 257
     AVRational rate_tb = { 1, ctx->inputs[in_no]->sample_rate };
... ...
@@ -258,7 +260,7 @@ static int send_silence(AVFilterContext *ctx, unsigned in_no, unsigned out_no)
258 258
 
259 259
     if (!rate_tb.den)
260 260
         return AVERROR_BUG;
261
-    nb_samples = av_rescale_q(cat->delta_ts - base_pts,
261
+    nb_samples = av_rescale_q(seg_delta - cat->in[in_no].pts,
262 262
                               outlink->time_base, rate_tb);
263 263
     frame_nb_samples = FFMAX(9600, rate_tb.den / 5); /* arbitrary */
264 264
     while (nb_samples) {
... ...
@@ -283,8 +285,9 @@ static int flush_segment(AVFilterContext *ctx)
283 283
     int ret;
284 284
     ConcatContext *cat = ctx->priv;
285 285
     unsigned str, str_max;
286
+    int64_t seg_delta;
286 287
 
287
-    find_next_delta_ts(ctx);
288
+    find_next_delta_ts(ctx, &seg_delta);
288 289
     cat->cur_idx += ctx->nb_outputs;
289 290
     cat->nb_in_active = ctx->nb_outputs;
290 291
     av_log(ctx, AV_LOG_VERBOSE, "Segment finished at pts=%"PRId64"\n",
... ...
@@ -295,7 +298,8 @@ static int flush_segment(AVFilterContext *ctx)
295 295
         str = cat->nb_streams[AVMEDIA_TYPE_VIDEO];
296 296
         str_max = str + cat->nb_streams[AVMEDIA_TYPE_AUDIO];
297 297
         for (; str < str_max; str++) {
298
-            ret = send_silence(ctx, cat->cur_idx - ctx->nb_outputs + str, str);
298
+            ret = send_silence(ctx, cat->cur_idx - ctx->nb_outputs + str, str,
299
+                               seg_delta);
299 300
             if (ret < 0)
300 301
                 return ret;
301 302
         }