]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/af_astats: factorize sample loops
authorMarton Balint <cus@passwd.hu>
Fri, 1 Mar 2019 22:09:54 +0000 (23:09 +0100)
committerMarton Balint <cus@passwd.hu>
Wed, 20 Mar 2019 23:39:57 +0000 (00:39 +0100)
Signed-off-by: Marton Balint <cus@passwd.hu>
libavfilter/af_astats.c

index ddda84cfbbbd2fb8d078ef137cf9b61d4de01755..f45558909ad4f5d7c000710a4f109e4bdbba199b 100644 (file)
@@ -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;
     }