[SCM] morituri/master: work around GStreamer bug in flacdec for really short files

js at users.alioth.debian.org js at users.alioth.debian.org
Sun Oct 19 20:10:02 UTC 2014


The following commit has been merged in the master branch:
commit 4e03a6e966e2cdff494457efa44ae368f86e016b
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Tue Feb 26 23:11:42 2013 +0100

    work around GStreamer bug in flacdec for really short files

diff --git a/morituri/common/checksum.py b/morituri/common/checksum.py
index 68bf524..dea979f 100644
--- a/morituri/common/checksum.py
+++ b/morituri/common/checksum.py
@@ -101,49 +101,65 @@ class ChecksumTask(log.Loggable, gstreamer.GstPipelineTask):
             appsink name=sink sync=False emit-signals=True
             ''' % gstreamer.quoteParse(self._path).encode('utf-8')
 
+    def _getSampleLength(self):
+        # get length in samples of file
+        sink = self.pipeline.get_by_name('sink')
+
+        self.debug('query duration')
+        try:
+            length, qformat = sink.query_duration(gst.FORMAT_DEFAULT)
+        except gst.QueryError, e:
+            self.setException(e)
+            return None
+
+        # wavparse 0.10.14 returns in bytes
+        if qformat == gst.FORMAT_BYTES:
+            self.debug('query returned in BYTES format')
+            length /= 4
+        self.debug('total sample length of file: %r', length)
+
+        return length
+
+
     def paused(self):
         sink = self.pipeline.get_by_name('sink')
 
-        if self._sampleLength < 0:
-            self.debug('query duration')
-            try:
-                length, qformat = sink.query_duration(gst.FORMAT_DEFAULT)
-            except gst.QueryError, e:
-                self.setException(e)
-                return
+        length = self._getSampleLength()
+        if length is None:
+            return
 
-            # wavparse 0.10.14 returns in bytes
-            if qformat == gst.FORMAT_BYTES:
-                self.debug('query returned in BYTES format')
-                length /= 4
-            self.debug('total sample length of file: %r', length)
+        if self._sampleLength < 0:
             self._sampleLength = length - self._sampleStart
             self.debug('sampleLength is queried as %d samples',
                 self._sampleLength)
         else:
             self.debug('sampleLength is known, and is %d samples' %
                 self._sampleLength)
+
         self._sampleEnd = self._sampleStart + self._sampleLength - 1
         self.debug('sampleEnd is sample %d' % self._sampleEnd)
 
         self.debug('event')
 
 
-        # the segment end only is respected since -good 0.10.14.1
-        event = gst.event_new_seek(1.0, gst.FORMAT_DEFAULT,
-            gst.SEEK_FLAG_FLUSH,
-            gst.SEEK_TYPE_SET, self._sampleStart,
-            gst.SEEK_TYPE_SET, self._sampleEnd + 1) # half-inclusive interval
-        self.debug('CRCing %r from sector %d to sector %d' % (
-            self._path,
-            self._sampleStart / common.SAMPLES_PER_FRAME,
-            (self._sampleEnd + 1) / common.SAMPLES_PER_FRAME))
-        # FIXME: sending it with sampleEnd set screws up the seek, we don't get
-        # everything for flac; fixed in recent -good
-        result = sink.send_event(event)
-        self.debug('event sent, result %r', result)
-        if not result:
-            self.error('Failed to select samples with GStreamer seek event')
+        if self._sampleStart == 0 and self._sampleEnd + 1 == length:
+            self.debug('No need to seek, crcing full file')
+        else:
+            # the segment end only is respected since -good 0.10.14.1
+            event = gst.event_new_seek(1.0, gst.FORMAT_DEFAULT,
+                gst.SEEK_FLAG_FLUSH,
+                gst.SEEK_TYPE_SET, self._sampleStart,
+                gst.SEEK_TYPE_SET, self._sampleEnd + 1) # half-inclusive
+            self.debug('CRCing %r from frame %d to frame %d (excluded)' % (
+                self._path,
+                self._sampleStart / common.SAMPLES_PER_FRAME,
+                (self._sampleEnd + 1) / common.SAMPLES_PER_FRAME))
+            # FIXME: sending it with sampleEnd set screws up the seek, we
+            # don't get # everything for flac; fixed in recent -good
+            result = sink.send_event(event)
+            self.debug('event sent, result %r', result)
+            if not result:
+                self.error('Failed to select samples with GStreamer seek event')
         sink.connect('new-buffer', self._new_buffer_cb)
         sink.connect('eos', self._eos_cb)
 
diff --git a/morituri/common/encode.py b/morituri/common/encode.py
index 1fbd2a1..4dfdc32 100644
--- a/morituri/common/encode.py
+++ b/morituri/common/encode.py
@@ -167,6 +167,7 @@ class EncodeTask(ctask.GstPipelineTask):
         self._inpath = inpath
         self._outpath = outpath
         self._taglist = taglist
+        self._length = 0 # in samples
 
         self._level = None
         self._peakdB = None
@@ -299,8 +300,10 @@ class EncodeTask(ctask.GstPipelineTask):
 
         if self._duration:
             self.warning('GStreamer level element did not send messages.')
-        # workaround for when the file is too short to have volume ?
-        # self.peak = 0.0
+            # workaround for when the file is too short to have volume ?
+            if self._length == common.SAMPLES_PER_FRAME:
+                self.warning('only one frame of audio, setting peak to 0.0')
+                self.peak = 0.0
 
 
 class TagReadTask(ctask.GstPipelineTask):

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list