1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import time
23
24 from twisted.internet import reactor
25
26 from flumotion.common import componentui
27
28 __version__ = "$Rev: 8651 $"
29
30
32 """
33 This class groups eater-related information as used by a Feed Component.
34
35 @ivar eaterAlias: the alias of this eater (e.g. "default", "video",
36 ...)
37 @ivar feedId: id of the feed this is eating from
38 @ivar uiState: the serializable UI State for this eater
39 """
40
41 - def __init__(self, eaterAlias, eaterName):
42 self.eaterAlias = eaterAlias
43 self.eaterName = eaterName
44 self.feedId = None
45 self.fd = None
46 self.elementName = 'eater:' + eaterAlias
47 self.depayName = self.elementName + '-depay'
48
49 self.streamheaderBufferProbeHandler = None
50 self.streamheader = []
51 self.setPadMonitor(None)
52 self.uiState = componentui.WorkerComponentUIState()
53 self.uiState.addKey('eater-alias')
54 self.uiState.set('eater-alias', eaterAlias)
55 self.uiState.addKey('eater-name')
56 self.uiState.set('eater-name', eaterName)
57
58 connectionDict = {
59 "feed-id": None,
60 "time-timestamp-discont": None,
61 "timestamp-timestamp-discont": 0.0,
62
63 "last-timestamp-discont": 0.0,
64 "total-timestamp-discont": 0.0,
65 "count-timestamp-discont": 0,
66 "time-offset-discont": None,
67 "offset-offset-discont": 0,
68
69 "last-offset-discont": 0,
70 "total-offset-discont": 0,
71 "count-offset-discont": 0}
72 self.uiState.addDictKey('connection', connectionDict)
73
74 for key in (
75 'last-connect',
76 'last-disconnect',
77 'total-connections',
78 'count-timestamp-discont',
79 'count-offset-discont',
80 ):
81 self.uiState.addKey(key, 0)
82 for key in (
83 'total-timestamp-discont',
84 'total-offset-discont',
85 ):
86 self.uiState.addKey(key, 0.0)
87 self.uiState.addKey('fd', None)
88
90 return '<Eater %s %s>' % (self.eaterAlias,
91 (self.feedId and '(disconnected)'
92 or ('eating from %s' % self.feedId)))
93
95 """
96 The eater has been connected.
97 Update related stats.
98 """
99 if not when:
100 when = time.time()
101
102 self.feedId = feedId
103 self.fd = fd
104
105 self.uiState.set('last-connect', when)
106 self.uiState.set('fd', fd)
107 self.uiState.set('total-connections',
108 self.uiState.get('total-connections', 0) + 1)
109
110 self.uiState.setitem("connection", 'feed-id', feedId)
111 self.uiState.setitem("connection", "count-timestamp-discont", 0)
112 self.uiState.setitem("connection", "time-timestamp-discont", None)
113 self.uiState.setitem("connection", "last-timestamp-discont", 0.0)
114 self.uiState.setitem("connection", "total-timestamp-discont", 0.0)
115 self.uiState.setitem("connection", "count-offset-discont", 0)
116 self.uiState.setitem("connection", "time-offset-discont", None)
117 self.uiState.setitem("connection", "last-offset-discont", 0)
118 self.uiState.setitem("connection", "total-offset-discont", 0)
119
121 """
122 The eater has been disconnected.
123 Update related stats.
124 """
125 if not when:
126 when = time.time()
127
128 def updateUIState():
129 self.uiState.set('last-disconnect', when)
130 self.fd = None
131 self.uiState.set('fd', None)
132
133 reactor.callFromThread(updateUIState)
134
136 self._padMonitor = monitor
137
139 return self._padMonitor and self._padMonitor.isActive()
140
141 - def addWatch(self, setActive, setInactive):
144
146 """
147 @param seconds: discont duration in seconds
148 @param timestamp: GStreamer timestamp of new buffer, in seconds.
149
150 Inform the eater of a timestamp discontinuity.
151 This is called from a bus message handler, so in the main thread.
152 """
153 uiState = self.uiState
154
155 c = uiState.get('connection')
156 uiState.setitem('connection', 'count-timestamp-discont',
157 c.get('count-timestamp-discont', 0) + 1)
158 uiState.set('count-timestamp-discont',
159 uiState.get('count-timestamp-discont', 0) + 1)
160
161 uiState.setitem('connection', 'time-timestamp-discont', time.time())
162 uiState.setitem('connection', 'timestamp-timestamp-discont', timestamp)
163 uiState.setitem('connection', 'last-timestamp-discont', seconds)
164 uiState.setitem('connection', 'total-timestamp-discont',
165 c.get('total-timestamp-discont', 0) + seconds)
166 uiState.set('total-timestamp-discont',
167 uiState.get('total-timestamp-discont', 0) + seconds)
168
170 """
171 Inform the eater of an offset discontinuity.
172 This is called from a bus message handler, so in the main thread.
173 """
174 uiState = self.uiState
175
176 c = uiState.get('connection')
177 uiState.setitem('connection', 'count-offset-discont',
178 c.get('count-offset-discont', 0) + 1)
179 uiState.set('count-offset-discont',
180 uiState.get('count-offset-discont', 0) + 1)
181
182 uiState.setitem('connection', 'time-offset-discont', time.time())
183 uiState.setitem('connection', 'offset-offset-discont', offset)
184 uiState.setitem('connection', 'last-offset-discont', units)
185 uiState.setitem('connection', 'total-offset-discont',
186 c.get('total-offset-discont', 0) + units)
187 uiState.set('total-offset-discont',
188 uiState.get('total-offset-discont', 0) + units)
189