summaryrefslogtreecommitdiff
path: root/libavfilter/af_astats.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2019-03-01 23:09:54 +0100
committerMarton Balint <cus@passwd.hu>2019-03-21 00:39:57 +0100
commit235228ea50908a566931b4d24bc878651033c054 (patch)
tree6319e947ba7028b1a4fef4eaae139ff84eda7906 /libavfilter/af_astats.c
parent233fdd84c2c77296624f8b4a88f4ce4739c3a653 (diff)
downloadffmpeg-235228ea50908a566931b4d24bc878651033c054.tar.gz
avfilter/af_astats: factorize sample loops
Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavfilter/af_astats.c')
-rw-r--r--libavfilter/af_astats.c108
1 files changed, 37 insertions, 71 deletions
diff --git a/libavfilter/af_astats.c b/libavfilter/af_astats.c
index ddda84cfbb..f45558909a 100644
--- a/libavfilter/af_astats.c
+++ b/libavfilter/af_astats.c
@@ -406,12 +406,33 @@ static void set_metadata(AudioStatsContext *s, AVDictionary **metadata)
set_meta(metadata, 0, "Overall.Number_of_samples", "%f", nb_samples / s->nb_channels);
}
+#define UPDATE_STATS_P(type, double_sample, normalized_sample, int_sample) \
+ for (int c = 0; c < channels; c++) { \
+ ChannelStats *p = &s->chstats[c]; \
+ const type *src = (const type *)data[c]; \
+ for (int i = 0; i < samples; i++, src++) \
+ update_stat(s, p, double_sample, normalized_sample, int_sample); \
+ }
+
+#define UPDATE_STATS_I(type, double_sample, normalized_sample, int_sample) \
+ { \
+ const type *src = (const type *)data[0]; \
+ for (int i = 0; i < samples; i++) { \
+ for (int c = 0; c < channels; c++, src++) \
+ update_stat(s, &s->chstats[c], double_sample, normalized_sample, int_sample); \
+ } \
+ }
+
+#define UPDATE_STATS(planar, type, sample, normalizer_suffix, int_sample) \
+ UPDATE_STATS_##planar(type, sample, sample normalizer_suffix, int_sample);
+
static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
{
AudioStatsContext *s = inlink->dst->priv;
AVDictionary **metadata = &buf->metadata;
const int channels = s->nb_channels;
- int i, c;
+ const int samples = buf->nb_samples;
+ const uint8_t * const * const data = (const uint8_t * const *)buf->extended_data;
if (s->reset_count > 0) {
if (s->nb_frames >= s->reset_count) {
@@ -423,89 +444,34 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
switch (inlink->format) {
case AV_SAMPLE_FMT_DBLP:
- for (c = 0; c < channels; c++) {
- ChannelStats *p = &s->chstats[c];
- const double *src = (const double *)buf->extended_data[c];
-
- for (i = 0; i < buf->nb_samples; i++, src++)
- update_stat(s, p, *src, *src, llrint(*src * (UINT64_C(1) << 63)));
- }
+ UPDATE_STATS(P, double, *src, , llrint(*src * (UINT64_C(1) << 63)));
break;
- case AV_SAMPLE_FMT_DBL: {
- const double *src = (const double *)buf->extended_data[0];
-
- for (i = 0; i < buf->nb_samples; i++) {
- for (c = 0; c < channels; c++, src++)
- update_stat(s, &s->chstats[c], *src, *src, llrint(*src * (UINT64_C(1) << 63)));
- }}
+ case AV_SAMPLE_FMT_DBL:
+ UPDATE_STATS(I, double, *src, , llrint(*src * (UINT64_C(1) << 63)));
break;
case AV_SAMPLE_FMT_FLTP:
- for (c = 0; c < channels; c++) {
- ChannelStats *p = &s->chstats[c];
- const float *src = (const float *)buf->extended_data[c];
-
- for (i = 0; i < buf->nb_samples; i++, src++)
- update_stat(s, p, *src, *src, llrint(*src * (UINT64_C(1) << 31)));
- }
+ UPDATE_STATS(P, float, *src, , llrint(*src * (UINT64_C(1) << 31)));
break;
- case AV_SAMPLE_FMT_FLT: {
- const float *src = (const float *)buf->extended_data[0];
-
- for (i = 0; i < buf->nb_samples; i++) {
- for (c = 0; c < channels; c++, src++)
- update_stat(s, &s->chstats[c], *src, *src, llrint(*src * (UINT64_C(1) << 31)));
- }}
+ case AV_SAMPLE_FMT_FLT:
+ UPDATE_STATS(I, float, *src, , llrint(*src * (UINT64_C(1) << 31)));
break;
case AV_SAMPLE_FMT_S64P:
- for (c = 0; c < channels; c++) {
- ChannelStats *p = &s->chstats[c];
- const int64_t *src = (const int64_t *)buf->extended_data[c];
-
- for (i = 0; i < buf->nb_samples; i++, src++)
- update_stat(s, p, *src, *src / (double)INT64_MAX, *src);
- }
+ UPDATE_STATS(P, int64_t, *src, / (double)INT64_MAX, *src);
break;
- case AV_SAMPLE_FMT_S64: {
- const int64_t *src = (const int64_t *)buf->extended_data[0];
-
- for (i = 0; i < buf->nb_samples; i++) {
- for (c = 0; c < channels; c++, src++)
- update_stat(s, &s->chstats[c], *src, *src / (double)INT64_MAX, *src);
- }}
+ case AV_SAMPLE_FMT_S64:
+ UPDATE_STATS(I, int64_t, *src, / (double)INT64_MAX, *src);
break;
case AV_SAMPLE_FMT_S32P:
- for (c = 0; c < channels; c++) {
- ChannelStats *p = &s->chstats[c];
- const int32_t *src = (const int32_t *)buf->extended_data[c];
-
- for (i = 0; i < buf->nb_samples; i++, src++)
- update_stat(s, p, *src, *src / (double)INT32_MAX, *src);
- }
+ UPDATE_STATS(P, int32_t, *src, / (double)INT32_MAX, *src);
break;
- case AV_SAMPLE_FMT_S32: {
- const int32_t *src = (const int32_t *)buf->extended_data[0];
-
- for (i = 0; i < buf->nb_samples; i++) {
- for (c = 0; c < channels; c++, src++)
- update_stat(s, &s->chstats[c], *src, *src / (double)INT32_MAX, *src);
- }}
+ case AV_SAMPLE_FMT_S32:
+ UPDATE_STATS(I, int32_t, *src, / (double)INT32_MAX, *src);
break;
case AV_SAMPLE_FMT_S16P:
- for (c = 0; c < channels; c++) {
- ChannelStats *p = &s->chstats[c];
- const int16_t *src = (const int16_t *)buf->extended_data[c];
-
- for (i = 0; i < buf->nb_samples; i++, src++)
- update_stat(s, p, *src, *src / (double)INT16_MAX, *src);
- }
+ UPDATE_STATS(P, int16_t, *src, / (double)INT16_MAX, *src);
break;
- case AV_SAMPLE_FMT_S16: {
- const int16_t *src = (const int16_t *)buf->extended_data[0];
-
- for (i = 0; i < buf->nb_samples; i++) {
- for (c = 0; c < channels; c++, src++)
- update_stat(s, &s->chstats[c], *src, *src / (double)INT16_MAX, *src);
- }}
+ case AV_SAMPLE_FMT_S16:
+ UPDATE_STATS(I, int16_t, *src, / (double)INT16_MAX, *src);
break;
}