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
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
92
94 if transition == gst.STATE_CHANGE_PAUSED_TO_READY:
95 self._last_ts = 0L
96 self._count = 0
97 return gst.Element.do_change_state(self, transition)
98
100 if property.name == 'interval':
101 self.interval = value
102 else:
103 raise AttributeError('unknown property %s' % property.name)
104
106 if property.name == 'interval':
107 return self.interval
108 raise AttributeError('unknown property %s' % property.name)
109
110
112 """
113 I can be added after a raw video source to schedule GstForceKeyUnit
114 event, used to synchronize downstream elements, like encoders or
115 fragmenters.
116 """
117 logCategory = "kuscheduler-effect"
118
119 - def __init__(self, name, sourcePad, pipeline, interval):
120 """
121 @param element: the video source element on which the post
122 processing effect will be added
123 @param sourcePad: source pad used for linking the effect
124 @param pipeline: the pipeline of the element
125 @param interval: interval between GstForceKeyUnit events in ns
126 """
127 feedcomponent.PostProcEffect.__init__(self, name, sourcePad,
128 self.get_kuscheduler(interval), pipeline)
129
131 if not gstreamer.element_factory_exists('keyunitsscheduler'):
132 register()
133
134 kubin = gst.parse_bin_from_description('keyunitsscheduler interval=%s '
135 'name=scheduler' % interval, True)
136 self._kuscheduler = kubin.get_by_name('scheduler')
137 return kubin
138
142
144 return self._kuscheduler.get_property('interval')
145
146
151