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: David Flater <dave@flaterco.com>
This commit is contained in:
parent
1adfd28f9e
commit
d2b6ec1e27
@ -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,11 +242,13 @@ 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) /
|
}
|
||||||
|
pdelta = (limit / ppeak - s->att) /
|
||||||
(((buffer_size + pnextpos -
|
(((buffer_size + pnextpos -
|
||||||
((s->pos + channels) % buffer_size)) %
|
((s->pos + channels) % buffer_size)) %
|
||||||
buffer_size) / channels);
|
buffer_size) / channels);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user