[FFmpeg-devel] [PATCH 2/2] avfilter/ebur128: fix relative threshold calculation for multiple contexts
Marton Balint
cus at passwd.hu
Wed Jan 25 02:57:25 EET 2017
Also disallow NULL contexts.
Fixes Coverity CID 1396273, 1396279.
Signed-off-by: Marton Balint <cus at passwd.hu>
---
libavfilter/ebur128.c | 40 +++++++++++++++++++---------------------
1 file changed, 19 insertions(+), 21 deletions(-)
diff --git a/libavfilter/ebur128.c b/libavfilter/ebur128.c
index 012df54..e064c59 100644
--- a/libavfilter/ebur128.c
+++ b/libavfilter/ebur128.c
@@ -519,49 +519,45 @@ FF_EBUR128_ADD_FRAMES(int)
FF_EBUR128_ADD_FRAMES(float)
FF_EBUR128_ADD_FRAMES(double)
-static int ebur128_calc_relative_threshold(FFEBUR128State * st,
+static void ebur128_sum_relative_threshold(FFEBUR128State * st,
size_t * above_thresh_counter,
double *relative_threshold)
{
size_t i;
- *relative_threshold = 0.0;
- *above_thresh_counter = 0;
for (i = 0; i < 1000; ++i) {
*relative_threshold += st->d->block_energy_histogram[i] *
histogram_energies[i];
*above_thresh_counter += st->d->block_energy_histogram[i];
}
+}
+static void ebur128_finalize_relative_threshold(size_t *above_thresh_counter,
+ double *relative_threshold)
+{
if (*above_thresh_counter != 0) {
*relative_threshold /= (double) *above_thresh_counter;
*relative_threshold *= RELATIVE_GATE_FACTOR;
}
-
- return 0;
}
static int ebur128_gated_loudness(FFEBUR128State ** sts, size_t size,
double *out)
{
double gated_loudness = 0.0;
- double relative_threshold;
- size_t above_thresh_counter;
+ double relative_threshold = 0.0;
+ size_t above_thresh_counter = 0;
size_t i, j, start_index;
- for (i = 0; i < size; i++) {
- if (sts[i]
- && (sts[i]->mode & FF_EBUR128_MODE_I) != FF_EBUR128_MODE_I) {
+ for (i = 0; i < size; i++)
+ if ((sts[i]->mode & FF_EBUR128_MODE_I) != FF_EBUR128_MODE_I)
return AVERROR(EINVAL);
- }
- }
- for (i = 0; i < size; i++) {
- if (!sts[i])
- continue;
- ebur128_calc_relative_threshold(sts[i], &above_thresh_counter,
+ for (i = 0; i < size; i++)
+ ebur128_sum_relative_threshold(sts[i], &above_thresh_counter,
+ &relative_threshold);
+ ebur128_finalize_relative_threshold(&above_thresh_counter,
&relative_threshold);
- }
if (!above_thresh_counter) {
*out = -HUGE_VAL;
return 0;
@@ -596,14 +592,16 @@ static int ebur128_gated_loudness(FFEBUR128State ** sts, size_t size,
int ff_ebur128_relative_threshold(FFEBUR128State * st, double *out)
{
- double relative_threshold;
- size_t above_thresh_counter;
+ double relative_threshold = 0.0;
+ size_t above_thresh_counter = 0;
if ((st->mode & FF_EBUR128_MODE_I) != FF_EBUR128_MODE_I)
return AVERROR(EINVAL);
- ebur128_calc_relative_threshold(st, &above_thresh_counter,
- &relative_threshold);
+ ebur128_sum_relative_threshold(st, &above_thresh_counter,
+ &relative_threshold);
+ ebur128_finalize_relative_threshold(&above_thresh_counter,
+ &relative_threshold);
if (!above_thresh_counter) {
*out = -70.0;
--
2.10.2
More information about the ffmpeg-devel
mailing list