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
232 ctx->input_pads[in_no].name, cat->nb_in_active);232 ctx->input_pads[in_no].name, cat->nb_in_active);
233}233}
234 234
235static void find_next_delta_ts(AVFilterContext *ctx)235static void find_next_delta_ts(AVFilterContext *ctx, int64_t *seg_delta)
236{236{
237 ConcatContext *cat = ctx->priv;237 ConcatContext *cat = ctx->priv;
238 unsigned i = cat->cur_idx;238 unsigned i = cat->cur_idx;
@@ -243,13 +243,15 @@ static void find_next_delta_ts(AVFilterContext *ctx) · 4 unmodified lines
243 for (; i < imax; i++)243 for (; i < imax; i++)
244 pts = FFMAX(pts, cat->in[i].pts);244 pts = FFMAX(pts, cat->in[i].pts);
245 cat->delta_ts += pts;245 cat->delta_ts += pts;
246 *seg_delta = pts;
246}247}
247 248
248static int send_silence(AVFilterContext *ctx, unsigned in_no, unsigned out_no)249static int send_silence(AVFilterContext *ctx, unsigned in_no, unsigned out_no,
250 int64_t seg_delta)
249{251{
250 ConcatContext *cat = ctx->priv;252 ConcatContext *cat = ctx->priv;
251 AVFilterLink *outlink = ctx->outputs[out_no];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 int64_t nb_samples, sent = 0;255 int64_t nb_samples, sent = 0;
254 int frame_nb_samples, ret;256 int frame_nb_samples, ret;
255 AVRational rate_tb = { 1, ctx->inputs[in_no]->sample_rate };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) · 2 unmodified lines
258 260
259 if (!rate_tb.den)261 if (!rate_tb.den)
260 return AVERROR_BUG;262 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,
262 outlink->time_base, rate_tb);264 outlink->time_base, rate_tb);
263 frame_nb_samples = FFMAX(9600, rate_tb.den / 5); /* arbitrary */265 frame_nb_samples = FFMAX(9600, rate_tb.den / 5); /* arbitrary */
264 while (nb_samples) {266 while (nb_samples) {
@@ -283,8 +285,9 @@ static int flush_segment(AVFilterContext *ctx) · 18 unmodified lines
283 int ret;285 int ret;
284 ConcatContext *cat = ctx->priv;286 ConcatContext *cat = ctx->priv;
285 unsigned str, str_max;287 unsigned str, str_max;
288 int64_t seg_delta;
286 289
287 find_next_delta_ts(ctx);290 find_next_delta_ts(ctx, &seg_delta);
288 cat->cur_idx += ctx->nb_outputs;291 cat->cur_idx += ctx->nb_outputs;
289 cat->nb_in_active = ctx->nb_outputs;292 cat->nb_in_active = ctx->nb_outputs;
290 av_log(ctx, AV_LOG_VERBOSE, "Segment finished at pts=%"PRId64"\n",293 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
295 str = cat->nb_streams[AVMEDIA_TYPE_VIDEO];298 str = cat->nb_streams[AVMEDIA_TYPE_VIDEO];
296 str_max = str + cat->nb_streams[AVMEDIA_TYPE_AUDIO];299 str_max = str + cat->nb_streams[AVMEDIA_TYPE_AUDIO];
297 for (; str < str_max; str++) {300 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);
299 if (ret < 0)303 if (ret < 0)
300 return ret;304 return ret;
301 }305 }

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