7 from brisa.core import log
8 from brisa.utils.looping_call import LoopingCall
11 class GSTRenderer(object):
16 self.time_format = gst.Format(gst.FORMAT_TIME)
18 loop = LoopingCall(self.poll_bus)
23 message = self.bus.poll(gst.MESSAGE_ERROR|gst.MESSAGE_EOS,
26 self.on_message(self.bus, message)
29 if self.player_state == 0:
31 if self.player_state == 1:
33 if self.player_state == 2:
34 return 'PAUSED_PLAYBACK'
36 def __set_uri(self, uri):
37 self.player.set_property('uri', uri)
43 av_uri = property(__get_uri, __set_uri)
45 def build_pipeline(self):
46 self.player = gst.element_factory_make("playbin", "player")
47 self.bus = self.player.get_bus()
48 self.player.set_state(gst.STATE_READY)
50 def on_message(self, bus, message):
52 if t == gst.MESSAGE_EOS:
53 self.player.set_state(gst.STATE_NULL)
55 elif t == gst.MESSAGE_ERROR:
56 self.player.set_state(gst.STATE_NULL)
60 if self.av_uri is not None:
61 if (self.player.set_state(gst.STATE_PLAYING) ==
62 gst.STATE_CHANGE_FAILURE):
63 log.error("error trying to play %s.", self.av_uri)
66 log.info("av_uri is None, unable to play.")
69 if self.player.set_state(gst.STATE_READY) == gst.STATE_CHANGE_FAILURE:
70 log.error("error while stopping the player")
74 if self.player.set_state(gst.STATE_PAUSED) == gst.STATE_CHANGE_FAILURE:
75 log.error("error while pausing the player")
78 def seek(self, unit, target):
79 if unit == "ABS_TIME":
80 target_time = self.convert_int(target)
81 self.player.seek_simple(self.time_format, gst.SEEK_FLAG_FLUSH,
84 if unit == "REL_TIME":
85 target_time = self.convert_int(target)
86 cur_pos = self.query_position()[1]
87 self.player.seek_simple(self.time_format, gst.SEEK_FLAG_FLUSH,
90 if unit == "ABS_COUNT":
91 self.player.seek_simple(self.time_format, gst.SEEK_FLAG_FLUSH,
94 if unit == "REL_COUNT":
95 cur_pos = self.query_position()[1]
96 self.player.seek_simple(self.time_format, gst.SEEK_FLAG_FLUSH,
99 def set_volume(self, volume):
100 self.player.set_property("volume", volume/10)
102 def get_volume(self):
103 return int(self.player.get_property("volume")*10)
105 def query_duration(self):
108 dur_int = self.player.query_duration(self.time_format, None)[0]
109 dur_str = self.convert_ns(dur_int)
110 except gst.QueryError:
114 return dur_str, dur_int
116 def query_position(self):
118 pos_int = self.player.query_position(self.time_format, None)[0]
119 pos_str = self.convert_ns(pos_int)
120 except gst.QueryError:
124 return pos_str, pos_int
126 def convert_ns(self, time):
127 hours, left_time = divmod(time/1000000000, 3600)
128 minutes, left_time = divmod(left_time, 60)
129 return '%02d:%02d:%02d' % (hours, minutes, left_time)
131 def convert_int(self, time_str):
132 time_str = time_str.strip('")( ')
133 (hours, min, sec) = time_str.split(":")
134 time_int = int(hours) * 3600 + int(min) * 60 + int(sec)
135 time_int = time_int * 1000000000