History

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 committed 13 years ago

Commit 68fb7e21 parent de1a7151 file · +10 −6Browse files

Unified · Split

libavfilter/avf_concat.c+10−6
@@ -232,7 +232,7 @@ static void close_input(AVFilterContext *ctx, unsigned in_no) · 231 unmodified lines
232232 ctx->input_pads[in_no].name, cat->nb_in_active);
233233 }
234234
235−static void find_next_delta_ts(AVFilterContext *ctx)
235+static void find_next_delta_ts(AVFilterContext *ctx, int64_t *seg_delta)
236236 {
237237 ConcatContext *cat = ctx->priv;
238238 unsigned i = cat->cur_idx;
@@ -243,13 +243,15 @@ static void find_next_delta_ts(AVFilterContext *ctx) · 4 unmodified lines
243243 for (; i < imax; i++)
244244 pts = FFMAX(pts, cat->in[i].pts);
245245 cat->delta_ts += pts;
246+ *seg_delta = pts;
246247 }
247248
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)
249251 {
250252 ConcatContext *cat = ctx->priv;
251253 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;
253255 int64_t nb_samples, sent = 0;
254256 int frame_nb_samples, ret;
255257 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) · 2 unmodified lines
258260
259261 if (!rate_tb.den)
260262 return AVERROR_BUG;
261− nb_samples = av_rescale_q(cat->delta_ts - base_pts,
263+ nb_samples = av_rescale_q(seg_delta - cat->in[in_no].pts,
262264 outlink->time_base, rate_tb);
263265 frame_nb_samples = FFMAX(9600, rate_tb.den / 5); /* arbitrary */
264266 while (nb_samples) {
@@ -283,8 +285,9 @@ static int flush_segment(AVFilterContext *ctx) · 18 unmodified lines
283285 int ret;
284286 ConcatContext *cat = ctx->priv;
285287 unsigned str, str_max;
288+ int64_t seg_delta;
286289
287− find_next_delta_ts(ctx);
290+ find_next_delta_ts(ctx, &seg_delta);
288291 cat->cur_idx += ctx->nb_outputs;
289292 cat->nb_in_active = ctx->nb_outputs;
290293 av_log(ctx, AV_LOG_VERBOSE, "Segment finished at pts=%"PRId64"\n",
@@ -295,7 +298,8 @@ static int flush_segment(AVFilterContext *ctx) · 4 unmodified lines
295298 str = cat->nb_streams[AVMEDIA_TYPE_VIDEO];
296299 str_max = str + cat->nb_streams[AVMEDIA_TYPE_AUDIO];
297300 for (; str < str_max; str++) {
298− ret = send_silence(ctx, cat->cur_idx - ctx->nb_outputs + str, str);
301+ ret = send_silence(ctx, cat->cur_idx - ctx->nb_outputs + str, str,
302+ seg_delta);
299303 if (ret < 0)
300304 return ret;
301305 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t