Unified · Split
| @@ -42,8 +42,8 @@ typedef struct AudioFadeContext { · 41 unmodified lines | |||
| 42 | double silence; | 42 | double silence; |
| 43 | double unity; | 43 | double unity; |
| 44 | int overlap; | 44 | int overlap; |
| 45 | int cf0_eof; | 45 | int status[2]; |
| 46 | int crossfade_is_over; | 46 | int passthrough; |
| 47 | int64_t pts; | 47 | int64_t pts; |
| 48 | 48 | ||
| 49 | void (*fade_samples)(uint8_t **dst, uint8_t * const *src, | 49 | void (*fade_samples)(uint8_t **dst, uint8_t * const *src, |
| @@ -521,6 +521,13 @@ CROSSFADE(flt, float) · 471 unmodified lines | |||
| 521 | CROSSFADE(s16, int16_t) | 521 | CROSSFADE(s16, int16_t) |
| 522 | CROSSFADE(s32, int32_t) | 522 | CROSSFADE(s32, int32_t) |
| 523 | 523 | ||
| 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 | |||
| 524 | static int activate(AVFilterContext *ctx) | 531 | static int activate(AVFilterContext *ctx) |
| 525 | { | 532 | { |
| 526 | AudioFadeContext *s = ctx->priv; | 533 | AudioFadeContext *s = ctx->priv; |
| @@ -531,7 +538,7 @@ static int activate(AVFilterContext *ctx) · 4 unmodified lines | |||
| 531 | 538 | ||
| 532 | FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx); | 539 | FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx); |
| 533 | 540 | ||
| 534 | if (s->crossfade_is_over) { | 541 | if (s->passthrough && s->status[0]) { |
| 535 | ret = ff_inlink_consume_frame(ctx->inputs[1], &in); | 542 | ret = ff_inlink_consume_frame(ctx->inputs[1], &in); |
| 536 | if (ret > 0) { | 543 | if (ret > 0) { |
| 537 | in->pts = s->pts; | 544 | in->pts = s->pts; |
| @@ -541,10 +548,10 @@ static int activate(AVFilterContext *ctx) · 3 unmodified lines | |||
| 541 | } else if (ret < 0) { | 548 | } else if (ret < 0) { |
| 542 | return ret; | 549 | return ret; |
| 543 | } else if (ff_inlink_acknowledge_status(ctx->inputs[1], &status, &pts)) { | 550 | } 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); |
| 545 | return 0; | 552 | return 0; |
| 546 | } else if (!ret) { | 553 | } else if (!ret) { |
| 547 | if (ff_outlink_frame_wanted(ctx->outputs[0])) { | 554 | if (ff_outlink_frame_wanted(outlink)) { |
| 548 | ff_inlink_request_frame(ctx->inputs[1]); | 555 | ff_inlink_request_frame(ctx->inputs[1]); |
| 549 | return 0; | 556 | return 0; |
| 550 | } | 557 | } |
| @@ -554,6 +561,7 @@ static int activate(AVFilterContext *ctx) · 3 unmodified lines | |||
| 554 | nb_samples = ff_inlink_queued_samples(ctx->inputs[0]); | 561 | nb_samples = ff_inlink_queued_samples(ctx->inputs[0]); |
| 555 | if (nb_samples > s->nb_samples) { | 562 | if (nb_samples > s->nb_samples) { |
| 556 | nb_samples -= s->nb_samples; | 563 | nb_samples -= s->nb_samples; |
| 564 | s->passthrough = 1; | ||
| 557 | ret = ff_inlink_consume_samples(ctx->inputs[0], nb_samples, nb_samples, &in); | 565 | ret = ff_inlink_consume_samples(ctx->inputs[0], nb_samples, nb_samples, &in); |
| 558 | if (ret < 0) | 566 | if (ret < 0) |
| 559 | return ret; | 567 | return ret; |
| @@ -561,7 +569,7 @@ static int activate(AVFilterContext *ctx) · 1 unmodified line | |||
| 561 | s->pts += av_rescale_q(in->nb_samples, | 569 | s->pts += av_rescale_q(in->nb_samples, |
| 562 | (AVRational){ 1, outlink->sample_rate }, outlink->time_base); | 570 | (AVRational){ 1, outlink->sample_rate }, outlink->time_base); |
| 563 | return ff_filter_frame(outlink, in); | 571 | 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 && |
| 565 | ff_inlink_queued_samples(ctx->inputs[1]) >= s->nb_samples) { | 573 | ff_inlink_queued_samples(ctx->inputs[1]) >= s->nb_samples) { |
| 566 | if (s->overlap) { | 574 | if (s->overlap) { |
| 567 | out = ff_get_audio_buffer(outlink, s->nb_samples); | 575 | out = ff_get_audio_buffer(outlink, s->nb_samples); |
| @@ -587,7 +595,7 @@ static int activate(AVFilterContext *ctx) · 19 unmodified lines | |||
| 587 | out->pts = s->pts; | 595 | out->pts = s->pts; |
| 588 | s->pts += av_rescale_q(s->nb_samples, | 596 | s->pts += av_rescale_q(s->nb_samples, |
| 589 | (AVRational){ 1, outlink->sample_rate }, outlink->time_base); | 597 | (AVRational){ 1, outlink->sample_rate }, outlink->time_base); |
| 590 | s->crossfade_is_over = 1; | 598 | s->passthrough = 1; |
| 591 | av_frame_free(&cf[0]); | 599 | av_frame_free(&cf[0]); |
| 592 | av_frame_free(&cf[1]); | 600 | av_frame_free(&cf[1]); |
| 593 | return ff_filter_frame(outlink, out); | 601 | return ff_filter_frame(outlink, out); |
| @@ -627,19 +635,20 @@ static int activate(AVFilterContext *ctx) · 33 unmodified lines | |||
| 627 | out->pts = s->pts; | 635 | out->pts = s->pts; |
| 628 | s->pts += av_rescale_q(s->nb_samples, | 636 | s->pts += av_rescale_q(s->nb_samples, |
| 629 | (AVRational){ 1, outlink->sample_rate }, outlink->time_base); | 637 | (AVRational){ 1, outlink->sample_rate }, outlink->time_base); |
| 630 | s->crossfade_is_over = 1; | 638 | s->passthrough = 1; |
| 631 | av_frame_free(&cf[1]); | 639 | av_frame_free(&cf[1]); |
| 632 | return ff_filter_frame(outlink, out); | 640 | return ff_filter_frame(outlink, out); |
| 633 | } | 641 | } |
| 634 | } else if (ff_outlink_frame_wanted(ctx->outputs[0])) { | 642 | } else if (ff_outlink_frame_wanted(outlink)) { |
| 635 | if (!s->cf0_eof && ff_outlink_get_status(ctx->inputs[0])) { | 643 | if (!s->status[0] && check_input(ctx->inputs[0])) |
| 636 | s->cf0_eof = 1; | 644 | s->status[0] = AVERROR_EOF; |
| 637 | } | 645 | s->passthrough = !s->status[0]; |
| 638 | if (ff_outlink_get_status(ctx->inputs[1])) { | 646 | if (check_input(ctx->inputs[1])) { |
| 639 | ff_outlink_set_status(ctx->outputs[0], AVERROR_EOF, AV_NOPTS_VALUE); | 647 | s->status[1] = AVERROR_EOF; |
| 648 | ff_outlink_set_status(outlink, AVERROR_EOF, AV_NOPTS_VALUE); | ||
| 640 | return 0; | 649 | return 0; |
| 641 | } | 650 | } |
| 642 | if (!s->cf0_eof) | 651 | if (!s->status[0]) |
| 643 | ff_inlink_request_frame(ctx->inputs[0]); | 652 | ff_inlink_request_frame(ctx->inputs[0]); |
| 644 | else | 653 | else |
| 645 | ff_inlink_request_frame(ctx->inputs[1]); | 654 | ff_inlink_request_frame(ctx->inputs[1]); |
| @@ -677,8 +686,7 @@ static AVFrame *get_audio_buffer(AVFilterLink *inlink, int nb_samples) · 31 unmodified lines | |||
| 677 | AVFilterContext *ctx = inlink->dst; | 686 | AVFilterContext *ctx = inlink->dst; |
| 678 | AudioFadeContext *s = ctx->priv; | 687 | AudioFadeContext *s = ctx->priv; |
| 679 | 688 | ||
| 680 | return (s->crossfade_is_over || | 689 | return s->passthrough ? |
| 681 | (ff_inlink_queued_samples(inlink) > s->nb_samples)) ? | ||
| 682 | ff_null_get_audio_buffer (inlink, nb_samples) : | 690 | ff_null_get_audio_buffer (inlink, nb_samples) : |
| 683 | ff_default_get_audio_buffer(inlink, nb_samples); | 691 | ff_default_get_audio_buffer(inlink, nb_samples); |
| 684 | } | 692 | } |