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.sourcelist import SourceList
28
from pitivi.bin import SmartStreamBin, SinkBin
29
from pitivi.settings import ExportSettings
31
class NetstreamManagerDialog(object):
34
self.sourcefactories = SourceList()
35
self.capture_pipe = None
38
glade_dir = os.path.dirname(os.path.abspath(__file__))
39
self.objectpool_ui = gtk.glade.XML(os.path.join(glade_dir, "net_capture.glade"))
40
self.stream_window = self.objectpool_ui.get_widget("network_capture")
41
self.screen = self.objectpool_ui.get_widget("screen")
42
self.capture_btn = self.objectpool_ui.get_widget("capture_btn")
43
self.preview_btn = self.objectpool_ui.get_widget("preview_btn")
44
self.close_btn = self.objectpool_ui.get_widget("close_btn")
45
self.port = self.objectpool_ui.get_widget("port")
46
self.address = self.objectpool_ui.get_widget("address")
47
self.uri = self.objectpool_ui.get_widget("url")
48
self.status = self.objectpool_ui.get_widget("status")
50
self.http_radiobtn = self.objectpool_ui.get_widget("protocol")
51
self.udp_radiobtn = self.objectpool_ui.get_widget("udp")
52
self.rtsp_radiobtn = self.objectpool_ui.get_widget("rtsp")
54
self.http_radiobtn.connect("toggled", self.on_protocol_toggled, "http")
55
self.udp_radiobtn.connect("toggled", self.on_protocol_toggled, "udp")
56
self.rtsp_radiobtn.connect("toggled", self.on_protocol_toggled, "rtsp")
57
self.address.connect("changed", self.on_address_port_changed, "address")
58
self.port.connect("changed", self.on_address_port_changed, "port")
61
self.close_btn.connect("clicked", self.close)
62
self.stream_window.connect("destroy", self.close)
65
dic = { "on_close_clicked" : self.close,
66
"on_preview_btn_clicked" : self.live_pipeline,
67
"on_capture_btn_clicked" : self.capture_pipeline }
69
self.objectpool_ui.signal_autoconnect(dic)
73
self.capture_btn = self.capture_btn.get_children()[0]
74
self.capture_btn = self.capture_btn.get_children()[0].get_children()[1]
75
self.capture_btn.set_label("Capture")
78
# For Setting up audio,video sinks
79
def setSinks(self, uri):
80
gst.debug("SmartStreamBin player created")
81
self.player = SmartStreamBin(uri)
83
sink.connectSink(self.player, self.player.is_video, self.player.is_audio)
84
self.player.set_state(gst.STATE_PLAYING)
87
bus = self.player.get_bus()
88
bus.add_signal_watch()
89
bus.enable_sync_message_emission()
90
bus.connect('sync-message::element', self.on_sync_message)
93
# Create live display pipeline
94
def live_pipeline(self, w=None):
97
self.player.set_state(gst.STATE_NULL)
99
uri = self.uri.get_text()
103
if gst.uri_is_valid (uri) is False:
104
self.status.set_label("Invalid URI. Please verify.")
105
gst.debug("Invalid URI")
107
if gst.uri_protocol_is_supported(gst.URI_SRC,
108
uri.split('://')[0]):
110
self.player.set_state(gst.STATE_PLAYING)
111
self.status.push(self.status_id, "")
113
self.status.set_label("Unsupported Protocol. Please verify the URI.")
114
gst.debug("Unsupported Protocol")
118
# Stream capture pipeline
119
def capture_pipeline(self, w=None):
121
uri = self.uri.get_text()
122
if self.capture_btn.get_label() == "Capture":
123
if self.player is False and gst.uri_protocol_is_supported(gst.URI_SRC, uri.split('://')[0]) is False :
124
self.status.set_label("Unsupported Protocol. Please verify the URI.")
126
elif self.player is False:
127
self.player.set_state(gst.STATE_NULL)
131
gst.debug("recording started")
132
self.filepath = 'file://'+tempfile.mktemp()+'.ogg'
133
self.player.record(self.filepath, ExportSettings())
134
self.capture_btn.set_label("Stop")
138
gst.debug("recording stopped")
139
self.player.stopRecording()
140
self.sourcefactories.sourcelist.addUris([self.filepath])
141
self.capture_btn.set_label("Capture")
143
def on_message(self, bus, message):
145
if t == gst.MESSAGE_EOS:
147
self.player.set_state(gst.gst.STATE_NULL)
148
self.capture_btn.set_label("Capture")
150
elif t == gst.MESSAGE_ERROR:
151
err, debug = message.parse_error()
153
self.player.set_state(gst.STATE_NULL)
154
self.capture_btn.set_label("Capture")
157
def on_sync_message(self, bus, message):
158
if message.structure is None :
160
message_name = message.structure.get_name()
161
if message_name == 'prepare-xwindow-id':
162
imagesink = message.src
163
imagesink.set_property('force-aspect-ratio', True)
164
imagesink.set_xwindow_id(self.screen.window.xid)
166
# radio buttons address set callback
167
def on_protocol_toggled(self, widget, data=None):
168
self.uri.set_text(data+"://"+self.uri.get_text().split('://')[1])
170
def on_address_port_changed(self, widget, data=None):
171
self.uri.set_text(self.uri.get_text().split('://')[0] + '://' + self.address.get_text() + ['', ':'][self.port.get_text().isdigit()] + self.port.get_text())
176
self.stream_window.destroy()
178
self.player.set_state(gst.STATE_NULL)
179
if self.capture_pipe:
180
self.capture_pipe.set_state(gst.STATE_NULL)