Commit d2b6ec1e authored by David Flater's avatar David Flater Committed by Paul B Mahol

avfilter/af_alimiter: fix misbehavior when nb_channels != 2

Some code in alimiter assumes that there are 2 channels, resulting in
clipping if the loudest channel is 3 or above and an out-of-bounds read if
the input is monophonic.  Fix that in 2 places.
Signed-off-by: 's avatarDavid Flater <dave@flaterco.com>
parent 1adfd28f
...@@ -194,10 +194,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) ...@@ -194,10 +194,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
} else { } else {
for (i = s->nextiter; i < s->nextiter + s->nextlen; i++) { for (i = s->nextiter; i < s->nextiter + s->nextlen; i++) {
int j = i % buffer_size; int j = i % buffer_size;
double ppeak, pdelta; double ppeak = 0, pdelta;
ppeak = fabs(buffer[nextpos[j]]) > fabs(buffer[nextpos[j] + 1]) ? for (c = 0; c < channels; c++) {
fabs(buffer[nextpos[j]]) : fabs(buffer[nextpos[j] + 1]); ppeak = FFMAX(ppeak, fabs(buffer[nextpos[j] + c]));
}
pdelta = (limit / peak - limit / ppeak) / (((buffer_size - nextpos[j] + s->pos) % buffer_size) / channels); pdelta = (limit / peak - limit / ppeak) / (((buffer_size - nextpos[j] + s->pos) % buffer_size) / channels);
if (pdelta < nextdelta[j]) { if (pdelta < nextdelta[j]) {
nextdelta[j] = pdelta; nextdelta[j] = pdelta;
...@@ -241,14 +242,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) ...@@ -241,14 +242,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
s->delta = get_rdelta(s, release, inlink->sample_rate, s->delta = get_rdelta(s, release, inlink->sample_rate,
peak, limit, s->att, 1); peak, limit, s->att, 1);
if (s->nextlen > 1) { if (s->nextlen > 1) {
double ppeak = 0, pdelta;
int pnextpos = nextpos[(s->nextiter + 1) % buffer_size]; int pnextpos = nextpos[(s->nextiter + 1) % buffer_size];
double ppeak = fabs(buffer[pnextpos]) > fabs(buffer[pnextpos + 1]) ?
fabs(buffer[pnextpos]) : for (c = 0; c < channels; c++) {
fabs(buffer[pnextpos + 1]); ppeak = FFMAX(ppeak, fabs(buffer[pnextpos + c]));
double pdelta = (limit / ppeak - s->att) / }
(((buffer_size + pnextpos - pdelta = (limit / ppeak - s->att) /
((s->pos + channels) % buffer_size)) % (((buffer_size + pnextpos -
buffer_size) / channels); ((s->pos + channels) % buffer_size)) %
buffer_size) / channels);
if (pdelta < s->delta) if (pdelta < s->delta)
s->delta = pdelta; s->delta = pdelta;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment