History

avfilter/f_ebur128: switch to activate()

Paul B Mahol committed 4 years ago

Commit 34836e91 parent c619c541 file · +55 −11Browse files

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

Unified · Split

libavfilter/f_ebur128.c+55−11
@@ -39,6 +39,7 @@ · 38 unmodified lines
3939 #include "libswresample/swresample.h"
4040 #include "audio.h"
4141 #include "avfilter.h"
42+#include "filters.h"
4243 #include "formats.h"
4344 #include "internal.h"
4445
@@ -106,6 +107,9 @@ typedef struct EBUR128Context { · 61 unmodified lines
106107 int nb_channels; ///< number of channels in the input
107108 double *ch_weighting; ///< channel weighting mapping
108109 int sample_count; ///< sample count used for refresh frequency, reset at refresh
110+ int nb_samples; ///< number of samples to consume per single input frame
111+ int idx_insample; ///< current sample position of processed samples in single input frame
112+ AVFrame *insamples; ///< input samples reference, updated regularly
109113
110114 /* Filter caches.
111115 * The mult by 3 in the following is for X[i], X[i-1] and X[i-2] */
@@ -413,8 +417,7 @@ static int config_audio_input(AVFilterLink *inlink) · 301 unmodified lines
413417 * can be more complex to integrate in the one-sample loop of
414418 * filter_frame()). */
415419 if (ebur128->metadata || (ebur128->peak_mode & PEAK_MODE_TRUE_PEAKS))
416− inlink->min_samples =
417− inlink->max_samples = inlink->sample_rate / 10;
420+ ebur128->nb_samples = inlink->sample_rate / 10;
418421 return 0;
419422 }
420423
@@ -621,7 +624,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 200 unmodified lines
621624 AVFrame *pic = ebur128->outpicref;
622625
623626 #if CONFIG_SWRESAMPLE
624− if (ebur128->peak_mode & PEAK_MODE_TRUE_PEAKS) {
627+ if (ebur128->peak_mode & PEAK_MODE_TRUE_PEAKS && ebur128->idx_insample == 0) {
625628 const double *swr_samples = ebur128->swr_buf;
626629 int ret = swr_convert(ebur128->swr_ctx, (uint8_t**)&ebur128->swr_buf, 19200,
627630 (const uint8_t **)insamples->data, nb_samples);
@@ -640,7 +643,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 12 unmodified lines
640643 }
641644 #endif
642645
643− for (idx_insample = 0; idx_insample < nb_samples; idx_insample++) {
646+ for (idx_insample = ebur128->idx_insample; idx_insample < nb_samples; idx_insample++) {
644647 const int bin_id_400 = ebur128->i400.cache_pos;
645648 const int bin_id_3000 = ebur128->i3000.cache_pos;
646649
@@ -660,9 +663,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 13 unmodified lines
660663 double bin;
661664
662665 if (ebur128->peak_mode & PEAK_MODE_SAMPLES_PEAKS)
663− ebur128->sample_peaks[ch] = FFMAX(ebur128->sample_peaks[ch], fabs(*samples));
666+ ebur128->sample_peaks[ch] = FFMAX(ebur128->sample_peaks[ch], fabs(samples[idx_insample * nb_channels + ch]));
664667
665− ebur128->x[ch * 3] = *samples++; // set X[i]
668+ ebur128->x[ch * 3] = samples[idx_insample * nb_channels + ch]; // set X[i]
666669
667670 if (!ebur128->ch_weighting[ch])
668671 continue;
@@ -801,7 +804,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 132 unmodified lines
801804 /* push one video frame */
802805 if (ebur128->do_video) {
803806 AVFrame *clone;
804− int x, y, ret;
807+ int x, y;
805808 uint8_t *p;
806809 double gauge_value;
807810 int y_loudness_lu_graph, y_loudness_lu_gauge;
@@ -853,9 +856,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 45 unmodified lines
853856 clone = av_frame_clone(pic);
854857 if (!clone)
855858 return AVERROR(ENOMEM);
856− ret = ff_filter_frame(outlink, clone);
857− if (ret < 0)
858− return ret;
859+ ebur128->idx_insample = idx_insample + 1;
860+ ff_filter_set_ready(ctx, 100);
861+ return ff_filter_frame(outlink, clone);
859862 }
860863
861864 if (ebur128->metadata) { /* happens only once per filter_frame call */
@@ -919,12 +922,53 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 57 unmodified lines
919922 PRINT_PEAKS("FTPK", ebur128->true_peaks_per_frame, TRUE);
920923 PRINT_PEAKS("TPK", ebur128->true_peaks, TRUE);
921924 av_log(ctx, ebur128->loglevel, "\n");
925+
922926 }
923927 }
924928
929+ ebur128->idx_insample = 0;
930+ ebur128->insamples = NULL;
931+
925932 return ff_filter_frame(ctx->outputs[ebur128->do_video], insamples);
926933 }
927934
935+static int activate(AVFilterContext *ctx)
936+{
937+ AVFilterLink *inlink = ctx->inputs[0];
938+ EBUR128Context *ebur128 = ctx->priv;
939+ AVFilterLink *voutlink = ctx->outputs[0];
940+ AVFilterLink *outlink = ctx->outputs[ebur128->do_video];
941+ int ret;
942+
943+ FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
944+ if (ebur128->do_video)
945+ FF_FILTER_FORWARD_STATUS_BACK(voutlink, inlink);
946+
947+ if (!ebur128->insamples) {
948+ AVFrame *in;
949+
950+ if (ebur128->nb_samples > 0) {
951+ ret = ff_inlink_consume_samples(inlink, ebur128->nb_samples, ebur128->nb_samples, &in);
952+ } else {
953+ ret = ff_inlink_consume_frame(inlink, &in);
954+ }
955+ if (ret < 0)
956+ return ret;
957+ if (ret > 0)
958+ ebur128->insamples = in;
959+ }
960+
961+ if (ebur128->insamples)
962+ ret = filter_frame(inlink, ebur128->insamples);
963+
964+ FF_FILTER_FORWARD_STATUS_ALL(inlink, ctx);
965+ FF_FILTER_FORWARD_WANTED(outlink, inlink);
966+ if (ebur128->do_video)
967+ FF_FILTER_FORWARD_WANTED(voutlink, inlink);
968+
969+ return ret;
970+}
971+
928972 static int query_formats(AVFilterContext *ctx)
929973 {
930974 EBUR128Context *ebur128 = ctx->priv;
@@ -1040,7 +1084,6 @@ static const AVFilterPad ebur128_inputs[] = { · 109 unmodified lines
10401084 {
10411085 .name = "default",
10421086 .type = AVMEDIA_TYPE_AUDIO,
1043− .filter_frame = filter_frame,
10441087 .config_props = config_audio_input,
10451088 },
10461089 };
@@ -1051,6 +1094,7 @@ const AVFilter ff_af_ebur128 = { · 4 unmodified lines
10511094 .priv_size = sizeof(EBUR128Context),
10521095 .init = init,
10531096 .uninit = uninit,
1097+ .activate = activate,
10541098 FILTER_INPUTS(ebur128_inputs),
10551099 .outputs = NULL,
10561100 FILTER_QUERY_FUNC(query_formats),

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