]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/vf_normalize: fix filtering of RGB0 formats
authorPaul B Mahol <onemda@gmail.com>
Mon, 10 Jun 2019 20:58:45 +0000 (22:58 +0200)
committerPaul B Mahol <onemda@gmail.com>
Mon, 10 Jun 2019 21:11:57 +0000 (23:11 +0200)
libavfilter/vf_normalize.c

index b95bb4d100aea0ee1901121b3029e9497d81bf0b..48eea59e64c5e8d041cd1f0ec9c7215481c7361d 100644 (file)
@@ -76,6 +76,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
+#include "drawutils.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
@@ -90,8 +91,9 @@ typedef struct NormalizeContext {
     float independence;
     float strength;
 
-    int co[4];          // Offsets to R,G,B,A bytes respectively in each pixel
+    uint8_t co[4];      // Offsets to R,G,B,A bytes respectively in each pixel
     int num_components; // Number of components in the pixel format
+    int step;
     int history_len;    // Number of frames to average; based on smoothing factor
     int frame_num;      // Increments on each frame, starting from 0.
 
@@ -147,8 +149,8 @@ static void normalize(NormalizeContext *s, AVFrame *in, AVFrame *out)
                 min[c].in = FFMIN(min[c].in, inp[s->co[c]]);
                 max[c].in = FFMAX(max[c].in, inp[s->co[c]]);
             }
-            inp += s->num_components;
-            outp += s->num_components;
+            inp += s->step;
+            outp += s->step;
         }
     }
 
@@ -237,8 +239,8 @@ static void normalize(NormalizeContext *s, AVFrame *in, AVFrame *out)
             if (s->num_components == 4)
                 // Copy alpha as-is.
                 outp[s->co[3]] = inp[s->co[3]];
-            inp += s->num_components;
-            outp += s->num_components;
+            inp += s->step;
+            outp += s->step;
         }
     }
 
@@ -286,9 +288,9 @@ static int config_input(AVFilterLink *inlink)
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
     int c;
 
-    for (c = 0; c < 4; ++c)
-        s->co[c] = desc->comp[c].offset;
+    ff_fill_rgba_map(s->co, inlink->format);
     s->num_components = desc->nb_components;
+    s->step = av_get_padded_bits_per_pixel(desc) >> 3;
     // Convert smoothing value to history_len (a count of frames to average,
     // must be at least 1).  Currently this is a direct assignment, but the
     // smoothing value was originally envisaged as a number of seconds.  In