1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import gobject
20 import gst
21
22 from flumotion.common import gstreamer
23 from flumotion.common.i18n import gettexter
24 from flumotion.component import feedcomponent
25
26 __version__ = "$Rev$"
27 T_ = gettexter()
28
29
30 DEFAULT_INTERVAL = 10 * gst.SECOND
31
32
34
35 __gproperties__ = {
36 'interval': (gobject.TYPE_UINT64,
37 'Key Unit Interval',
38 'Key Unit interval in ns',
39 0, gst.CLOCK_TIME_NONE, DEFAULT_INTERVAL,
40 gobject.PARAM_READWRITE)}
41
42 __gstdetails__ = ('FluKeyUnitsScheduler', 'Converter',
43 'Key Units scheduler for flumotion',
44 'Flumotion Dev Team')
45
46 _sinkpadtemplate = gst.PadTemplate("sink",
47 gst.PAD_SINK,
48 gst.PAD_ALWAYS,
49 gst.caps_new_any())
50
51 _srcpadtemplate = gst.PadTemplate("src",
52 gst.PAD_SRC,
53 gst.PAD_ALWAYS,
54 gst.caps_new_any())
55
57 gst.Element.__init__(self)
58 self.sinkpad = gst.Pad(self._sinkpadtemplate, "sink")
59 self.sinkpad.set_chain_function(self.chainfunc)
60 self.add_pad(self.sinkpad)
61
62 self.srcpad = gst.Pad(self._srcpadtemplate, "src")
63 self.add_pad(self.srcpad)
64
65 self._last_ts = 0L
66 self._count = 0
67 self.interval = DEFAULT_INTERVAL
68
70 clock = self.get_clock()
71 if clock is not None:
72 running_time = clock.get_time() - self.get_base_time()
73 else:
74 running_time = 0
75 s = gst.Structure("GstForceKeyUnit")
76 s.set_value('timestamp', timestamp, 'uint64')
77 s.set_value('stream-time', timestamp, 'uint64')
78 s.set_value('running-time', running_time, 'uint64')
79 s.set_value('all-headers', True)
80 s.set_value('count', self._count)
81 return self.srcpad.push_event(
82 gst.event_new_custom(gst.EVENT_CUSTOM_DOWNSTREAM, s))
83
94
96 if transition == gst.STATE_CHANGE_PAUSED_TO_READY:
97 self._last_ts = 0L
98 self._count = 0
99 return gst.Element.do_change_state(self, transition)
100
102 if property.name == 'interval':
103 self.interval = value
104 else:
105 raise AttributeError('unknown property %s' % property.name)
106
108 if property.name == 'interval':
109 return self.interval
110 raise AttributeError('unknown property %s' % property.name)
111
112
114 """
115 I can be added after a raw video source to schedule GstForceKeyUnit
116 event, used to synchronize downstream elements, like encoders or
117 fragmenters.
118 """
119 logCategory = "kuscheduler-effect"
120
121 - def __init__(self, name, sourcePad, pipeline, interval):
122 """
123 @param element: the video source element on which the post
124 processing effect will be added
125 @param sourcePad: source pad used for linking the effect
126 @param pipeline: the pipeline of the element
127 @param interval: interval between GstForceKeyUnit events in ns
128 """
129 feedcomponent.PostProcEffect.__init__(self, name, sourcePad,
130 self.get_kuscheduler(interval), pipeline)
131
133 if not gstreamer.element_factory_exists('keyunitsscheduler'):
134 register()
135
136 kubin = gst.parse_bin_from_description('keyunitsscheduler interval=%s '
137 'name=scheduler' % interval, True)
138 self._kuscheduler = kubin.get_by_name('scheduler')
139 return kubin
140
142 self._kuscheduler.set_property('interval', interval)
143 return interval
144
146 return self._kuscheduler.get_property('interval')
147
148
153