Stop waiting for big cache of samples.
Unified · Split
| @@ -73,7 +73,6 @@ typedef struct ShowCWTContext { · 72 unmodified lines | ||
| 73 | 73 | int ifft_in_size; |
| 74 | 74 | int ifft_out_size; |
| 75 | 75 | int pos; |
| 76 | − int in_nb_samples; | |
| 77 | 76 | int64_t in_pts; |
| 78 | 77 | int64_t old_pts; |
| 79 | 78 | float *frequency_band; |
| @@ -95,6 +94,7 @@ typedef struct ShowCWTContext { · 15 unmodified lines | ||
| 95 | 94 | int slide; |
| 96 | 95 | int direction; |
| 97 | 96 | int hop_size; |
| 97 | + int hop_index; | |
| 98 | 98 | int ihop_size; |
| 99 | 99 | int ihop_index; |
| 100 | 100 | int input_padding_size; |
| @@ -250,7 +250,7 @@ static float remap_log(float value, float log_factor) · 149 unmodified lines | ||
| 250 | 250 | return 1.f - av_clipf(value, 0.f, 1.f); |
| 251 | 251 | } |
| 252 | 252 | |
| 253 | −static int run_channel_cwt_prepare(AVFilterContext *ctx, void *arg, int ch) | |
| 253 | +static int run_channel_cwt_prepare(AVFilterContext *ctx, void *arg, int ch, int eof) | |
| 254 | 254 | { |
| 255 | 255 | ShowCWTContext *s = ctx->priv; |
| 256 | 256 | AVFrame *fin = arg; |
| @@ -260,14 +260,19 @@ static int run_channel_cwt_prepare(AVFilterContext *ctx, void *arg, int ch) · 3 unmodified lines | ||
| 260 | 260 | AVComplexFloat *dst = (AVComplexFloat *)s->fft_out->extended_data[ch]; |
| 261 | 261 | const int nb_consumed_samples = s->nb_consumed_samples; |
| 262 | 262 | const int input_padding_size = s->input_padding_size; |
| 263 | − const int hop_size = s->hop_size; | |
| 263 | + const int hop_size = eof ? s->hop_size : fin->nb_samples; | |
| 264 | 264 | const int offset = input_padding_size - hop_size; |
| 265 | 265 | |
| 266 | 266 | memmove(overlap, &overlap[hop_size], offset * sizeof(float)); |
| 267 | 267 | memcpy(&overlap[offset], input, |
| 268 | 268 | fin->nb_samples * sizeof(float)); |
| 269 | − memset(&overlap[offset + fin->nb_samples], 0, | |
| 270 | − (hop_size - fin->nb_samples) * sizeof(float)); | |
| 269 | + | |
| 270 | + if (eof) { | |
| 271 | + memset(&overlap[offset + fin->nb_samples], 0, | |
| 272 | + (hop_size - fin->nb_samples) * sizeof(float)); | |
| 273 | + } else if (s->hop_index + fin->nb_samples < s->hop_size) { | |
| 274 | + return 0; | |
| 275 | + } | |
| 271 | 276 | |
| 272 | 277 | for (int n = 0; n < nb_consumed_samples; n++) { |
| 273 | 278 | src[n].re = overlap[n]; |
| @@ -665,22 +670,26 @@ static int activate(AVFilterContext *ctx) · 391 unmodified lines | ||
| 665 | 670 | AVFrame *fin; |
| 666 | 671 | |
| 667 | 672 | if (s->ihop_index == 0) { |
| 668 | − ret = ff_inlink_consume_samples(inlink, s->hop_size, s->hop_size, &fin); | |
| 673 | + ret = ff_inlink_consume_samples(inlink, 1, s->hop_size - s->hop_index, &fin); | |
| 669 | 674 | if (ret < 0) |
| 670 | 675 | return ret; |
| 671 | 676 | if (ret > 0) { |
| 672 | 677 | for (int ch = 0; ch < s->nb_channels; ch++) |
| 673 | − run_channel_cwt_prepare(ctx, fin, ch); | |
| 678 | + run_channel_cwt_prepare(ctx, fin, ch, | |
| 679 | + ff_outlink_get_status(inlink)); | |
| 674 | 680 | |
| 675 | − s->in_pts = fin->pts; | |
| 676 | − s->in_nb_samples = fin->nb_samples; | |
| 681 | + if (s->hop_index == 0) | |
| 682 | + s->in_pts = fin->pts; | |
| 683 | + s->hop_index += fin->nb_samples; | |
| 677 | 684 | av_frame_free(&fin); |
| 678 | 685 | } |
| 679 | 686 | } |
| 680 | 687 | |
| 681 | − if (ret > 0 || s->ihop_index > 0) { | |
| 688 | + if (s->hop_index >= s->hop_size || s->ihop_index > 0) { | |
| 682 | 689 | int64_t pts_offset; |
| 683 | 690 | |
| 691 | + s->hop_index = 0; | |
| 692 | + | |
| 684 | 693 | switch (s->slide) { |
| 685 | 694 | case SLIDE_SCROLL: |
| 686 | 695 | switch (s->direction) { |
| @@ -717,7 +726,7 @@ static int activate(AVFilterContext *ctx) · 30 unmodified lines | ||
| 717 | 726 | |
| 718 | 727 | ff_filter_execute(ctx, draw, NULL, NULL, s->nb_threads); |
| 719 | 728 | |
| 720 | − pts_offset = av_rescale_q(s->ihop_index, av_make_q(1, s->ihop_size), av_make_q(1, s->in_nb_samples)); | |
| 729 | + pts_offset = av_rescale(s->ihop_index, s->hop_size, s->ihop_size); | |
| 721 | 730 | s->outpicref->pts = av_rescale_q(s->in_pts + pts_offset, inlink->time_base, outlink->time_base); |
| 722 | 731 | |
| 723 | 732 | s->ihop_index++; |
| @@ -795,7 +804,7 @@ fail: · 71 unmodified lines | ||
| 795 | 804 | } |
| 796 | 805 | } |
| 797 | 806 | |
| 798 | − if (ff_inlink_queued_samples(inlink) >= s->hop_size || s->ihop_index) { | |
| 807 | + if (ff_inlink_queued_samples(inlink) > 0 || s->ihop_index || s->hop_index >= s->hop_size) { | |
| 799 | 808 | ff_filter_set_ready(ctx, 10); |
| 800 | 809 | return 0; |
| 801 | 810 | } |