From 80e68ce116868da6ba63c1a6f2c564f4703cc1ef Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Mon, 10 Jun 2019 22:58:45 +0200 Subject: [PATCH] avfilter/vf_normalize: fix filtering of RGB0 formats --- libavfilter/vf_normalize.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libavfilter/vf_normalize.c b/libavfilter/vf_normalize.c index b95bb4d100..48eea59e64 100644 --- a/libavfilter/vf_normalize.c +++ b/libavfilter/vf_normalize.c @@ -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