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 use_audiorate=False)
99 self.addEffect(self.ar)
100
101 self.akuscheduler = kuscheduler.KeyUnitsScheduler('keyunits-scheduler',
102 None, self.pipeline, interval)
103 self.addEffect(self.akuscheduler)
104 self.debug("KeyUnitsScheduler added")
105
107 self.log("Decoder %s got new decoded pad %s", decoder, pad)
108
109 new_caps = pad.get_caps()
110
111
112 for outelem in self.get_output_elements():
113 output_pad = outelem.get_pad('sink')
114 if output_pad.is_linked():
115 continue
116
117 pad_caps = output_pad.get_caps()
118 if not new_caps.is_subset(pad_caps):
119 continue
120
121 self.log("Linking decoded pad %s with caps %s to feeder %s",
122 pad, new_caps.to_string(), outelem.get_name())
123 pad.link(output_pad)
124 self.disconnectedPads = False
125
126
127 if 'video' in pad_caps.to_string():
128 self._plug_video_effects(pad)
129 if 'audio' in pad_caps.to_string():
130 self._plug_audio_effects(pad)
131 return
132
133 self.info("No feeder found for decoded pad %s with caps %s",
134 pad, new_caps.to_string())
135
137 self.vr.sourcePad = pad
138 self.vr.plug()
139 self.videoscaler.sourcePad = self.vr.effectBin.get_pad("src")
140 self.videoscaler.plug()
141 self.vkuscheduler.sourcePad = self.videoscaler.effectBin.get_pad("src")
142 self.vkuscheduler.plug()
143
145 self.ar.sourcePad = pad
146 self.ar.plug()
147 self.akuscheduler.sourcePad = self.ar.effectBin.get_pad("src")
148 self.akuscheduler.plug()
149