1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """
23 Decoder component, participating in the stream
24 """
25
26 import gst
27 import gst.interfaces
28
29 from flumotion.common.i18n import N_, gettexter
30 from flumotion.common import errors, messages
31 from flumotion.component.effects.audiorate import audiorate
32 from flumotion.component.effects.videorate import videorate
33 from flumotion.component.effects.videoscale import videoscale
34 from flumotion.component import feedcomponent as fc
35
36 __version__ = "$Rev$"
37 T_ = gettexter()
38
39
41
42 disconnectedPads = True
43 keepStreamheaderForLater = True
44 swallowNewSegment = False
45
46 _feeders_info = []
47
59
63
65 if event.type != gst.EVENT_CUSTOM_DOWNSTREAM:
66 return True
67 if event.get_structure().get_name() != 'flumotion-reset':
68 return True
69 self.info("Received flumotion-reset, not droping buffers anymore")
70
71 self.dropStreamHeaders = False
72 if self.disconnectedPads:
73 return False
74 return True
75
77
78
79 props = self.config['properties']
80 is_square = props.get('is-square', False)
81 add_borders = props.get('add-borders', False)
82 width = props.get('width', None)
83 height = props.get('height', None)
84 fr = props.get('framerate', (25, 2))
85 framerate = gst.Fraction(fr[0], fr[1])
86
87 self.vr = videorate.Videorate('videorate', None,
88 self.pipeline, framerate)
89 self.addEffect(self.vr)
90
91 self.debug("Videorate added")
92
93 self.videoscaler = videoscale.Videoscale('videoscale', self,
94 None, self.pipeline,
95 width, height, is_square, add_borders)
96 self.addEffect(self.videoscaler)
97
98 self.debug("Videoscaler added")
99
109
111 self.log("Decoder %s got new decoded pad %s", decoder, pad)
112
113 self.dropStreamHeaders = True
114 new_caps = pad.get_caps()
115
116
117 for outelem in self.get_output_elements():
118 output_pad = outelem.get_pad('sink')
119 if output_pad.is_linked():
120 continue
121
122 pad_caps = output_pad.get_caps()
123 if not new_caps.is_subset(pad_caps):
124 continue
125
126 self.log("Linking decoded pad %s with caps %s to feeder %s",
127 pad, new_caps.to_string(), outelem.get_name())
128 pad.link(output_pad)
129 self.disconnectedPads = False
130
131
132 if 'video' in pad_caps.to_string():
133 self._plug_video_effects(pad)
134 if 'audio' in pad_caps.to_string():
135 self._plug_audio_effects(pad)
136 return
137
138 self.info("No feeder found for decoded pad %s with caps %s",
139 pad, new_caps.to_string())
140
142 self.vr.sourcePad = pad
143 self.vr.plug()
144 self.videoscaler.sourcePad = self.vr.effectBin.get_pad("src")
145 self.videoscaler.plug()
146
148 self.ar.sourcePad = pad
149 self.ar.plug()
150