mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avfilter/ebur128: fix relative threshold calculation for multiple contexts
This reworks the code a bit and also disallows NULL contexts. Fixes Coverity CID 1396273, 1396279. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
a91cedf79a
commit
fd57f70c97
@ -519,26 +519,27 @@ FF_EBUR128_ADD_FRAMES(int)
|
|||||||
FF_EBUR128_ADD_FRAMES(float)
|
FF_EBUR128_ADD_FRAMES(float)
|
||||||
FF_EBUR128_ADD_FRAMES(double)
|
FF_EBUR128_ADD_FRAMES(double)
|
||||||
|
|
||||||
static int ebur128_calc_relative_threshold(FFEBUR128State * st,
|
static int ebur128_calc_relative_threshold(FFEBUR128State **sts, size_t size,
|
||||||
size_t * above_thresh_counter,
|
|
||||||
double *relative_threshold)
|
double *relative_threshold)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i, j;
|
||||||
|
int above_thresh_counter = 0;
|
||||||
*relative_threshold = 0.0;
|
*relative_threshold = 0.0;
|
||||||
*above_thresh_counter = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < size; i++) {
|
||||||
*relative_threshold += st->d->block_energy_histogram[i] *
|
unsigned long *block_energy_histogram = sts[i]->d->block_energy_histogram;
|
||||||
histogram_energies[i];
|
for (j = 0; j < 1000; ++j) {
|
||||||
*above_thresh_counter += st->d->block_energy_histogram[i];
|
*relative_threshold += block_energy_histogram[j] * histogram_energies[j];
|
||||||
|
above_thresh_counter += block_energy_histogram[j];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*above_thresh_counter != 0) {
|
if (above_thresh_counter != 0) {
|
||||||
*relative_threshold /= (double) *above_thresh_counter;
|
*relative_threshold /= (double)above_thresh_counter;
|
||||||
*relative_threshold *= RELATIVE_GATE_FACTOR;
|
*relative_threshold *= RELATIVE_GATE_FACTOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return above_thresh_counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ebur128_gated_loudness(FFEBUR128State ** sts, size_t size,
|
static int ebur128_gated_loudness(FFEBUR128State ** sts, size_t size,
|
||||||
@ -549,20 +550,11 @@ static int ebur128_gated_loudness(FFEBUR128State ** sts, size_t size,
|
|||||||
size_t above_thresh_counter;
|
size_t above_thresh_counter;
|
||||||
size_t i, j, start_index;
|
size_t i, j, start_index;
|
||||||
|
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++)
|
||||||
if (sts[i]
|
if ((sts[i]->mode & FF_EBUR128_MODE_I) != FF_EBUR128_MODE_I)
|
||||||
&& (sts[i]->mode & FF_EBUR128_MODE_I) != FF_EBUR128_MODE_I) {
|
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < size; i++) {
|
if (!ebur128_calc_relative_threshold(sts, size, &relative_threshold)) {
|
||||||
if (!sts[i])
|
|
||||||
continue;
|
|
||||||
ebur128_calc_relative_threshold(sts[i], &above_thresh_counter,
|
|
||||||
&relative_threshold);
|
|
||||||
}
|
|
||||||
if (!above_thresh_counter) {
|
|
||||||
*out = -HUGE_VAL;
|
*out = -HUGE_VAL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -577,8 +569,6 @@ static int ebur128_gated_loudness(FFEBUR128State ** sts, size_t size,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
if (!sts[i])
|
|
||||||
continue;
|
|
||||||
for (j = start_index; j < 1000; ++j) {
|
for (j = start_index; j < 1000; ++j) {
|
||||||
gated_loudness += sts[i]->d->block_energy_histogram[j] *
|
gated_loudness += sts[i]->d->block_energy_histogram[j] *
|
||||||
histogram_energies[j];
|
histogram_energies[j];
|
||||||
@ -597,15 +587,11 @@ static int ebur128_gated_loudness(FFEBUR128State ** sts, size_t size,
|
|||||||
int ff_ebur128_relative_threshold(FFEBUR128State * st, double *out)
|
int ff_ebur128_relative_threshold(FFEBUR128State * st, double *out)
|
||||||
{
|
{
|
||||||
double relative_threshold;
|
double relative_threshold;
|
||||||
size_t above_thresh_counter;
|
|
||||||
|
|
||||||
if ((st->mode & FF_EBUR128_MODE_I) != FF_EBUR128_MODE_I)
|
if ((st->mode & FF_EBUR128_MODE_I) != FF_EBUR128_MODE_I)
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
ebur128_calc_relative_threshold(st, &above_thresh_counter,
|
if (!ebur128_calc_relative_threshold(&st, 1, &relative_threshold)) {
|
||||||
&relative_threshold);
|
|
||||||
|
|
||||||
if (!above_thresh_counter) {
|
|
||||||
*out = -70.0;
|
*out = -70.0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user