History

avfilter/f_ebur128: switch to activate()

Paul B Mahol committed 4 years ago

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

Unified · Split

libavfilter/f_ebur128.c+55−11
@@ -39,6 +39,7 @@ · 38 unmodified lines
39#include "libswresample/swresample.h"39#include "libswresample/swresample.h"
40#include "audio.h"40#include "audio.h"
41#include "avfilter.h"41#include "avfilter.h"
42#include "filters.h"
42#include "formats.h"43#include "formats.h"
43#include "internal.h"44#include "internal.h"
44 45
@@ -106,6 +107,9 @@ typedef struct EBUR128Context { · 61 unmodified lines
106 int nb_channels; ///< number of channels in the input107 int nb_channels; ///< number of channels in the input
107 double *ch_weighting; ///< channel weighting mapping108 double *ch_weighting; ///< channel weighting mapping
108 int sample_count; ///< sample count used for refresh frequency, reset at refresh109 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
109 113
110 /* Filter caches.114 /* Filter caches.
111 * The mult by 3 in the following is for X[i], X[i-1] and X[i-2] */115 * 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
413 * can be more complex to integrate in the one-sample loop of417 * can be more complex to integrate in the one-sample loop of
414 * filter_frame()). */418 * filter_frame()). */
415 if (ebur128->metadata || (ebur128->peak_mode & PEAK_MODE_TRUE_PEAKS))419 if (ebur128->metadata || (ebur128->peak_mode & PEAK_MODE_TRUE_PEAKS))
416 inlink->min_samples =420 ebur128->nb_samples = inlink->sample_rate / 10;
417 inlink->max_samples = inlink->sample_rate / 10;
418 return 0;421 return 0;
419}422}
420 423
@@ -621,7 +624,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 200 unmodified lines
621 AVFrame *pic = ebur128->outpicref;624 AVFrame *pic = ebur128->outpicref;
622 625
623#if CONFIG_SWRESAMPLE626#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) {
625 const double *swr_samples = ebur128->swr_buf;628 const double *swr_samples = ebur128->swr_buf;
626 int ret = swr_convert(ebur128->swr_ctx, (uint8_t**)&ebur128->swr_buf, 19200,629 int ret = swr_convert(ebur128->swr_ctx, (uint8_t**)&ebur128->swr_buf, 19200,
627 (const uint8_t **)insamples->data, nb_samples);630 (const uint8_t **)insamples->data, nb_samples);
@@ -640,7 +643,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 12 unmodified lines
640 }643 }
641#endif644#endif
642 645
643 for (idx_insample = 0; idx_insample < nb_samples; idx_insample++) {646 for (idx_insample = ebur128->idx_insample; idx_insample < nb_samples; idx_insample++) {
644 const int bin_id_400 = ebur128->i400.cache_pos;647 const int bin_id_400 = ebur128->i400.cache_pos;
645 const int bin_id_3000 = ebur128->i3000.cache_pos;648 const int bin_id_3000 = ebur128->i3000.cache_pos;
646 649
@@ -660,9 +663,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 13 unmodified lines
660 double bin;663 double bin;
661 664
662 if (ebur128->peak_mode & PEAK_MODE_SAMPLES_PEAKS)665 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]));
664 667
665 ebur128->x[ch * 3] = *samples++; // set X[i]668 ebur128->x[ch * 3] = samples[idx_insample * nb_channels + ch]; // set X[i]
666 669
667 if (!ebur128->ch_weighting[ch])670 if (!ebur128->ch_weighting[ch])
668 continue;671 continue;
@@ -801,7 +804,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 132 unmodified lines
801 /* push one video frame */804 /* push one video frame */
802 if (ebur128->do_video) {805 if (ebur128->do_video) {
803 AVFrame *clone;806 AVFrame *clone;
804 int x, y, ret;807 int x, y;
805 uint8_t *p;808 uint8_t *p;
806 double gauge_value;809 double gauge_value;
807 int y_loudness_lu_graph, y_loudness_lu_gauge;810 int y_loudness_lu_graph, y_loudness_lu_gauge;
@@ -853,9 +856,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) · 45 unmodified lines
853 clone = av_frame_clone(pic);856 clone = av_frame_clone(pic);
854 if (!clone)857 if (!clone)
855 return AVERROR(ENOMEM);858 return AVERROR(ENOMEM);
856 ret = ff_filter_frame(outlink, clone);859 ebur128->idx_insample = idx_insample + 1;
857 if (ret < 0)860 ff_filter_set_ready(ctx, 100);
858 return ret;861 return ff_filter_frame(outlink, clone);
859 }862 }
860 863
861 if (ebur128->metadata) { /* happens only once per filter_frame call */864 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
919 PRINT_PEAKS("FTPK", ebur128->true_peaks_per_frame, TRUE);922 PRINT_PEAKS("FTPK", ebur128->true_peaks_per_frame, TRUE);
920 PRINT_PEAKS("TPK", ebur128->true_peaks, TRUE);923 PRINT_PEAKS("TPK", ebur128->true_peaks, TRUE);
921 av_log(ctx, ebur128->loglevel, "\n");924 av_log(ctx, ebur128->loglevel, "\n");
925
922 }926 }
923 }927 }
924 928
929 ebur128->idx_insample = 0;
930 ebur128->insamples = NULL;
931
925 return ff_filter_frame(ctx->outputs[ebur128->do_video], insamples);932 return ff_filter_frame(ctx->outputs[ebur128->do_video], insamples);
926}933}
927 934
935static 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
928static int query_formats(AVFilterContext *ctx)972static int query_formats(AVFilterContext *ctx)
929{973{
930 EBUR128Context *ebur128 = ctx->priv;974 EBUR128Context *ebur128 = ctx->priv;
@@ -1040,7 +1084,6 @@ static const AVFilterPad ebur128_inputs[] = { · 109 unmodified lines
1040 {1084 {
1041 .name = "default",1085 .name = "default",
1042 .type = AVMEDIA_TYPE_AUDIO,1086 .type = AVMEDIA_TYPE_AUDIO,
1043 .filter_frame = filter_frame,
1044 .config_props = config_audio_input,1087 .config_props = config_audio_input,
1045 },1088 },
1046};1089};
@@ -1051,6 +1094,7 @@ const AVFilter ff_af_ebur128 = { · 4 unmodified lines
1051 .priv_size = sizeof(EBUR128Context),1094 .priv_size = sizeof(EBUR128Context),
1052 .init = init,1095 .init = init,
1053 .uninit = uninit,1096 .uninit = uninit,
1097 .activate = activate,
1054 FILTER_INPUTS(ebur128_inputs),1098 FILTER_INPUTS(ebur128_inputs),
1055 .outputs = NULL,1099 .outputs = NULL,
1056 FILTER_QUERY_FUNC(query_formats),1100 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