From 1997e1f7b56966ca36ad4be0d1e45f29d61a70d6 Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Tue, 6 Dec 2011 16:58:30 -0800 Subject: [PATCH] timeside/decoder/sink.py: add condition values to prepare running gst mainloop in a thread --- timeside/decoder/sink.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/timeside/decoder/sink.py b/timeside/decoder/sink.py index c91c2a0..878811e 100644 --- a/timeside/decoder/sink.py +++ b/timeside/decoder/sink.py @@ -22,6 +22,9 @@ class TimesideSink(gst.BaseSink): ) def __init__(self, name): + import threading + self.cv = threading.Condition(threading.Lock()) + self.eos = 0 self.__gobject_init__() self.set_name(name) self.adapter = gst.Adapter() @@ -36,19 +39,35 @@ class TimesideSink(gst.BaseSink): super(gst.BaseSink, self).set_property(name, value) def do_render(self, buffer): + self.cv.acquire() self.adapter.push(buffer) + if self.adapter.available() == 0: self.eos = 1 + self.cv.notify() + self.cv.release() return gst.FLOW_OK + def on_eos(self): + self.cv.acquire() + self.eos = 1 + self.cv.notify() + self.cv.release() + def pull(self): + self.cv.acquire() + while not self.adapter.available(): + if self.eos: break + self.cv.wait() # TODO use signals blocksize = self.get_property('blocksize') remaining = self.adapter.available() if remaining == 0: - return None + ret = None if remaining >= blocksize: - return self.adapter.take_buffer(blocksize) + ret = self.adapter.take_buffer(blocksize) if remaining < blocksize and remaining > 0: - return self.adapter.take_buffer(remaining) + ret = self.adapter.take_buffer(remaining) + self.cv.release() + return ret gobject.type_register(TimesideSink) -- 2.39.5