[pitivi] previewers: Linearly compute values between known samples value



commit f4260dc0e58a259159224025ca6b03542c16c9de
Author: Thibault Saunier <thibault saunier osg samsung com>
Date:   Fri Feb 3 10:48:50 2017 -0300

    previewers: Linearly compute values between known samples value
    
    In the waveform previewer bin we get values from the level element
    for each N samples but in our dataset we use to fill unknowns with
    0s. It obviously leads to incoherency in the displayed waveforms.
    
    Instead of filling with 0 this patch computs values in
    between known values linearly. The dataset used to look like:
    
      [1, 0, 0, 0, 5]
    
    And now we have:
    
      [1, 2, 3, 4, 5]
    
    Reviewed-by: Alex Băluț <alexandru balut gmail com>
    Differential Revision: https://phabricator.freedesktop.org/D1639

 pitivi/timeline/previewers.py |   20 ++++++++++++++++----
 tests/test_previewers.py      |   36 +++++++++++++++++++++++++++++++++++-
 2 files changed, 51 insertions(+), 5 deletions(-)
---
diff --git a/pitivi/timeline/previewers.py b/pitivi/timeline/previewers.py
index c7113c5..34f99d3 100644
--- a/pitivi/timeline/previewers.py
+++ b/pitivi/timeline/previewers.py
@@ -194,6 +194,7 @@ class WaveformPreviewer(PreviewerBin):
         self.samples = []
         self.n_samples = 0
         self.duration = 0
+        self.prev_pos = 0
 
     def do_get_property(self, prop):
         if prop.name == 'uri':
@@ -239,9 +240,21 @@ class WaveformPreviewer(PreviewerBin):
                 for i, val in enumerate(peaks):
                     if val < 0:
                         val = 10 ** (val / 20) * 100
-                        self.peaks[i][pos] = val
                     else:
-                        self.peaks[i][pos] = self.peaks[i][pos - 1]
+                        val = self.peaks[i][pos - 1]
+
+                    # Linearly joins values between to known samples
+                    # values
+                    unknowns = range(self.prev_pos + 1, pos)
+                    if len(unknowns):
+                        prev_val = self.peaks[i][self.prev_pos]
+                        linear_const = (val - prev_val) / len(unknowns)
+                        for temppos in unknowns:
+                            self.peaks[i][temppos] = self.peaks[i][temppos - 1] + linear_const
+
+                    self.peaks[i][pos] = val
+
+                self.prev_pos = pos
 
         return Gst.Bin.do_post_message(self, message)
 
@@ -250,8 +263,7 @@ class WaveformPreviewer(PreviewerBin):
         if not self.passthrough and self.peaks:
             # Let's go mono.
             if len(self.peaks) > 1:
-                samples = (
-                    numpy.array(self.peaks[0]) + numpy.array(self.peaks[1])) / 2
+                samples = (numpy.array(self.peaks[0]) + numpy.array(self.peaks[1])) / 2
             else:
                 samples = numpy.array(self.peaks[0])
 
diff --git a/tests/test_previewers.py b/tests/test_previewers.py
index 7c3a1c7..76ec9fd 100644
--- a/tests/test_previewers.py
+++ b/tests/test_previewers.py
@@ -32,6 +32,40 @@ from tests import common
 from tests.test_media_library import BaseTestMediaLibrary
 
 
+SIMPSON_WAVFORM_VALUES = [
+    0.111346248025012, 0.53654970100915411, 0.96175315399329631, 1.3869566069774386,
+    1.8121600599615806, 2.237363512945723, 2.662566965929865, 3.0877704189140069,
+    3.5129738718981489, 3.9381773248822909, 3.9381773248822909, 3.8973170554102357,
+    3.8564567859381809, 3.8155965164661261, 3.7747362469940708, 3.7338759775220156,
+    3.6930157080499608, 3.652155438577906, 3.6112951691058508, 3.5704348996337956,
+    3.5704348996337956, 3.7087058267020998, 3.846976753770404, 3.9852476808387078,
+    4.1235186079070116, 4.2617895349753159, 4.4000604620436201, 4.5383313891119244,
+    4.6766023161802277, 4.8148732432485319, 4.8148732432485319, 4.7940769006009409,
+    4.7732805579533499, 4.7524842153057598, 4.7316878726581688, 4.7108915300105778,
+    4.6900951873629868, 4.6692988447153958, 4.6485025020678057, 4.6277061594202147,
+    4.6277061594202138, 4.6929619636223059, 4.7582177678243989, 4.8234735720264919,
+    4.8887293762285848, 4.9539851804306778, 5.0192409846327699, 5.0844967888348629,
+    5.1497525930369559, 5.215008397239048, 5.2150083972390462, 5.1875374713467179,
+    5.1600665454543897, 5.1325956195620606, 5.1051246936697314, 5.0776537677774032,
+    5.0501828418850749, 5.0227119159927458, 4.9952409901004167, 4.9677700642080884,
+    4.9677700642080893, 4.9202183773912216, 4.8726666905743539, 4.8251150037574861,
+    4.7775633169406184, 4.7300116301237507, 4.682459943306883, 4.6349082564900153,
+    4.5873565696731475, 4.5398048828562798, 4.5398048828562807, 4.6475893807495776,
+    4.7553738786428745, 4.8631583765361706, 4.9709428744294666, 5.0787273723227635,
+    5.1865118702160604, 5.2942963681093564, 5.4020808660026525, 5.5098653638959494,
+    5.5098653638959485, 5.4723412189420966, 5.4348170739882438, 5.397292929034391,
+    5.359768784080539, 5.3222446391266871, 5.2847204941728343, 5.2471963492189815,
+    5.2096722042651296, 5.1721480593112776, 5.1721480593112776, 5.1391459925110219,
+    5.106143925710767, 5.0731418589105122, 5.0401397921102564, 5.0071377253100007,
+    4.9741356585097458, 4.941133591709491, 4.9081315249092352, 4.8751294581089795,
+    4.8751294581089812, 4.7707539946969515, 4.66637853128492, 4.5620030678728902,
+    4.4576276044608587, 4.353252141048829, 4.2488766776367974, 4.1445012142247668,
+    4.0401257508127362, 3.9357502874007055, 3.9357502874007029, 3.9029687270533486,
+    3.8701871667059953, 3.837405606358641, 3.8046240460112877, 3.7718424856639334,
+    3.7390609253165801, 3.7062793649692258, 3.6734978046218725, 3.6407162442745182,
+    3.6407162442745191, 0.0]
+
+
 class TestPreviewers(BaseTestMediaLibrary):
 
     def testCreateThumbnailBin(self):
@@ -60,7 +94,7 @@ class TestPreviewers(BaseTestMediaLibrary):
         with open(wavefile, "rb") as fsamples:
             samples = pickle.load(fsamples)
 
-        self.assertTrue(bool(samples))
+        self.assertEqual(samples, SIMPSON_WAVFORM_VALUES)
 
 
 class TestThumbnailCache(TestCase):


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]