History

avfilter/af_asdr: use single structure for sums

Paul B Mahol committed 3 years ago

Commit 10110a31 parent e41d5221 file · +24 −20Browse files

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

Unified · Split

libavfilter/af_asdr.c+24−20
@@ -27,13 +27,18 @@ · 26 unmodified lines
2727 #include "filters.h"
2828 #include "internal.h"
2929
30+typedef struct ChanStats {
31+ double u;
32+ double v;
33+ double uv;
34+} ChanStats;
35+
3036 typedef struct AudioSDRContext {
3137 int channels;
3238 uint64_t nb_samples;
3339 double max;
34− double *sum_u;
35− double *sum_v;
36− double *sum_uv;
40+
41+ ChanStats *chs;
3742
3843 AVFrame *cache[2];
3944
@@ -52,6 +57,7 @@ static int sdr_##name(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)\ · 12 unmodified lines
5257 const int nb_samples = u->nb_samples; \
5358 \
5459 for (int ch = start; ch < end; ch++) { \
60+ ChanStats *chs = &s->chs[ch]; \
5561 const type *const us = (type *)u->extended_data[ch]; \
5662 const type *const vs = (type *)v->extended_data[ch]; \
5763 double sum_uv = 0.; \
@@ -62,8 +68,8 @@ static int sdr_##name(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)\ · 4 unmodified lines
6268 sum_uv += (us[n] - vs[n]) * (us[n] - vs[n]); \
6369 } \
6470 \
65− s->sum_uv[ch] += sum_uv; \
66− s->sum_u[ch] += sum_u; \
71+ chs->uv += sum_uv; \
72+ chs->u += sum_u; \
6773 } \
6874 \
6975 return 0; \
@@ -84,6 +90,7 @@ static int sisdr_##name(AVFilterContext *ctx, void *arg,int jobnr,int nb_jobs)\ · 14 unmodified lines
8490 const int nb_samples = u->nb_samples; \
8591 \
8692 for (int ch = start; ch < end; ch++) { \
93+ ChanStats *chs = &s->chs[ch]; \
8794 const type *const us = (type *)u->extended_data[ch]; \
8895 const type *const vs = (type *)v->extended_data[ch]; \
8996 double sum_uv = 0.; \
@@ -96,9 +103,9 @@ static int sisdr_##name(AVFilterContext *ctx, void *arg,int jobnr,int nb_jobs)\ · 6 unmodified lines
96103 sum_uv += us[n] * vs[n]; \
97104 } \
98105 \
99− s->sum_uv[ch] += sum_uv; \
100− s->sum_u[ch] += sum_u; \
101− s->sum_v[ch] += sum_v; \
106+ chs->uv += sum_uv; \
107+ chs->u += sum_u; \
108+ chs->v += sum_v; \
102109 } \
103110 \
104111 return 0; \
@@ -119,6 +126,7 @@ static int psnr_##name(AVFilterContext *ctx, void *arg, int jobnr,int nb_jobs)\ · 14 unmodified lines
119126 const int nb_samples = u->nb_samples; \
120127 \
121128 for (int ch = start; ch < end; ch++) { \
129+ ChanStats *chs = &s->chs[ch]; \
122130 const type *const us = (type *)u->extended_data[ch]; \
123131 const type *const vs = (type *)v->extended_data[ch]; \
124132 double sum_uv = 0.; \
@@ -126,7 +134,7 @@ static int psnr_##name(AVFilterContext *ctx, void *arg, int jobnr,int nb_jobs)\ · 1 unmodified line
126134 for (int n = 0; n < nb_samples; n++) \
127135 sum_uv += (us[n] - vs[n]) * (us[n] - vs[n]); \
128136 \
129− s->sum_uv[ch] += sum_uv; \
137+ chs->uv += sum_uv; \
130138 } \
131139 \
132140 return 0; \
@@ -204,10 +212,8 @@ static int config_output(AVFilterLink *outlink) · 71 unmodified lines
204212 s->filter = inlink->format == AV_SAMPLE_FMT_FLTP ? psnr_fltp : psnr_dblp;
205213 s->max = inlink->format == AV_SAMPLE_FMT_FLTP ? FLT_MAX : DBL_MAX;
206214
207− s->sum_u = av_calloc(outlink->ch_layout.nb_channels, sizeof(*s->sum_u));
208− s->sum_v = av_calloc(outlink->ch_layout.nb_channels, sizeof(*s->sum_v));
209− s->sum_uv = av_calloc(outlink->ch_layout.nb_channels, sizeof(*s->sum_uv));
210− if (!s->sum_u || !s->sum_uv || !s->sum_v)
215+ s->chs = av_calloc(outlink->ch_layout.nb_channels, sizeof(*s->chs));
216+ if (!s->chs)
211217 return AVERROR(ENOMEM);
212218
213219 return 0;
@@ -219,17 +225,17 @@ static av_cold void uninit(AVFilterContext *ctx) · 5 unmodified lines
219225
220226 if (!strcmp(ctx->filter->name, "asdr")) {
221227 for (int ch = 0; ch < s->channels; ch++)
222− av_log(ctx, AV_LOG_INFO, "SDR ch%d: %g dB\n", ch, 20. * log10(s->sum_u[ch] / s->sum_uv[ch]));
228+ av_log(ctx, AV_LOG_INFO, "SDR ch%d: %g dB\n", ch, 20. * log10(s->chs[ch].u / s->chs[ch].uv));
223229 } else if (!strcmp(ctx->filter->name, "asisdr")) {
224230 for (int ch = 0; ch < s->channels; ch++) {
225− double scale = s->sum_uv[ch] / s->sum_v[ch];
226− double sisdr = s->sum_u[ch] / (s->sum_u[ch] + scale*scale*s->sum_v[ch] - 2.0*scale*s->sum_uv[ch]);
231+ double scale = s->chs[ch].uv / s->chs[ch].v;
232+ double sisdr = s->chs[ch].u / fmax(0., s->chs[ch].u + scale*scale*s->chs[ch].v - 2.0*scale*s->chs[ch].uv);
227233
228234 av_log(ctx, AV_LOG_INFO, "SI-SDR ch%d: %g dB\n", ch, 10. * log10(sisdr));
229235 }
230236 } else {
231237 for (int ch = 0; ch < s->channels; ch++) {
232− double psnr = s->sum_uv[ch] > 0.0 ? 2.0 * log(s->max) - log(s->nb_samples / s->sum_uv[ch]) : INFINITY;
238+ double psnr = s->chs[ch].uv > 0.0 ? 2.0 * log(s->max) - log(s->nb_samples / s->chs[ch].uv) : INFINITY;
233239
234240 av_log(ctx, AV_LOG_INFO, "PSNR ch%d: %g dB\n", ch, psnr);
235241 }
@@ -238,9 +244,7 @@ static av_cold void uninit(AVFilterContext *ctx) · 2 unmodified lines
238244 av_frame_free(&s->cache[0]);
239245 av_frame_free(&s->cache[1]);
240246
241− av_freep(&s->sum_u);
242− av_freep(&s->sum_v);
243− av_freep(&s->sum_uv);
247+ av_freep(&s->chs);
244248 }
245249
246250 static const AVFilterPad inputs[] = {

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