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