def message_rcvd(bus, message, pipeline, resolution): t = message.type if t == gst.MESSAGE_STATE_CHANGED: if message.src == pipeline: old, new, pending = message.parse_state_changed() if new == gst.STATE_PLAYING: run_check(pipeline, resolution) elif t == gst.MESSAGE_ERROR: gerror, debug = message.parse_error() # set pipeline state to NULL so worker does not consume # unnecessary resources pipeline.set_state(gst.STATE_NULL) resolution.errback( errors.GStreamerGstError(message.src, gerror, debug)) elif t == gst.MESSAGE_EOS: resolution.errback( errors.GStreamerError("Unexpected end of stream")) else: log.debug( 'check', 'message: %s: %s:' % (message.src.get_path_string(), message.type.value_nicks[1])) if message.structure: log.debug('check', 'message: %s' % message.structure.to_string()) else: log.debug('check', 'message: (no structure)') return True
def have_error(self, curstate, message): # if we have a state change defer that has not yet # fired, we should errback it changes = [gst.STATE_CHANGE_NULL_TO_READY, gst.STATE_CHANGE_READY_TO_PAUSED, gst.STATE_CHANGE_PAUSED_TO_PLAYING] extras = ((gst.STATE_PAUSED, gst.STATE_CHANGE_PLAYING_TO_PAUSED), (gst.STATE_READY, gst.STATE_CHANGE_PAUSED_TO_READY), (gst.STATE_NULL, gst.STATE_CHANGE_READY_TO_NULL)) for state, change in extras: if curstate <= state: changes.append(change) for change in changes: if change in self: self.log("We have an error, going to errback pending " "state change defers") gerror, debug = message.parse_error() for d in self[change]: d.errback(errors.GStreamerGstError( message.src, gerror, debug)) del self[change]