1
# PiTiVi , Non-linear video editor
3
# pitivi/ui/netstream_managerdialog.py
5
# Copyright (c) 2008, Sarath Lakshman <sarathlakshman@slynux.org>
7
# This program is free software; you can redistribute it and/or
8
# modify it under the terms of the GNU Lesser General Public
9
# License as published by the Free Software Foundation; either
10
# version 2.1 of the License, or (at your option) any later version.
12
# This program is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
# Lesser General Public License for more details.
17
# You should have received a copy of the GNU Lesser General Public
18
# License along with this program; if not, write to the
19
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
# Boston, MA 02111-1307, USA.
27
from pitivi.configure import LIBDIR
28
from pitivi.sourcelist import SourceList
29
from pitivi.bin import SmartStreamBin, SinkBin
30
from pitivi.settings import ExportSettings
32
class NetstreamManagerDialog(object):
35
self.sourcefactories = SourceList()
36
self.capture_pipe = None
39
if 'pitivi.exe' in __file__.lower():
40
glade_dir = LIBDIR + '\\pitivi.exe'
42
glade_dir = os.path.dirname(os.path.abspath(__file__))
44
self.objectpool_ui = gtk.glade.XML(os.path.join(glade_dir, "net_capture.glade"))
45
self.stream_window = self.objectpool_ui.get_widget("network_capture")
46
self.screen = self.objectpool_ui.get_widget("screen")
47
self.capture_btn = self.objectpool_ui.get_widget("capture_btn")
48
self.preview_btn = self.objectpool_ui.get_widget("preview_btn")
49
self.close_btn = self.objectpool_ui.get_widget("close_btn")
50
self.port = self.objectpool_ui.get_widget("port")
51
self.address = self.objectpool_ui.get_widget("address")
52
self.uri = self.objectpool_ui.get_widget("url")
53
self.status = self.objectpool_ui.get_widget("status")
55
self.http_radiobtn = self.objectpool_ui.get_widget("protocol")
56
self.udp_radiobtn = self.objectpool_ui.get_widget("udp")
57
self.rtsp_radiobtn = self.objectpool_ui.get_widget("rtsp")
59
self.http_radiobtn.connect("toggled", self.on_protocol_toggled, "http")
60
self.udp_radiobtn.connect("toggled", self.on_protocol_toggled, "udp")
61
self.rtsp_radiobtn.connect("toggled", self.on_protocol_toggled, "rtsp")
62
self.address.connect("changed", self.on_address_port_changed, "address")
63
self.port.connect("changed", self.on_address_port_changed, "port")
66
self.close_btn.connect("clicked", self.close)
67
self.stream_window.connect("destroy", self.close)
70
dic = { "on_close_clicked" : self.close,
71
"on_preview_btn_clicked" : self.live_pipeline,
72
"on_capture_btn_clicked" : self.capture_pipeline }
74
self.objectpool_ui.signal_autoconnect(dic)
78
self.capture_btn = self.capture_btn.get_children()[0]
79
self.capture_btn = self.capture_btn.get_children()[0].get_children()[1]
80
self.capture_btn.set_label("Capture")
83
# For Setting up audio,video sinks
84
def setSinks(self, uri):
85
gst.debug("SmartStreamBin player created")
86
self.player = SmartStreamBin(uri)
88
sink.connectSink(self.player, self.player.is_video, self.player.is_audio)
89
self.player.set_state(gst.STATE_PLAYING)
92
bus = self.player.get_bus()
93
bus.add_signal_watch()
94
bus.enable_sync_message_emission()
95
bus.connect('sync-message::element', self.on_sync_message)
98
# Create live display pipeline
99
def live_pipeline(self, w=None):
102
self.player.set_state(gst.STATE_NULL)
104
uri = self.uri.get_text()
108
if gst.uri_is_valid (uri) is False:
109
self.status.set_label("Invalid URI. Please verify.")
110
gst.debug("Invalid URI")
112
if gst.uri_protocol_is_supported(gst.URI_SRC,
113
uri.split('://')[0]):
115
self.player.set_state(gst.STATE_PLAYING)
116
self.status.push(self.status_id, "")
118
self.status.set_label("Unsupported Protocol. Please verify the URI.")
119
gst.debug("Unsupported Protocol")
123
# Stream capture pipeline
124
def capture_pipeline(self, w=None):
126
uri = self.uri.get_text()
127
if self.capture_btn.get_label() == "Capture":
128
if self.player is False and gst.uri_protocol_is_supported(gst.URI_SRC, uri.split('://')[0]) is False :
129
self.status.set_label("Unsupported Protocol. Please verify the URI.")
131
elif self.player is False:
132
self.player.set_state(gst.STATE_NULL)
136
gst.debug("recording started")
137
self.filepath = 'file://'+tempfile.mktemp()+'.ogg'
138
self.player.record(self.filepath, ExportSettings())
139
self.capture_btn.set_label("Stop")
143
gst.debug("recording stopped")
144
self.player.stopRecording()
145
self.sourcefactories.sourcelist.addUris([self.filepath])
146
self.capture_btn.set_label("Capture")
148
def on_message(self, bus, message):
150
if t == gst.MESSAGE_EOS:
152
self.player.set_state(gst.gst.STATE_NULL)
153
self.capture_btn.set_label("Capture")
155
elif t == gst.MESSAGE_ERROR:
156
err, debug = message.parse_error()
158
self.player.set_state(gst.STATE_NULL)
159
self.capture_btn.set_label("Capture")
162
def on_sync_message(self, bus, message):
163
if message.structure is None :
165
message_name = message.structure.get_name()
166
if message_name == 'prepare-xwindow-id':
167
imagesink = message.src
168
imagesink.set_property('force-aspect-ratio', True)
169
imagesink.set_xwindow_id(self.screen.window.xid)
171
# radio buttons address set callback
172
def on_protocol_toggled(self, widget, data=None):
173
self.uri.set_text(data+"://"+self.uri.get_text().split('://')[1])
175
def on_address_port_changed(self, widget, data=None):
176
self.uri.set_text(self.uri.get_text().split('://')[0] + '://' + self.address.get_text() + ['', ':'][self.port.get_text().isdigit()] + self.port.get_text())
181
self.stream_window.destroy()
183
self.player.set_state(gst.STATE_NULL)
184
if self.capture_pipe:
185
self.capture_pipe.set_state(gst.STATE_NULL)