[FFmpeg-cvslog] avfilter/vf_bilateral: simplify code a little

Paul B Mahol git at videolan.org
Sat Jul 18 11:23:36 EEST 2020


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Fri Jul 17 20:29:48 2020 +0200| [fa8345cf059394544387e1a47016dec109379a8a] | committer: Paul B Mahol

avfilter/vf_bilateral: simplify code a little

Make alpha_ calculation faster.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=fa8345cf059394544387e1a47016dec109379a8a
---

 libavfilter/vf_bilateral.c | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/libavfilter/vf_bilateral.c b/libavfilter/vf_bilateral.c
index 3025b49ae5..59e008ca1d 100644
--- a/libavfilter/vf_bilateral.c
+++ b/libavfilter/vf_bilateral.c
@@ -41,6 +41,7 @@ typedef struct BilateralContext {
     int planewidth[4];
     int planeheight[4];
 
+    float alpha;
     float range_table[65536];
 
     float *img_out_f;
@@ -99,10 +100,11 @@ static int config_input(AVFilterLink *inlink)
 
     s->depth = desc->comp[0].depth;
     inv_sigma_range = 1.0f / (s->sigmaR * ((1 << s->depth) - 1));
+    s->alpha = expf(-sqrtf(2.f) / s->sigmaS);
 
     //compute a lookup table
     for (int i = 0; i < (1 << s->depth); i++)
-        s->range_table[i] = expf(-i * inv_sigma_range);
+        s->range_table[i] = s->alpha * expf(-i * inv_sigma_range);
 
     s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
     s->planewidth[0] = s->planewidth[3] = inlink->w;
@@ -144,10 +146,10 @@ static void bilateral_##name(BilateralContext *s, const uint8_t *ssrc, uint8_t *
     float *map_factor_a = s->map_factor_a, *map_factor_b = s->map_factor_b;             \
     float *slice_factor_a = s->slice_factor_a, *slice_factor_b = s->slice_factor_b;     \
     float *line_factor_a = s->line_factor_a, *line_factor_b = s->line_factor_b;         \
-    float *range_table = s->range_table;                                                \
-    float alpha = expf(-sqrtf(2.f) / sigma_spatial);                                    \
+    const float *range_table = s->range_table;                                          \
+    const float alpha = s->alpha;                                                       \
     float ypr, ycr, *ycy, *ypy, *xcy, fp, fc;                                           \
-    float inv_alpha_ = 1 - alpha;                                                       \
+    const float inv_alpha_ = 1.f - alpha;                                               \
     float *ycf, *ypf, *xcf, *in_factor;                                                 \
     const type *tcy, *tpy;                                                                \
     int h1;                                                                               \
@@ -165,14 +167,13 @@ static void bilateral_##name(BilateralContext *s, const uint8_t *ssrc, uint8_t *
         *temp_factor_x++ = fp = 1;                                                        \
                                                                                           \
         for (int x = 1; x < width; x++) {                                                 \
-            float weight, alpha_;                                                         \
+            float alpha_;                                                                 \
             int range_dist;                                                               \
             type tcr = *texture_x++;                                                      \
             type dr = abs(tcr - tpr);                                                     \
                                                                                           \
             range_dist = dr;                                                              \
-            weight = range_table[range_dist];                                             \
-            alpha_ = weight*alpha;                                                        \
+            alpha_ = range_table[range_dist];                                             \
             *temp_x++ = ycr = inv_alpha_*(*in_x++) + alpha_*ypr;                          \
             tpr = tcr;                                                                    \
             ypr = ycr;                                                                    \
@@ -190,8 +191,7 @@ static void bilateral_##name(BilateralContext *s, const uint8_t *ssrc, uint8_t *
             type tcr = *--texture_x;                                                      \
             type dr = abs(tcr - tpr);                                                     \
             int range_dist = dr;                                                          \
-            float weight = range_table[range_dist];                                       \
-            float alpha_ = weight * alpha;                                                \
+            float alpha_ = range_table[range_dist];                                       \
                                                                                           \
             ycr = inv_alpha_ * (*--in_x) + alpha_ * ypr;                                  \
             --temp_x; *temp_x = 0.5f*((*temp_x) + ycr);                                   \
@@ -206,8 +206,6 @@ static void bilateral_##name(BilateralContext *s, const uint8_t *ssrc, uint8_t *
     }                                                                                     \
     memcpy(img_out_f, img_temp, sizeof(float) * width);                                   \
                                                                                           \
-    alpha = expf(-sqrtf(2.f) / sigma_spatial);                                            \
-    inv_alpha_ = 1 - alpha;                                                               \
     in_factor = map_factor_a;                                                             \
     memcpy(map_factor_b, in_factor, sizeof(float) * width);                               \
     for (int y = 1; y < height; y++) {                                                    \
@@ -223,8 +221,7 @@ static void bilateral_##name(BilateralContext *s, const uint8_t *ssrc, uint8_t *
         for (int x = 0; x < width; x++) {                                                 \
             type dr = abs((*tcy++) - (*tpy++));                                           \
             int range_dist = dr;                                                          \
-            float weight = range_table[range_dist];                                       \
-            float alpha_ = weight*alpha;                                                  \
+            float alpha_ = range_table[range_dist];                                       \
                                                                                           \
             *ycy++ = inv_alpha_*(*xcy++) + alpha_*(*ypy++);                               \
             *ycf++ = inv_alpha_*(*xcf++) + alpha_*(*ypf++);                               \
@@ -263,8 +260,7 @@ static void bilateral_##name(BilateralContext *s, const uint8_t *ssrc, uint8_t *
         for (int x = 0; x < width; x++) {                                                 \
             type dr = abs((*tcy++) - (*tpy++));                                           \
             int range_dist = dr;                                                          \
-            float weight = range_table[range_dist];                                       \
-            float alpha_ = weight*alpha;                                                  \
+            float alpha_ = range_table[range_dist];                                       \
             float ycc, fcc = inv_alpha_*(*xcf++) + alpha_*(*ypf_++);                      \
                                                                                           \
             *ycf_++ = fcc;                                                                \



More information about the ffmpeg-cvslog mailing list