]> git.parisson.com Git - timeside.git/commitdiff
Encoder: Webm -> add video encoding support + test
authorThomas Fillon <thomas@parisson.com>
Thu, 28 Nov 2013 16:38:51 +0000 (17:38 +0100)
committerThomas Fillon <thomas@parisson.com>
Thu, 28 Nov 2013 16:39:28 +0000 (17:39 +0100)
tests/test_encoding.py
timeside/core.py
timeside/encoder/webm.py

index 199e6184c4bbc3688c381cfa03e33d20359168bf..b8b30a8b29f5a936d8d4833720555ae9d62846de 100755 (executable)
@@ -33,7 +33,7 @@ class TestEncoding(unittest.TestCase):
         self.test_channels = True
 
         # Source
-        self.source_duration = 6.
+        self.source_duration = 10.
 
     def testWav(self):
         "Test wav encoding"
@@ -45,7 +45,7 @@ class TestEncoding(unittest.TestCase):
         "Test vorbis encoding"
         from timeside.encoder.ogg import VorbisEncoder
         self.encoder_function = VorbisEncoder
-        self.delta = 0.2
+        self.delta = 0.3
 
     def testMp3(self):
         "Test mp3 encoding"
@@ -58,7 +58,7 @@ class TestEncoding(unittest.TestCase):
         from timeside.encoder.m4a import AacEncoder
         self.encoder_function = AacEncoder
         self.test_channels = False
-        self.delta = 0.2
+        self.delta = 0.3
 
     def testFlac(self):
         "Test flac encoding"
@@ -67,11 +67,24 @@ class TestEncoding(unittest.TestCase):
         self.delta = 0
 
     def testWebm(self):
-        "Test webm encoding"
+        "Test webm encoding, audio only"
+        from timeside.encoder.webm import WebMEncoder
+        self.encoder_function = WebMEncoder
+        self.test_duration = False  # webmmux encoder with streamable=true
+                                    # does not return a valid duration
+
+    def testWebmVideo(self):
+        "Test webm encoding, video"
         from timeside.encoder.webm import WebMEncoder
         self.encoder_function = WebMEncoder
         self.test_duration = False  # webmmux encoder with streamable=true
                                     # does not return a valid duration
+        file_extension = '.' + self.encoder_function.file_extension()
+        self.sink = tmp_file_sink(prefix=self.__class__.__name__,
+                                      suffix=file_extension)
+        self.encoder = self.encoder_function(self.sink,
+                                             overwrite=self.overwrite,
+                                             video=True)
 
     def tearDown(self):
 
@@ -84,8 +97,10 @@ class TestEncoding(unittest.TestCase):
         if not hasattr(self, 'sink'):
             self.sink = tmp_file_sink(prefix=self.__class__.__name__,
                                       suffix=file_extension)
-        self.encoder = self.encoder_function(self.sink,
-                                             overwrite=self.overwrite)
+
+        if not hasattr(self, 'encoder'):
+            self.encoder = self.encoder_function(self.sink,
+                                                 overwrite=self.overwrite)
 
         # Run Pipe
         (decoder | self.encoder).run()
index aee97ac28ecf8f43927943538c3cca513b84672f..6cb0131448155787cc1c9683756a9d566ec9f7fa 100644 (file)
@@ -289,11 +289,11 @@ class ProcessPipe(object):
 
         # setup/reset processors and configure properties throughout the pipe
         for item in items:
+            item.source_mediainfo = source.mediainfo()
             item.setup(channels=last.channels(),
                        samplerate=last.samplerate(),
                        blocksize=last.blocksize(),
                        totalframes=last.totalframes())
-            item.source_mediainfo = source.mediainfo()
             last = item
 
         # now stream audio data along the pipe
index 7ee701089f7c7907a23a746cbd39eeb741861e94..ba6c9eef68e0eca8ee2ea73cfa5898695a17bafc 100644 (file)
@@ -29,20 +29,22 @@ class WebMEncoder(GstEncoder):
     """ gstreamer-based webm encoder and muxer """
     implements(IEncoder)
 
-    def __init__(self, output, streaming = False, overwrite = False):
+    def __init__(self, output, streaming=False, overwrite=False, video=False):
         super(WebMEncoder, self).__init__(output, streaming, overwrite)
-        self.video = False
+        self.video = video
 
     @interfacedoc
     def setup(self, channels=None, samplerate=None, blocksize=None, totalframes=None):
         super(WebMEncoder, self).setup(channels, samplerate, blocksize, totalframes)
-
+        from numpy import ceil
+        framerate = 30
+        num_buffers =  ceil(self.mediainfo()['duration'] *
+                            framerate).astype(int)
         if self.video:
-            self.pipe = '''videotestsrc pattern=black ! ffmpegcolorspace
-                  ! queue ! vp8enc speed=2 threads=4 quality=9.0 ! queue ! mux.
-                  appsrc name=src ! queue ! audioconvert ! vorbisenc quality=0.9 ! queue ! mux.
-                  webmmux streamable=true name=mux
-                  '''
+            self.pipe = '''appsrc name=src ! queue ! audioconvert ! vorbisenc quality=0.9 ! queue ! mux.
+                        videotestsrc pattern=black num_buffers=%d ! ffmpegcolorspace ! queue ! vp8enc speed=2 threads=4 quality=9.0 ! queue ! mux.
+                        webmmux streamable=true name=mux
+                        ''' % num_buffers
         else:
             self.pipe = '''
                   appsrc name=src ! queue ! audioconvert ! vorbisenc quality=0.9 ! queue !