From e8d77ff6ef30e63cf499d6dd0beb115b72806f1d Mon Sep 17 00:00:00 2001 From: yomguy Date: Sat, 6 Oct 2012 00:13:41 +0200 Subject: [PATCH] mv gstutils to timeside.gstutils, mv GstEncoder to encoder.core --- timeside/decoder/core.py | 2 +- timeside/encoder/core.py | 58 ++++++++++++++++++++++++++++-- timeside/encoder/flac.py | 19 +++++----- timeside/encoder/m4a.py | 3 +- timeside/encoder/mp3.py | 4 +-- timeside/encoder/ogg.py | 14 ++++---- timeside/encoder/wav.py | 15 ++++---- timeside/encoder/webm.py | 3 +- timeside/{encoder => }/gstutils.py | 0 9 files changed, 88 insertions(+), 30 deletions(-) rename timeside/{encoder => }/gstutils.py (100%) diff --git a/timeside/decoder/core.py b/timeside/decoder/core.py index 6e52d44..5feae44 100644 --- a/timeside/decoder/core.py +++ b/timeside/decoder/core.py @@ -26,7 +26,7 @@ from timeside.core import Processor, implements, interfacedoc from timeside.api import IDecoder -from timeside.encoder.gstutils import * +from timeside.gstutils import * import Queue diff --git a/timeside/encoder/core.py b/timeside/encoder/core.py index cfac24c..dc2d68c 100644 --- a/timeside/encoder/core.py +++ b/timeside/encoder/core.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2007-2009 Guillaume Pellerin +# Copyright (c) 2012 Paul Brossier # This file is part of TimeSide. @@ -18,7 +18,61 @@ # You should have received a copy of the GNU General Public License # along with TimeSide. If not, see . -# Author: Guillaume Pellerin + +from timeside.core import Processor, implements, interfacedoc +from timeside.api import IEncoder +from timeside.gstutils import * + + +class GstEncoder(Processor): + + def release(self): + while self.bus.have_pending(): + self.bus.pop() + + def __del__(self): + self.release() + + def start_pipeline(self, channels, samplerate): + self.pipeline = gst.parse_launch(self.pipe) + # store a pointer to appsrc in our encoder object + self.src = self.pipeline.get_by_name('src') + # store a pointer to appsink in our encoder object + self.app = self.pipeline.get_by_name('app') + + srccaps = gst.Caps("""audio/x-raw-float, + endianness=(int)1234, + channels=(int)%s, + width=(int)32, + rate=(int)%d""" % (int(channels), int(samplerate))) + self.src.set_property("caps", srccaps) + self.src.set_property('emit-signals', True) + + self.bus = self.pipeline.get_bus() + self.bus.add_signal_watch() + self.bus.connect("message", self.on_message) + + # start pipeline + self.pipeline.set_state(gst.STATE_PLAYING) + + def on_message(self, bus, message): + t = message.type + if t == gst.MESSAGE_EOS: + self.pipeline.set_state(gst.STATE_NULL) + elif t == gst.MESSAGE_ERROR: + self.pipeline.set_state(gst.STATE_NULL) + err, debug = message.parse_error() + print "Error: %s" % err, debug + + def process(self, frames, eod=False): + self.eod = eod + buf = numpy_array_to_gst_buffer(frames) + self.src.emit('push-buffer', buf) + if self.eod: + self.src.emit('end-of-stream') + if self.streaming: + self.chunk = self.app.emit('pull-buffer') + return frames, eod from timeside.core import * import subprocess diff --git a/timeside/encoder/flac.py b/timeside/encoder/flac.py index aec60be..df22552 100644 --- a/timeside/encoder/flac.py +++ b/timeside/encoder/flac.py @@ -21,7 +21,8 @@ from timeside.core import Processor, implements, interfacedoc from timeside.api import IEncoder -from timeside.encoder.gstutils import * +from timeside.gstutils import * + class FlacEncoder(GstEncoder): """ gstreamer-based FLAC encoder """ @@ -33,31 +34,31 @@ class FlacEncoder(GstEncoder): else: self.filename = None self.streaming = streaming - + if not self.filename and not self.streaming: raise Exception('Must give an output') - + self.eod = False @interfacedoc def setup(self, channels=None, samplerate=None, nframes=None): super(FlacEncoder, self).setup(channels, samplerate, nframes) # TODO open file for writing - # the output data format we want - self.pipe = ''' appsrc name=src ! audioconvert + # the output data format we want + self.pipe = ''' appsrc name=src ! audioconvert ! flacenc ''' - - if self.filename and self.streaming: + + if self.filename and self.streaming: self.pipe += ''' ! tee name=t ! queue ! filesink location=%s t. ! queue ! appsink name=app sync=False ''' % self.filename - + elif self.filename : self.pipe += '! filesink location=%s ' % self.filename else: self.pipe += '! appsink name=app sync=False ' - + self.start_pipeline(channels, samplerate) @staticmethod diff --git a/timeside/encoder/m4a.py b/timeside/encoder/m4a.py index 357cd48..d2c07ef 100644 --- a/timeside/encoder/m4a.py +++ b/timeside/encoder/m4a.py @@ -21,7 +21,8 @@ from timeside.core import Processor, implements, interfacedoc from timeside.api import IEncoder -from timeside.encoder.gstutils import * +from timeside.gstutils import * + class AacEncoder(GstEncoder): """ gstreamer-based AAC encoder """ diff --git a/timeside/encoder/mp3.py b/timeside/encoder/mp3.py index c59cc57..d549ee8 100644 --- a/timeside/encoder/mp3.py +++ b/timeside/encoder/mp3.py @@ -23,7 +23,7 @@ from timeside.core import Processor, implements, interfacedoc from timeside.api import IEncoder -from timeside.encoder.gstutils import * +from timeside.gstutils import * import mutagen @@ -64,7 +64,7 @@ class Mp3Encoder(GstEncoder): self.pipe += '! queue ! appsink name=app sync=False ' self.start_pipeline(channels, samplerate) - + @staticmethod @interfacedoc def id(): diff --git a/timeside/encoder/ogg.py b/timeside/encoder/ogg.py index 113eaba..c45c8b0 100644 --- a/timeside/encoder/ogg.py +++ b/timeside/encoder/ogg.py @@ -21,7 +21,7 @@ from timeside.core import Processor, implements, interfacedoc from timeside.api import IEncoder -from timeside.encoder.gstutils import * +from timeside.gstutils import * class VorbisEncoder(GstEncoder): """ gstreamer-based vorbis encoder """ @@ -33,19 +33,19 @@ class VorbisEncoder(GstEncoder): else: self.filename = None self.streaming = streaming - + if not self.filename and not self.streaming: raise Exception('Must give an output') - + self.eod = False @interfacedoc def setup(self, channels=None, samplerate=None, nframes=None): super(VorbisEncoder, self).setup(channels, samplerate, nframes) # TODO open file for writing - # the output data format we want + # the output data format we want self.pipe = ''' appsrc name=src - ! audioconvert + ! audioconvert ! vorbisenc ! oggmux ''' @@ -54,12 +54,12 @@ class VorbisEncoder(GstEncoder): ! queue ! filesink location=%s t. ! queue ! appsink name=app sync=False ''' % self.filename - + elif self.filename : self.pipe += '! filesink async=True location=%s ' % self.filename else: self.pipe += '! appsink name=app sync=False ' - + # start pipeline self.start_pipeline(channels, samplerate) diff --git a/timeside/encoder/wav.py b/timeside/encoder/wav.py index 239d238..d088841 100644 --- a/timeside/encoder/wav.py +++ b/timeside/encoder/wav.py @@ -22,7 +22,8 @@ from timeside.core import Processor, implements, interfacedoc from timeside.api import IEncoder -from timeside.encoder.gstutils import * +from timeside.gstutils import * + class WavEncoder(GstEncoder): """ gstreamer-based encoder """ @@ -34,19 +35,19 @@ class WavEncoder(GstEncoder): else: self.filename = None self.streaming = streaming - + if not self.filename and not self.streaming: raise Exception('Must give an output') self.eod = False - + @interfacedoc def setup(self, channels=None, samplerate=None, nframes=None): super(WavEncoder, self).setup(channels, samplerate, nframes) # TODO open file for writing # the output data format we want self.pipe = ''' appsrc name=src - ! audioconvert + ! audioconvert ! wavenc ''' if self.filename and self.streaming: @@ -54,15 +55,15 @@ class WavEncoder(GstEncoder): ! queue ! filesink location=%s t. ! queue ! appsink name=app sync=False ''' % self.filename - + elif self.filename : self.pipe += '! filesink location=%s ' % self.filename else: self.pipe += '! appsink name=app sync=False' - + # start pipeline self.start_pipeline(channels, samplerate) - + @staticmethod @interfacedoc def id(): diff --git a/timeside/encoder/webm.py b/timeside/encoder/webm.py index c3aab8b..a162482 100644 --- a/timeside/encoder/webm.py +++ b/timeside/encoder/webm.py @@ -21,7 +21,8 @@ from timeside.core import Processor, implements, interfacedoc from timeside.api import IEncoder -from timeside.encoder.gstutils import * +from timeside.gstutils import * + class WebMEncoder(GstEncoder): """ gstreamer-based webm encoder and muxer """ diff --git a/timeside/encoder/gstutils.py b/timeside/gstutils.py similarity index 100% rename from timeside/encoder/gstutils.py rename to timeside/gstutils.py -- 2.39.5