1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 """
19 Decoder component, participating in the stream
20 """
21
22 import gst
23 import gst.interfaces
24
25 from flumotion.common.i18n import N_, gettexter
26 from flumotion.common import errors, messages, gstreamer
27 from flumotion.component.effects.audioconvert import audioconvert
28 from flumotion.component.effects.kuscheduler import kuscheduler
29 from flumotion.component.effects.videorate import videorate
30 from flumotion.component.effects.videoscale import videoscale
31 from flumotion.component import feedcomponent as fc
32
33 __version__ = "$Rev$"
34 T_ = gettexter()
35
36
38
39 swallowNewSegment = False
40 disconnectedPads = True
41
42 _feeders_info = []
43
51
55
57
58
59 props = self.config['properties']
60 is_square = props.get('is-square', False)
61 add_borders = props.get('add-borders', False)
62 width = props.get('width', None)
63 height = props.get('height', None)
64
65 interval = props.get('keyunits-interval', 10000) * gst.MSECOND
66 fr = props.get('framerate', (25, 2))
67 framerate = gst.Fraction(fr[0], fr[1])
68
69 self.vr = videorate.Videorate('videorate', None,
70 self.pipeline, framerate)
71 self.addEffect(self.vr)
72
73 self.debug("Videorate added")
74
75 self.videoscaler = videoscale.Videoscale('videoscale', self,
76 None, self.pipeline,
77 width, height, is_square, add_borders)
78 self.addEffect(self.videoscaler)
79
80 self.debug("Videoscaler added")
81
82 self.vkuscheduler = kuscheduler.KeyUnitsScheduler('keyunits-scheduler',
83 None, self.pipeline, interval)
84 self.addEffect(self.vkuscheduler)
85 self.debug("KeyUnitsScheduler added")
86
88
89
90 props = self.config['properties']
91 samplerate = props.get('samplerate', 44100)
92 channels = props.get('channels', 2)
93 interval = props.get('keyunits-interval', 10000) * gst.MSECOND
94
95 self.ar = audioconvert.Audioconvert('audioconvert', None,
96 self.pipeline, channels=channels,
97 samplerate=samplerate)
98 self.addEffect(self.ar)
99
100 self.akuscheduler = kuscheduler.KeyUnitsScheduler('keyunits-scheduler',
101 None, self.pipeline, interval)
102 self.addEffect(self.akuscheduler)
103 self.debug("KeyUnitsScheduler added")
104
106 self.log("Decoder %s got new decoded pad %s", decoder, pad)
107
108 new_caps = pad.get_caps()
109
110
111 for outelem in self.get_output_elements():
112 output_pad = outelem.get_pad('sink')
113 if output_pad.is_linked():
114 continue
115
116 pad_caps = output_pad.get_caps()
117 if not new_caps.is_subset(pad_caps):
118 continue
119
120 self.log("Linking decoded pad %s with caps %s to feeder %s",
121 pad, new_caps.to_string(), outelem.get_name())
122 pad.link(output_pad)
123 self.disconnectedPads = False
124
125
126 if 'video' in pad_caps.to_string():
127 self._plug_video_effects(pad)
128 if 'audio' in pad_caps.to_string():
129 self._plug_audio_effects(pad)
130 return
131
132 self.info("No feeder found for decoded pad %s with caps %s",
133 pad, new_caps.to_string())
134
136 self.vr.sourcePad = pad
137 self.vr.plug()
138 self.videoscaler.sourcePad = self.vr.effectBin.get_pad("src")
139 self.videoscaler.plug()
140 self.vkuscheduler.sourcePad = self.videoscaler.effectBin.get_pad("src")
141 self.vkuscheduler.plug()
142
144 self.ar.sourcePad = pad
145 self.ar.plug()
146 self.akuscheduler.sourcePad = self.ar.effectBin.get_pad("src")
147 self.akuscheduler.plug()
148