def __init__(self, dev): self.caps = None self.dev = dev self.pipeline = Gst.Pipeline() self.bus = self.pipeline.get_bus() self.bus.add_signal_watch() self.bus.connect("message", self.on_message) self.src = VirtualDevice(dev.instream) self.vc1 = Gst.ElementFactory.make('videoconvert', None) self.video = PlateFinder(dev) self.sink = GstOutputStream(dev.outstream, split=False) self.pipeline.add(self.src) self.pipeline.add(self.vc1) self.pipeline.add(self.video) self.pipeline.add(self.sink) self.src.link(self.vc1) self.vc1.link(self.video) self.video.link(self.sink)
class Finder(object): def __init__(self, dev): self.caps = None self.dev = dev self.pipeline = Gst.Pipeline() self.bus = self.pipeline.get_bus() self.bus.add_signal_watch() self.bus.connect("message", self.on_message) self.src = VirtualDevice(dev.instream) self.vc1 = Gst.ElementFactory.make('videoconvert', None) self.video = PlateFinder(dev) self.sink = GstOutputStream(dev.outstream, split=False) self.pipeline.add(self.src) self.pipeline.add(self.vc1) self.pipeline.add(self.video) self.pipeline.add(self.sink) self.src.link(self.vc1) self.vc1.link(self.video) self.video.link(self.sink) def start(self): log.info("starting %s"%self.dev.name) self.pipeline.set_state(Gst.State.PLAYING) def stop(self): log.info("stopping %s"%self.dev.name) self.pipeline.set_state(gst.STATE_NULL) def restart(self): log.info('restarting %s'%self.dev.name) self.stop() self.start() def on_message(self, bus, message): t = message.type if t == Gst.MessageType.ERROR: err, debug = message.parse_error() error = str(err) if debug: error += " (%s)"%debug log.error("monitor '%s' received error; %s"%(self.dev, error)) sleep(10) self.restart() elif t == Gst.MessageType.EOS: log.warn('EOS') sleep(10) self.restart() elif t == Gst.MessageType.STATE_CHANGED: old, state, pending = message.parse_state_changed() if state == Gst.State.NULL: log.info("monitor '%s' main pipeline is stopped"% self.dev.name) elif state == Gst.State.PLAYING: if message.src == self.pipeline: log.info("'%s' cambio de %s a %s."%(self.dev.name, self.get_state(old), self.get_state(state))) elif t == Gst.MessageType.APPLICATION and message.has_name('video/x-raw'): s = message.get_structure() self.caps = s.to_string() if self.caps.endswith(';'): self.caps = self.caps[:-1] elif t == Gst.MessageType.INFO: e, d = message.parse_info() log.debug("{0}: {1}", e, d) elif t == Gst.MessageType.WARNING: e, d = message.parse_warning() error = str(e) if d: error += " (%s)"%d log.warn("monitor '%s' received warning; %s"%(self.dev, error)) sleep(10) self.restart() def stop(self): self.pipeline.set_state(Gst.State.NULL) def get_state(self, state): if state == Gst.State.PLAYING: return "playing" elif state == Gst.State.READY: return "ready" elif state == Gst.State.PAUSED: return "paused" elif state == Gst.State.VOID_PENDING: return "pending" else: return "null" def __del__(self): self.bus.remove_signal_watch()