=== modified file 'elisa-plugins/elisa/plugins/poblesec/player_video.py' --- elisa-plugins/elisa/plugins/poblesec/player_video.py 2009-08-27 17:26:35 +0000 +++ elisa-plugins/elisa/plugins/poblesec/player_video.py 2009-08-28 08:36:38 +0000 @@ -830,6 +819,7 @@ #self.pipeline.set_property('video-sink', self.pgm_sink) self.status = self.STOPPED + self.target_state = self.STOPPED self.last_error = None self.filename = None self.image = None @@ -844,6 +834,7 @@ self.set_playlist(PlaylistModel()) self._video_size = None + self._cbuffering = -1 # These are used to keep track of what interesting streams are # available @@ -918,15 +909,30 @@ def _message_eos_cb(self, bus, message): self.pipeline.set_state(gst.STATE_READY) self.status = self.STOPPED + self.target_state = self.STOPPED self.emit('status-changed', self.status) self.play_next() def _message_buffering_cb(self, bus, message): - if self.status == self.BUFFERING: - # yet another buffering message. ignore it - return - self.status = self.BUFFERING - self.emit('status-changed', self.status) + percent = message.parse_buffering() + + if math.floor(percent/5) > self._cbuffering: + self._cbuffering = math.floor(percent/5) + self.info("buffering %s" % percent) + + if percent == 100: + if self.target_state == self.PLAYING: + self.info("buffering done going to play") + self.status = self.target_state + self.pipeline.set_state(gst.STATE_PLAYING) + self.emit('status-changed', self.status) + self._cbuffering = -1 + elif self.status != self.BUFFERING: + if self.status == self.PLAYING: + self.pipeline.set_state(gst.STATE_PAUSED) + + self.status = self.BUFFERING + self.emit('status-changed', self.status) def _message_error_cb(self, bus, message): err, msg = message.parse_error() @@ -938,6 +944,7 @@ self.emit('player-codec-error') else: self.status = self.STOPPED + self.target_state = self.status self.emit('status-changed', self.status) if code != gst.STREAM_ERROR_FAILED: self.emit('player-unknown-error', err) @@ -1172,6 +1179,7 @@ # "message::state-changed" signal. if current != gst.STATE_NULL: self.status = self.STOPPED + self.target_state = self.status self.emit('status-changed', self.status) def do_status_changed(self, value): @@ -1185,6 +1193,8 @@ def play(self): model = self.playlist.current_playable_model + self.target_state = self.PLAYING + if model != None: if self.status == self.STOPPED: self._load_playable_model(model)