Stop waiting for big cache of samples.
Unified · Split
| @@ -73,7 +73,6 @@ typedef struct ShowCWTContext { · 72 unmodified lines | |||
| 73 | int ifft_in_size; | 73 | int ifft_in_size; |
| 74 | int ifft_out_size; | 74 | int ifft_out_size; |
| 75 | int pos; | 75 | int pos; |
| 76 | int in_nb_samples; | ||
| 77 | int64_t in_pts; | 76 | int64_t in_pts; |
| 78 | int64_t old_pts; | 77 | int64_t old_pts; |
| 79 | float *frequency_band; | 78 | float *frequency_band; |
| @@ -95,6 +94,7 @@ typedef struct ShowCWTContext { · 15 unmodified lines | |||
| 95 | int slide; | 94 | int slide; |
| 96 | int direction; | 95 | int direction; |
| 97 | int hop_size; | 96 | int hop_size; |
| 97 | int hop_index; | ||
| 98 | int ihop_size; | 98 | int ihop_size; |
| 99 | int ihop_index; | 99 | int ihop_index; |
| 100 | int input_padding_size; | 100 | int input_padding_size; |
| @@ -250,7 +250,7 @@ static float remap_log(float value, float log_factor) · 149 unmodified lines | |||
| 250 | return 1.f - av_clipf(value, 0.f, 1.f); | 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 | ShowCWTContext *s = ctx->priv; | 255 | ShowCWTContext *s = ctx->priv; |
| 256 | AVFrame *fin = arg; | 256 | AVFrame *fin = arg; |
| @@ -260,14 +260,19 @@ static int run_channel_cwt_prepare(AVFilterContext *ctx, void *arg, int ch) · 3 unmodified lines | |||
| 260 | AVComplexFloat *dst = (AVComplexFloat *)s->fft_out->extended_data[ch]; | 260 | AVComplexFloat *dst = (AVComplexFloat *)s->fft_out->extended_data[ch]; |
| 261 | const int nb_consumed_samples = s->nb_consumed_samples; | 261 | const int nb_consumed_samples = s->nb_consumed_samples; |
| 262 | const int input_padding_size = s->input_padding_size; | 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 | const int offset = input_padding_size - hop_size; | 264 | const int offset = input_padding_size - hop_size; |
| 265 | 265 | ||
| 266 | memmove(overlap, &overlap[hop_size], offset * sizeof(float)); | 266 | memmove(overlap, &overlap[hop_size], offset * sizeof(float)); |
| 267 | memcpy(&overlap[offset], input, | 267 | memcpy(&overlap[offset], input, |
| 268 | fin->nb_samples * sizeof(float)); | 268 | fin->nb_samples * sizeof(float)); |
| 269 | memset(&overlap[offset + fin->nb_samples], 0, | 269 | |
| 270 | (hop_size - fin->nb_samples) * sizeof(float)); | 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 | for (int n = 0; n < nb_consumed_samples; n++) { | 277 | for (int n = 0; n < nb_consumed_samples; n++) { |
| 273 | src[n].re = overlap[n]; | 278 | src[n].re = overlap[n]; |
| @@ -665,22 +670,26 @@ static int activate(AVFilterContext *ctx) · 391 unmodified lines | |||
| 665 | AVFrame *fin; | 670 | AVFrame *fin; |
| 666 | 671 | ||
| 667 | if (s->ihop_index == 0) { | 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 | if (ret < 0) | 674 | if (ret < 0) |
| 670 | return ret; | 675 | return ret; |
| 671 | if (ret > 0) { | 676 | if (ret > 0) { |
| 672 | for (int ch = 0; ch < s->nb_channels; ch++) | 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; | 681 | if (s->hop_index == 0) |
| 676 | s->in_nb_samples = fin->nb_samples; | 682 | s->in_pts = fin->pts; |
| 683 | s->hop_index += fin->nb_samples; | ||
| 677 | av_frame_free(&fin); | 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 | int64_t pts_offset; | 689 | int64_t pts_offset; |
| 683 | 690 | ||
| 691 | s->hop_index = 0; | ||
| 692 | |||
| 684 | switch (s->slide) { | 693 | switch (s->slide) { |
| 685 | case SLIDE_SCROLL: | 694 | case SLIDE_SCROLL: |
| 686 | switch (s->direction) { | 695 | switch (s->direction) { |
| @@ -717,7 +726,7 @@ static int activate(AVFilterContext *ctx) · 30 unmodified lines | |||
| 717 | 726 | ||
| 718 | ff_filter_execute(ctx, draw, NULL, NULL, s->nb_threads); | 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 | s->outpicref->pts = av_rescale_q(s->in_pts + pts_offset, inlink->time_base, outlink->time_base); | 730 | s->outpicref->pts = av_rescale_q(s->in_pts + pts_offset, inlink->time_base, outlink->time_base); |
| 722 | 731 | ||
| 723 | s->ihop_index++; | 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 | ff_filter_set_ready(ctx, 10); | 808 | ff_filter_set_ready(ctx, 10); |
| 800 | return 0; | 809 | return 0; |
| 801 | } | 810 | } |