Hello community,

here is the log from the commit of package libebur128 for openSUSE:Factory 
checked in at 2018-02-26 23:27:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libebur128 (Old)
 and      /work/SRC/openSUSE:Factory/.libebur128.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libebur128"

Mon Feb 26 23:27:27 2018 rev:3 rq:580339 version:1.2.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/libebur128/libebur128.changes    2018-01-10 
23:38:17.931209760 +0100
+++ /work/SRC/openSUSE:Factory/.libebur128.new/libebur128.changes       
2018-02-26 23:27:36.921018400 +0100
@@ -1,0 +2,9 @@
+Mon Feb 26 19:11:35 UTC 2018 - [email protected]
+
+- Update to 1.2.4:
+  * Fix broken ebur128_loudness_global_multiple() function
+  * Add more tests
+  * Fix some minor build issues
+  * Fix uninitialized memory in ebur128_init()
+
+-------------------------------------------------------------------

Old:
----
  libebur128-1.2.3.tar.gz

New:
----
  libebur128-1.2.4.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libebur128.spec ++++++
--- /var/tmp/diff_new_pack.a2ttoJ/_old  2018-02-26 23:27:37.612993512 +0100
+++ /var/tmp/diff_new_pack.a2ttoJ/_new  2018-02-26 23:27:37.612993512 +0100
@@ -18,7 +18,7 @@
 
 %define sover   1
 Name:           libebur128
-Version:        1.2.3
+Version:        1.2.4
 Release:        0
 Summary:        A library implementing the EBU R128 loudness standard
 License:        MIT

++++++ libebur128-1.2.3.tar.gz -> libebur128-1.2.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libebur128-1.2.3/CMakeLists.txt 
new/libebur128-1.2.4/CMakeLists.txt
--- old/libebur128-1.2.3/CMakeLists.txt 2017-11-16 20:10:58.000000000 +0100
+++ new/libebur128-1.2.4/CMakeLists.txt 2018-01-28 15:46:10.000000000 +0100
@@ -1,9 +1,9 @@
 cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
 project(libebur128 C)
 
-list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
-set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
-set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
+set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
 
 include(utils)
 include(GNUInstallDirs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libebur128-1.2.3/README.md 
new/libebur128-1.2.4/README.md
--- old/libebur128-1.2.3/README.md      2017-11-16 20:10:58.000000000 +0100
+++ new/libebur128-1.2.4/README.md      2018-01-28 15:46:10.000000000 +0100
@@ -12,6 +12,15 @@
 News
 ----
 
+v1.2.4 released:
+ * Fix broken `ebur128_loudness_global_multiple()` function. Since v1.1.0 it
+   calculated the relative threshold just from the last state given to it,
+   resulting in wrong values.
+ * More tests
+ * Fix some minor build issues
+ * Fix uninitialized memory in `ebur128_init()`, possibly resulting in wrong
+   values
+
 v1.2.3 released:
  * Fix uninitialized memory access during true peak scanning (bug #72)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libebur128-1.2.3/ebur128/CMakeLists.txt 
new/libebur128-1.2.4/ebur128/CMakeLists.txt
--- old/libebur128-1.2.3/ebur128/CMakeLists.txt 2017-11-16 20:10:58.000000000 
+0100
+++ new/libebur128-1.2.4/ebur128/CMakeLists.txt 2018-01-28 15:46:10.000000000 
+0100
@@ -23,12 +23,14 @@
 
 
 set(EBUR128_VERSION_MAJOR 1)
-set(EBUR128_VERSION 1.2.3)
+set(EBUR128_VERSION 1.2.4)
 
 #### static
 if(BUILD_STATIC_LIBS)
   add_library(ebur128_static STATIC ebur128.c)
-  set_property(TARGET ebur128_static PROPERTY OUTPUT_NAME ebur128)
+  if(NOT MSVC)
+    set_property(TARGET ebur128_static PROPERTY OUTPUT_NAME ebur128)
+  endif()
 endif()
 
 if(WITH_STATIC_PIC)
@@ -47,8 +49,9 @@
     SOVERSION ${EBUR128_VERSION_MAJOR}
     VERSION ${EBUR128_VERSION})
 
-if(UNIX)
-  target_link_libraries(ebur128 m)
+find_library(MATH_LIBRARY m)
+if(MATH_LIBRARY)
+  target_link_libraries(ebur128 ${MATH_LIBRARY})
 endif()
 
 set(EBUR128_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libebur128-1.2.3/ebur128/ebur128.c 
new/libebur128-1.2.4/ebur128/ebur128.c
--- old/libebur128-1.2.3/ebur128/ebur128.c      2017-11-16 20:10:58.000000000 
+0100
+++ new/libebur128-1.2.4/ebur128/ebur128.c      2018-01-28 15:46:10.000000000 
+0100
@@ -404,7 +404,7 @@
                                        sizeof(double));
   CHECK_ERROR(!st->d->audio_data, 0, free_true_peak)
   for (j = 0; j < st->d->audio_data_frames * st->channels; ++j) {
-    st->d->audio_data[i] = 0.0;
+    st->d->audio_data[j] = 0.0;
   }
 
   ebur128_init_filter(st);
@@ -955,8 +955,6 @@
                                            double* relative_threshold) {
   struct ebur128_dq_entry* it;
   size_t i;
-  *relative_threshold = 0.0;
-  *above_thresh_counter = 0;
 
   if (st->d->use_histogram) {
     for (i = 0; i < 1000; ++i) {
@@ -971,11 +969,6 @@
     }
   }
 
-  if (*above_thresh_counter != 0) {
-    *relative_threshold /= (double) *above_thresh_counter;
-    *relative_threshold *= relative_gate_factor;
-  }
-
   return EBUR128_SUCCESS;
 }
 
@@ -1004,6 +997,9 @@
     return EBUR128_SUCCESS;
   }
 
+  relative_threshold /= (double)above_thresh_counter;
+  relative_threshold *= relative_gate_factor;
+
   above_thresh_counter = 0;
   if (relative_threshold < histogram_energy_boundaries[0]) {
     start_index = 0;
@@ -1042,8 +1038,8 @@
 }
 
 int ebur128_relative_threshold(ebur128_state* 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 & EBUR128_MODE_I) != EBUR128_MODE_I) {
     return EBUR128_ERROR_INVALID_MODE;
@@ -1056,6 +1052,9 @@
       return EBUR128_SUCCESS;
   }
 
+  relative_threshold /= (double)above_thresh_counter;
+  relative_threshold *= relative_gate_factor;
+
   *out = ebur128_energy_to_loudness(relative_threshold);
   return EBUR128_SUCCESS;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libebur128-1.2.3/ebur128/ebur128.h 
new/libebur128-1.2.4/ebur128/ebur128.h
--- old/libebur128-1.2.3/ebur128/ebur128.h      2017-11-16 20:10:58.000000000 
+0100
+++ new/libebur128-1.2.4/ebur128/ebur128.h      2018-01-28 15:46:10.000000000 
+0100
@@ -14,7 +14,7 @@
 
 #define EBUR128_VERSION_MAJOR 1
 #define EBUR128_VERSION_MINOR 2
-#define EBUR128_VERSION_PATCH 3
+#define EBUR128_VERSION_PATCH 4
 
 #include <stddef.h>       /* for size_t */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libebur128-1.2.3/test/tests.c 
new/libebur128-1.2.4/test/tests.c
--- old/libebur128-1.2.3/test/tests.c   2017-11-16 20:10:58.000000000 +0100
+++ new/libebur128-1.2.4/test/tests.c   2018-01-28 15:46:10.000000000 +0100
@@ -7,7 +7,7 @@
 
 #include "ebur128.h"
 
-double test_global_loudness(const char* filename) {
+double test_global_loudness(const char* filename, ebur128_state** out_state) {
   SF_INFO file_info;
   SNDFILE* file;
   sf_count_t nr_frames_read;
@@ -40,8 +40,7 @@
 
   ebur128_loudness_global(st, &gated_loudness);
 
-  /* clean up */
-  ebur128_destroy(&st);
+  *out_state = st;
 
   free(buffer);
   buffer = NULL;
@@ -144,6 +143,108 @@
   return 20 * log10(max_true_peak);
 }
 
+double test_max_momentary(const char* filename) {
+  SF_INFO file_info;
+  SNDFILE* file;
+  sf_count_t nr_frames_read;
+  sf_count_t total_frames_read;
+  ebur128_state* st = NULL;
+  double momentary;
+  double max_momentary = -HUGE_VAL;
+  double* buffer;
+
+  memset(&file_info, '\0', sizeof(file_info));
+  file = sf_open(filename, SFM_READ, &file_info);
+  if (!file) {
+    fprintf(stderr, "Could not open file %s!\n", filename);
+    return 0.0;
+  }
+  st = ebur128_init((unsigned) file_info.channels,
+                    (unsigned) file_info.samplerate,
+                    EBUR128_MODE_M);
+  if (file_info.channels == 5) {
+    ebur128_set_channel(st, 0, EBUR128_LEFT);
+    ebur128_set_channel(st, 1, EBUR128_RIGHT);
+    ebur128_set_channel(st, 2, EBUR128_CENTER);
+    ebur128_set_channel(st, 3, EBUR128_LEFT_SURROUND);
+    ebur128_set_channel(st, 4, EBUR128_RIGHT_SURROUND);
+  }
+  /* 10 ms buffer/ 100 Hz refresh rate as 10 Hz refresh rate fails on several 
tests */
+  buffer = (double*) malloc(st->samplerate / 100 * st->channels * 
sizeof(double));
+  while ((nr_frames_read = sf_readf_double(file, buffer,
+                                           (sf_count_t) st->samplerate / 
100))) {
+    ebur128_add_frames_double(st, buffer, (size_t) nr_frames_read);
+    total_frames_read += nr_frames_read;
+    /* invalid results before the first 400 ms */
+    if (total_frames_read >= 4 * st->samplerate / 10) {
+      ebur128_loudness_momentary(st, &momentary);
+      if (momentary > max_momentary)
+        max_momentary = momentary;
+    }
+  }
+
+  /* clean up */
+  ebur128_destroy(&st);
+
+  free(buffer);
+  buffer = NULL;
+  if (sf_close(file)) {
+    fprintf(stderr, "Could not close input file!\n");
+  }
+  return max_momentary;
+}
+
+double test_max_shortterm(const char* filename) {
+  SF_INFO file_info;
+  SNDFILE* file;
+  sf_count_t nr_frames_read;
+  sf_count_t total_frames_read;
+  ebur128_state* st = NULL;
+  double shortterm;
+  double max_shortterm = -HUGE_VAL;
+  double* buffer;
+
+  memset(&file_info, '\0', sizeof(file_info));
+  file = sf_open(filename, SFM_READ, &file_info);
+  if (!file) {
+    fprintf(stderr, "Could not open file %s!\n", filename);
+    return 0.0;
+  }
+  st = ebur128_init((unsigned) file_info.channels,
+                    (unsigned) file_info.samplerate,
+                    EBUR128_MODE_S);
+  if (file_info.channels == 5) {
+    ebur128_set_channel(st, 0, EBUR128_LEFT);
+    ebur128_set_channel(st, 1, EBUR128_RIGHT);
+    ebur128_set_channel(st, 2, EBUR128_CENTER);
+    ebur128_set_channel(st, 3, EBUR128_LEFT_SURROUND);
+    ebur128_set_channel(st, 4, EBUR128_RIGHT_SURROUND);
+  }
+  /* 100 ms buffer / 10 Hz refresh rate */
+  buffer = (double*) malloc(st->samplerate / 10 * st->channels * 
sizeof(double));
+  while ((nr_frames_read = sf_readf_double(file, buffer,
+                                           (sf_count_t) st->samplerate / 10))) 
{
+    ebur128_add_frames_double(st, buffer, (size_t) nr_frames_read);
+    total_frames_read += nr_frames_read;
+    /* invalid results before the first 3 s */
+    if (total_frames_read >= 3 * st->samplerate) {
+      ebur128_loudness_shortterm(st, &shortterm);
+      if (shortterm > max_shortterm)
+        max_shortterm = shortterm;
+    }
+  }
+
+  /* clean up */
+  ebur128_destroy(&st);
+
+  free(buffer);
+  buffer = NULL;
+  if (sf_close(file)) {
+    fprintf(stderr, "Could not close input file!\n");
+  }
+  return max_shortterm;
+}
+
 double gr[] = {-23.0,
                -33.0,
                -23.0,
@@ -178,13 +279,15 @@
 
 int main() {
   double result;
+  ebur128_state* states[9] = {0};
+  int i;
 
   fprintf(stderr, "Note: the tests do not have to pass with EXACT_PASSED.\n"
                   "Passing these tests does not mean that the library is "
                   "100%% EBU R 128 compliant!\n\n");
 
-#define TEST_GLOBAL_LOUDNESS(filename, i)                                      
\
-  result = test_global_loudness(filename);                                     
\
+#define TEST_GLOBAL_LOUDNESS(filename, i, state_array)                         
\
+  result = test_global_loudness(filename, &state_array[i]);                    
\
   if (result == result) {                                                      
\
     printf("%s, %s - %s: %1.16e\n",                                            
\
        (result <= gr[i] + 0.1 && result >= gr[i] - 0.1) ? "PASSED" : "FAILED", 
\
@@ -192,16 +295,40 @@
        filename, result);                                                      
\
   }
 
-  TEST_GLOBAL_LOUDNESS("seq-3341-1-16bit.wav", 0)
-  TEST_GLOBAL_LOUDNESS("seq-3341-2-16bit.wav", 1)
-  TEST_GLOBAL_LOUDNESS("seq-3341-3-16bit-v02.wav", 2)
-  TEST_GLOBAL_LOUDNESS("seq-3341-4-16bit-v02.wav", 3)
-  TEST_GLOBAL_LOUDNESS("seq-3341-5-16bit-v02.wav", 4)
-  TEST_GLOBAL_LOUDNESS("seq-3341-6-5channels-16bit.wav", 5)
-  TEST_GLOBAL_LOUDNESS("seq-3341-6-6channels-WAVEEX-16bit.wav", 6)
-  TEST_GLOBAL_LOUDNESS("seq-3341-7_seq-3342-5-24bit.wav", 7)
-  TEST_GLOBAL_LOUDNESS("seq-3341-2011-8_seq-3342-6-24bit-v02.wav", 8)
+  TEST_GLOBAL_LOUDNESS("seq-3341-1-16bit.wav", 0, states)
+  TEST_GLOBAL_LOUDNESS("seq-3341-2-16bit.wav", 1, states)
+  TEST_GLOBAL_LOUDNESS("seq-3341-3-16bit-v02.wav", 2, states)
+  TEST_GLOBAL_LOUDNESS("seq-3341-4-16bit-v02.wav", 3, states)
+  TEST_GLOBAL_LOUDNESS("seq-3341-5-16bit-v02.wav", 4, states)
+  TEST_GLOBAL_LOUDNESS("seq-3341-6-5channels-16bit.wav", 5, states)
+  TEST_GLOBAL_LOUDNESS("seq-3341-6-6channels-WAVEEX-16bit.wav", 6, states)
+  TEST_GLOBAL_LOUDNESS("seq-3341-7_seq-3342-5-24bit.wav", 7, states)
+  TEST_GLOBAL_LOUDNESS("seq-3341-2011-8_seq-3342-6-24bit-v02.wav", 8, states)
+
+  /* Move some states around, to make the bug where
+   * ebur128_loudness_global_multiple() calculated the relative threshold just
+   * from the last state easier to reproduce. Don't care for leaks, etc. */
+  states[5] = states[0];
+  states[0] = states[8];
+
+  for (i = 0; i < 6; ++i) {
+    if (states[i] == NULL) {
+      printf("FAILED, ebur128_loudness_global_multiple needs all states of 
seq-3341-1 until seq-3341-5 (inclusive) and 
seq-3341-2011-8_seq-3342-6-24bit\n");
+      goto after_multiple_test;
+    }
+  }
+
+  result = 0;
+  ebur128_loudness_global_multiple(states, 6, &result);
+  fprintf(stderr, "multiple output: %f\n", result);
+  if (result >= -23.18758 - 0.05 && result <= -23.18758 + 0.05) {
+    printf("PASSED, ebur128_loudness_global_multiple\n");
+  } else {
+    printf("FAILED, ebur128_loudness_global_multiple\n");
+  }
 
+after_multiple_test:
+  ;
 
 #define TEST_LRA(filename, i)                                                  
\
   result = test_loudness_range(filename);                                      
\
@@ -237,5 +364,63 @@
   TEST_MAX_TRUE_PEAK("seq-3341-22-24bit.wav.wav", 0.0)
   TEST_MAX_TRUE_PEAK("seq-3341-23-24bit.wav.wav", 0.0)
 
+#define TEST_MAX_MOMENTARY(filename, expected)                                \
+  result = test_max_momentary(filename);                                       
   \
+  if (result == result) {                                                     \
+    printf("%s - %s: %1.16e\n",                                              \
+      (result <= expected + 0.1 && result >= expected - 0.1) ? "PASSED" : 
"FAILED",  \
+      filename, result);                                                      \
+  }
+  
+  TEST_MAX_MOMENTARY("seq-3341-13-1-24bit.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-2-24bit.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-3-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-4-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-5-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-6-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-7-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-8-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-9-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-10-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-11-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-12-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-13-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-14-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-15-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-16-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-17-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-18-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-19-24bit.wav.wav", -23.0)
+  TEST_MAX_MOMENTARY("seq-3341-13-20-24bit.wav.wav", -23.0)
+
+#define TEST_MAX_SHORTTERM(filename, expected)                                \
+  result = test_max_shortterm(filename);                                       
   \
+  if (result == result) {                                                     \
+    printf("%s - %s: %1.16e\n",                                              \
+      (result <= expected + 0.1 && result >= expected - 0.1) ? "PASSED" : 
"FAILED",  \
+      filename, result);                                                      \
+  }
+  
+  TEST_MAX_SHORTTERM("seq-3341-10-1-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-2-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-3-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-4-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-5-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-6-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-7-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-8-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-9-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-10-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-11-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-12-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-13-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-14-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-15-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-16-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-17-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-18-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-19-24bit.wav", -23.0)
+  TEST_MAX_SHORTTERM("seq-3341-10-20-24bit.wav", -23.0)
+  
   return 0;
 }


Reply via email to