[SCM] morituri/master: * examples/ARcue.py: * morituri/common/task.py: Use an adapter to assemble CD frames. Take into account special rules for first and last track. Mention some bugs. Remember to drag the lake from the task.

js at users.alioth.debian.org js at users.alioth.debian.org
Sun Oct 19 20:08:43 UTC 2014


The following commit has been merged in the master branch:
commit 18631a0fb680e6f3946adf28b80de53aae40bf12
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Thu Mar 26 14:23:25 2009 +0000

    	* examples/ARcue.py:
    	* morituri/common/task.py:
    	  Use an adapter to assemble CD frames.
    	  Take into account special rules for first and last track.
    	  Mention some bugs.
    	  Remember to drag the lake from the task.

diff --git a/ChangeLog b/ChangeLog
index b2109de..5aa94e9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-03-26  Thomas Vander Stichele  <thomas at apestaart dot org>
+
+	* examples/ARcue.py:
+	* morituri/common/task.py:
+	  Use an adapter to assemble CD frames.
+	  Take into account special rules for first and last track.
+	  Mention some bugs.
+	  Remember to drag the lake from the task.
+
 2009-03-22  Thomas Vander Stichele  <thomas at apestaart dot org>
 
 	* examples/ARcue.py:
diff --git a/examples/ARcue.py b/examples/ARcue.py
index 9a92caa..48e08da 100644
--- a/examples/ARcue.py
+++ b/examples/ARcue.py
@@ -33,7 +33,7 @@ def main(path):
     cuefile = cue.Cue(path)
     cuefile.parse()
 
-    for track in cuefile.tracks:
+    for trackIndex, track in enumerate(cuefile.tracks):
         index = track._indexes[1]
         length = cuefile.getTrackLength(track)
         file = index[1]
@@ -48,8 +48,10 @@ def main(path):
         for ext in ['wav', 'flac']:
             path = '%s.%s' % (noext, ext)
             if os.path.exists(path):
-                crctask = task.CRCAudioRipTask(path, offset * 588,
-                    length * 588)
+                print 'CRCing %s from CD frame %r for %r' % (path, offset, length)
+                crctask = task.CRCAudioRipTask(path,
+                    trackNumber=trackIndex + 1, trackCount=len(cuefile.tracks),
+                    frameStart=offset * 588, frameLength=length * 588)
 
         if not crctask:
             print 'error: path %s not found' % file.path
diff --git a/morituri/common/task.py b/morituri/common/task.py
index bd38272..fe6a9de 100644
--- a/morituri/common/task.py
+++ b/morituri/common/task.py
@@ -38,8 +38,8 @@ class Task(object):
     _listeners = None
 
     def debug(self, *args, **kwargs):
-        #print args, kwargs
-        #sys.stdout.flush()
+        print args, kwargs
+        sys.stdout.flush()
         pass
 
     def start(self):
@@ -91,6 +91,8 @@ class CRCTask(Task):
         self._bytes = 0
         self._first = None
         self._last = None
+        self._adapter = gst.Adapter()
+        self._lake = ''
 
         self.crc = None # result
 
@@ -99,6 +101,7 @@ class CRCTask(Task):
         self._pipeline = gst.parse_launch('''
             filesrc location="%s" !
             decodebin ! audio/x-raw-int !
+            queue !
             appsink name=sink sync=False emit-signals=True''' % self._path)
         self.debug('pausing')
         self._pipeline.set_state(gst.STATE_PAUSED)
@@ -109,11 +112,15 @@ class CRCTask(Task):
         sink = self._pipeline.get_by_name('sink')
 
         if self._frameLength < 0:
-            length, _ = sink.query_duration(gst.FORMAT_DEFAULT)
+            length, format = sink.query_duration(gst.FORMAT_DEFAULT)
+            # wavparse 0.10.14 returns in bytes
+            if format == gst.FORMAT_BYTES:
+                self.debug('query returned in BYTES format')
+                length /= 4
             print 'total length', length
             self._frameLength = length - self._frameStart
-            self.debug('frame length is', self._frameLength)
-            print 'frame length is', self._frameLength
+            self.debug('audio frame length is', self._frameLength)
+            print 'audio frame length is', self._frameLength
         self._frameEnd = self._frameStart + self._frameLength - 1
 
         self.debug('event')
@@ -147,14 +154,33 @@ class CRCTask(Task):
 
         assert len(buffer) % 4 == 0, "buffer is not a multiple of 4 bytes"
         
-        # update progress
-        frame = self._first + self._bytes / 4
-        framesDone = frame - self._frameStart
-        progress = float(framesDone) / float((self._frameLength))
-        self.setProgress(progress)
-
-        self._crc = self.do_crc_buffer(buffer, self._crc)
-        self._bytes += len(buffer)
+        # FIXME: gst-python 0.10.14.1 doesn't have adapter_peek/_take wrapped
+        # see http://bugzilla.gnome.org/show_bug.cgi?id=576505
+        self._adapter.push(buffer)
+
+        while self._adapter.available() >= 588 * 4:
+            # FIXME: in 0.10.14.1, take_buffer leaks a ref
+            buffer = self._adapter.take_buffer(588 * 4)
+
+#        self._lake += str(buffer)
+#        i = 0
+#        while len(self._lake) >= (i + 1) * 2532:
+#            block = self._lake[i * 2532:(i + 1) * 2532]
+
+            # update progress
+            frame = self._first + self._bytes / 4
+            framesDone = frame - self._frameStart
+            progress = float(framesDone) / float((self._frameLength))
+            self.setProgress(progress)
+
+            self._crc = self.do_crc_buffer(buffer, self._crc)
+            self._bytes += len(buffer)
+            print 'after crc', buffer.__grefcount__
+            sys.stdout.flush()
+            del buffer
+#            i += 1
+#        if i > 0:
+#            self._lake = self._lake[i * 2532:]
 
     def do_crc_buffer(self, buffer, crc):
         """
@@ -191,15 +217,42 @@ class CRC32Task(CRCTask):
         return zlib.crc32(buffer, crc)
 
 class CRCAudioRipTask(CRCTask):
+    def __init__(self, path, trackNumber, trackCount, frameStart=0, frameLength=-1):
+        CRCTask.__init__(self, path, frameStart, frameLength)
+        self._trackNumber = trackNumber
+        self._trackCount = trackCount
+        self._frameCounter = 0
+
     def do_crc_buffer(self, buffer, crc):
+        self._frameCounter += 1
+
+        # on first track ...
+        if self._trackNumber == 1:
+            # ... skip first 4 CD frames
+            if self._frameCounter <= 4:
+                self.debug('skipping frame %d' % self._frameCounter)
+                return crc
+            # ... on 5th frame, only use last value
+            elif self._frameCounter == 5:
+                values = struct.unpack("<I" % buffer[-4:])
+                crc += 588 * 5 * value
+                crc &= 0xFFFFFFFF
+ 
+        # on last track, skip last 6 CD frames
+        if self._trackNumber == self._trackCount:
+            if self._frameCounter >= self._frameLength + 6:
+                self.debug('skipping frame %d' % self._frameCounter)
+                return crc
+
+
         values = struct.unpack("<%dI" % (len(buffer) / 4), buffer)
         for i, value in enumerate(values):
             crc += (self._bytes / 4 + i + 1) * value
             crc &= 0xFFFFFFFF
             offset = self._bytes / 4 + i + 1
-            #if offset % 588 == 0:
-            #    print 'THOMAS: frame %d, offset %d, value %d, CRC %d' % (
-            #        offset / 588, offset, value, crc)
+            if offset % 588 == 0:
+                print 'THOMAS: frame %d, offset %d, value %d, CRC %d' % (
+                    offset / 588, offset, value, crc)
         return crc
 
 class SyncRunner:

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list