History

avfilter/af_afade: stop using ff_outlink_get_status on inputs

Paul B Mahol committed 3 years ago

Commit c44fe101 parent a756ae41 file · +25 −17Browse files

Showing the changes to libavfilter (1 of 1 file). Show all

Unified · Split

libavfilter/af_afade.c+25−17
@@ -42,8 +42,8 @@ typedef struct AudioFadeContext { · 41 unmodified lines
4242 double silence;
4343 double unity;
4444 int overlap;
45− int cf0_eof;
46− int crossfade_is_over;
45+ int status[2];
46+ int passthrough;
4747 int64_t pts;
4848
4949 void (*fade_samples)(uint8_t **dst, uint8_t * const *src,
@@ -521,6 +521,13 @@ CROSSFADE(flt, float) · 471 unmodified lines
521521 CROSSFADE(s16, int16_t)
522522 CROSSFADE(s32, int32_t)
523523
524+static int check_input(AVFilterLink *inlink)
525+{
526+ const int queued_samples = ff_inlink_queued_samples(inlink);
527+
528+ return ff_inlink_check_available_samples(inlink, queued_samples + 1) == 1;
529+}
530+
524531 static int activate(AVFilterContext *ctx)
525532 {
526533 AudioFadeContext *s = ctx->priv;
@@ -531,7 +538,7 @@ static int activate(AVFilterContext *ctx) · 4 unmodified lines
531538
532539 FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx);
533540
534− if (s->crossfade_is_over) {
541+ if (s->passthrough && s->status[0]) {
535542 ret = ff_inlink_consume_frame(ctx->inputs[1], &in);
536543 if (ret > 0) {
537544 in->pts = s->pts;
@@ -541,10 +548,10 @@ static int activate(AVFilterContext *ctx) · 3 unmodified lines
541548 } else if (ret < 0) {
542549 return ret;
543550 } else if (ff_inlink_acknowledge_status(ctx->inputs[1], &status, &pts)) {
544− ff_outlink_set_status(ctx->outputs[0], status, pts);
551+ ff_outlink_set_status(outlink, status, pts);
545552 return 0;
546553 } else if (!ret) {
547− if (ff_outlink_frame_wanted(ctx->outputs[0])) {
554+ if (ff_outlink_frame_wanted(outlink)) {
548555 ff_inlink_request_frame(ctx->inputs[1]);
549556 return 0;
550557 }
@@ -554,6 +561,7 @@ static int activate(AVFilterContext *ctx) · 3 unmodified lines
554561 nb_samples = ff_inlink_queued_samples(ctx->inputs[0]);
555562 if (nb_samples > s->nb_samples) {
556563 nb_samples -= s->nb_samples;
564+ s->passthrough = 1;
557565 ret = ff_inlink_consume_samples(ctx->inputs[0], nb_samples, nb_samples, &in);
558566 if (ret < 0)
559567 return ret;
@@ -561,7 +569,7 @@ static int activate(AVFilterContext *ctx) · 1 unmodified line
561569 s->pts += av_rescale_q(in->nb_samples,
562570 (AVRational){ 1, outlink->sample_rate }, outlink->time_base);
563571 return ff_filter_frame(outlink, in);
564− } else if (s->cf0_eof && nb_samples >= s->nb_samples &&
572+ } else if (s->status[0] && nb_samples >= s->nb_samples &&
565573 ff_inlink_queued_samples(ctx->inputs[1]) >= s->nb_samples) {
566574 if (s->overlap) {
567575 out = ff_get_audio_buffer(outlink, s->nb_samples);
@@ -587,7 +595,7 @@ static int activate(AVFilterContext *ctx) · 19 unmodified lines
587595 out->pts = s->pts;
588596 s->pts += av_rescale_q(s->nb_samples,
589597 (AVRational){ 1, outlink->sample_rate }, outlink->time_base);
590− s->crossfade_is_over = 1;
598+ s->passthrough = 1;
591599 av_frame_free(&cf[0]);
592600 av_frame_free(&cf[1]);
593601 return ff_filter_frame(outlink, out);
@@ -627,19 +635,20 @@ static int activate(AVFilterContext *ctx) · 33 unmodified lines
627635 out->pts = s->pts;
628636 s->pts += av_rescale_q(s->nb_samples,
629637 (AVRational){ 1, outlink->sample_rate }, outlink->time_base);
630− s->crossfade_is_over = 1;
638+ s->passthrough = 1;
631639 av_frame_free(&cf[1]);
632640 return ff_filter_frame(outlink, out);
633641 }
634− } else if (ff_outlink_frame_wanted(ctx->outputs[0])) {
635− if (!s->cf0_eof && ff_outlink_get_status(ctx->inputs[0])) {
636− s->cf0_eof = 1;
637− }
638− if (ff_outlink_get_status(ctx->inputs[1])) {
639− ff_outlink_set_status(ctx->outputs[0], AVERROR_EOF, AV_NOPTS_VALUE);
642+ } else if (ff_outlink_frame_wanted(outlink)) {
643+ if (!s->status[0] && check_input(ctx->inputs[0]))
644+ s->status[0] = AVERROR_EOF;
645+ s->passthrough = !s->status[0];
646+ if (check_input(ctx->inputs[1])) {
647+ s->status[1] = AVERROR_EOF;
648+ ff_outlink_set_status(outlink, AVERROR_EOF, AV_NOPTS_VALUE);
640649 return 0;
641650 }
642− if (!s->cf0_eof)
651+ if (!s->status[0])
643652 ff_inlink_request_frame(ctx->inputs[0]);
644653 else
645654 ff_inlink_request_frame(ctx->inputs[1]);
@@ -677,8 +686,7 @@ static AVFrame *get_audio_buffer(AVFilterLink *inlink, int nb_samples) · 31 unmodified lines
677686 AVFilterContext *ctx = inlink->dst;
678687 AudioFadeContext *s = ctx->priv;
679688
680− return (s->crossfade_is_over ||
681− (ff_inlink_queued_samples(inlink) > s->nb_samples)) ?
689+ return s->passthrough ?
682690 ff_null_get_audio_buffer (inlink, nb_samples) :
683691 ff_default_get_audio_buffer(inlink, nb_samples);
684692 }

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