def _spawn(self, args): self.start_time = time.time() logger.debug(args) self._process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1, universal_newlines=True) self.state = "RUNNING" self._process.poll() while self._process.returncode is None and self.state != "ABORTED": next_line = self._process.stderr.readline() fps_idx = next_line.rfind('fps=') q_idx = next_line.rfind('q=') if fps_idx != -1 and q_idx != -1: self.fps = int(float(next_line[fps_idx + 4:q_idx].strip())) self._process.poll() self.stop_time = time.time() if self.state == "ABORTED": self._process.kill() else: if self._process.returncode == 0: self.state = "COMPLETED" else: self.state = "ERROR" PipelineManager.pipeline_finished() self._process = None
def stop_running_pipeline(self): self.pipeline.set_state(Gst.State.NULL) if self.state is "RUNNING": self.state = "ABORTED" logger.debug( "Setting Pipeline {id} State to ABORTED".format(id=self.id)) self.stop_time = time.time() PipelineManager.pipeline_finished()
def stop(self): if self._process: self.state = "ABORTED" self._process.kill() logger.debug("Setting Pipeline {id} State to ABORTED".format(id=self.id)) PipelineManager.pipeline_finished() if self.state is "QUEUED": PipelineManager.remove_from_queue(self.id) self.state = "ABORTED" logger.debug("Setting Pipeline {id} State to ABORTED and removing from the queue".format(id=self.id))
def shutdown_and_delete_pipeline(self, new_state): if not self.pipeline_is_in_terminal_state(): self.stop_time = time.time() logger.debug("Setting Pipeline {id} State to {next_state}".format( id=self.id, next_state=new_state)) self.state = new_state self.pipeline.set_state(Gst.State.NULL) del self.pipeline self.pipeline = None PipelineManager.pipeline_finished() elif self.state == "QUEUED": logger.debug( "Setting Pipeline {id} State to {next_state} and removing from queue" .format(id=self.id, next_state=new_state)) self.stop_time = time.time() self.state = new_state
def bus_call(bus, message, self): t = message.type if t == Gst.MessageType.EOS: logger.info("Pipeline {id} Ended".format(id=self.id)) self.pipeline.set_state(Gst.State.NULL) if self.state is "RUNNING": logger.debug("Setting Pipeline {id} State to COMPLETED".format( id=self.id)) self.state = "COMPLETED" self.stop_time = time.time() bus.remove_signal_watch() if (self.destination): del self.destination self.destination = None del self.pipeline self.pipeline = None PipelineManager.pipeline_finished() elif t == Gst.MessageType.ERROR: err, debug = message.parse_error() logger.error("Error on Pipeline {id}: {err}".format(id=id, err=err)) if (self.state is None) or (self.state is "RUNNING") or (self.state is "QUEUED"): logger.debug( "Setting Pipeline {id} State to ERROR".format(id=self.id)) self.stop_time = time.time() self.state = "ERROR" self.pipeline.set_state(Gst.State.NULL) self.stop_time = time.time() bus.remove_signal_watch() del self.pipeline self.pipeline = None PipelineManager.pipeline_finished() elif t == Gst.MessageType.STATE_CHANGED: old_state, new_state, pending_state = message.parse_state_changed() if message.src == self.pipeline: if old_state == Gst.State.PAUSED and new_state == Gst.State.PLAYING: if self.state is "QUEUED": logger.debug( "Setting Pipeline {id} State to RUNNING".format( id=self.id)) self.state = "RUNNING" else: pass return True
def stop(self): if self.pipeline is not None: self.pipeline.set_state(Gst.State.NULL) if self.state is "RUNNING": self.state = "ABORTED" logger.debug("Setting Pipeline {id} State to ABORTED".format(id=self.id)) self.stop_time = time.time() PipelineManager.pipeline_finished() if self.state is "QUEUED": self.state = "ABORTED" PipelineManager.remove_from_queue(self.id) logger.debug("Setting Pipeline {id} State to ABORTED and removing from the queue".format(id=self.id)) del self.pipeline self.pipeline = None return self.status()