History

avfilter/avf_showcwt: always consume some available samples

Stop waiting for big cache of samples.

Paul B Mahol committed 3 years ago

Commit 634e29f1 parent 39dc9a71 file · +21 −12Browse files

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

Unified · Split

libavfilter/avf_showcwt.c+21−12
@@ -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
253static int run_channel_cwt_prepare(AVFilterContext *ctx, void *arg, int ch)253static 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 }

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