You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
avfilter/f_ebur128: simplify sample cache array
We don't need an X sample cache anymore, and we also can simplify the access macro slightly.
This commit is contained in:
@@ -115,7 +115,6 @@ typedef struct EBUR128Context {
|
|||||||
|
|
||||||
/* Filter caches.
|
/* Filter caches.
|
||||||
* The mult by 3 in the following is for X[i], X[i-1] and X[i-2] */
|
* The mult by 3 in the following is for X[i], X[i-1] and X[i-2] */
|
||||||
double *x; ///< 3 input samples cache for each channel
|
|
||||||
double *y; ///< 3 pre-filter samples cache for each channel
|
double *y; ///< 3 pre-filter samples cache for each channel
|
||||||
double *z; ///< 3 RLB-filter samples cache for each channel
|
double *z; ///< 3 RLB-filter samples cache for each channel
|
||||||
double pre_b[3]; ///< pre-filter numerator coefficients
|
double pre_b[3]; ///< pre-filter numerator coefficients
|
||||||
@@ -446,11 +445,10 @@ static int config_audio_output(AVFilterLink *outlink)
|
|||||||
AV_CH_SURROUND_DIRECT_LEFT |AV_CH_SURROUND_DIRECT_RIGHT)
|
AV_CH_SURROUND_DIRECT_LEFT |AV_CH_SURROUND_DIRECT_RIGHT)
|
||||||
|
|
||||||
ebur128->nb_channels = nb_channels;
|
ebur128->nb_channels = nb_channels;
|
||||||
ebur128->x = av_calloc(nb_channels, 3 * sizeof(*ebur128->x));
|
|
||||||
ebur128->y = av_calloc(nb_channels, 3 * sizeof(*ebur128->y));
|
ebur128->y = av_calloc(nb_channels, 3 * sizeof(*ebur128->y));
|
||||||
ebur128->z = av_calloc(nb_channels, 3 * sizeof(*ebur128->z));
|
ebur128->z = av_calloc(nb_channels, 3 * sizeof(*ebur128->z));
|
||||||
ebur128->ch_weighting = av_calloc(nb_channels, sizeof(*ebur128->ch_weighting));
|
ebur128->ch_weighting = av_calloc(nb_channels, sizeof(*ebur128->ch_weighting));
|
||||||
if (!ebur128->ch_weighting || !ebur128->x || !ebur128->y || !ebur128->z)
|
if (!ebur128->ch_weighting || !ebur128->y || !ebur128->z)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
#define I400_BINS(x) ((x) * 4 / 10)
|
#define I400_BINS(x) ((x) * 4 / 10)
|
||||||
@@ -673,34 +671,30 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
|
|||||||
MOVE_TO_NEXT_CACHED_ENTRY(3000);
|
MOVE_TO_NEXT_CACHED_ENTRY(3000);
|
||||||
|
|
||||||
for (ch = 0; ch < nb_channels; ch++) {
|
for (ch = 0; ch < nb_channels; ch++) {
|
||||||
double bin;
|
|
||||||
|
|
||||||
if (ebur128->peak_mode & PEAK_MODE_SAMPLES_PEAKS)
|
if (ebur128->peak_mode & PEAK_MODE_SAMPLES_PEAKS)
|
||||||
ebur128->sample_peaks[ch] = FFMAX(ebur128->sample_peaks[ch], fabs(samples[idx_insample * nb_channels + ch]));
|
ebur128->sample_peaks[ch] = FFMAX(ebur128->sample_peaks[ch], fabs(samples[idx_insample * nb_channels + ch]));
|
||||||
|
|
||||||
ebur128->x[ch * 3] = samples[idx_insample * nb_channels + ch]; // set X[i]
|
|
||||||
|
|
||||||
if (!ebur128->ch_weighting[ch])
|
if (!ebur128->ch_weighting[ch])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Y[i] = X[i]*b0 + X[i-1]*b1 + X[i-2]*b2 - Y[i-1]*a1 - Y[i-2]*a2 */
|
/* Y[i] = X[i]*b0 + X[i-1]*b1 + X[i-2]*b2 - Y[i-1]*a1 - Y[i-2]*a2 */
|
||||||
#define FILTER(Y, X, NUM, DEN) do { \
|
#define FILTER(DST, SRC, NUM, DEN) do { \
|
||||||
double *dst = ebur128->Y + ch*3; \
|
const double tmp = DST[0] = NUM[0] * SRC + DST[1]; \
|
||||||
double src = ebur128->X[ch*3] ; \
|
DST[1] = NUM[1] * SRC + DST[2] - DEN[1] * tmp; \
|
||||||
double dst0 = NUM[0] * src + dst[1]; \
|
DST[2] = NUM[2] * SRC - DEN[2] * tmp; \
|
||||||
dst[1] = NUM[1] * src + dst[2] - DEN[1] * dst0; \
|
|
||||||
dst[2] = NUM[2] * src - DEN[2] * dst0; \
|
|
||||||
dst[0] = dst0; \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
const double x = samples[idx_insample * nb_channels + ch];
|
||||||
|
double *restrict y = &ebur128->y[3 * ch];
|
||||||
|
double *restrict z = &ebur128->z[3 * ch];
|
||||||
|
|
||||||
// TODO: merge both filters in one?
|
// TODO: merge both filters in one?
|
||||||
FILTER(y, x, ebur128->pre_b, ebur128->pre_a); // apply pre-filter
|
FILTER(y, x, ebur128->pre_b, ebur128->pre_a); // apply pre-filter
|
||||||
FILTER(z, y, ebur128->rlb_b, ebur128->rlb_a); // apply RLB-filter
|
FILTER(z, *y, ebur128->rlb_b, ebur128->rlb_a); // apply RLB-filter
|
||||||
|
|
||||||
bin = ebur128->z[ch * 3] * ebur128->z[ch * 3];
|
|
||||||
|
|
||||||
/* add the new value, and limit the sum to the cache size (400ms or 3s)
|
/* add the new value, and limit the sum to the cache size (400ms or 3s)
|
||||||
* by removing the oldest one */
|
* by removing the oldest one */
|
||||||
|
double bin = *z * *z;
|
||||||
ebur128->i400.sum [ch] = ebur128->i400.sum [ch] + bin - ebur128->i400.cache [ch][bin_id_400];
|
ebur128->i400.sum [ch] = ebur128->i400.sum [ch] + bin - ebur128->i400.cache [ch][bin_id_400];
|
||||||
ebur128->i3000.sum[ch] = ebur128->i3000.sum[ch] + bin - ebur128->i3000.cache[ch][bin_id_3000];
|
ebur128->i3000.sum[ch] = ebur128->i3000.sum[ch] + bin - ebur128->i3000.cache[ch][bin_id_3000];
|
||||||
|
|
||||||
@@ -1073,7 +1067,6 @@ static av_cold void uninit(AVFilterContext *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
av_freep(&ebur128->y_line_ref);
|
av_freep(&ebur128->y_line_ref);
|
||||||
av_freep(&ebur128->x);
|
|
||||||
av_freep(&ebur128->y);
|
av_freep(&ebur128->y);
|
||||||
av_freep(&ebur128->z);
|
av_freep(&ebur128->z);
|
||||||
av_freep(&ebur128->ch_weighting);
|
av_freep(&ebur128->ch_weighting);
|
||||||
|
Reference in New Issue
Block a user