~ubuntu-branches/ubuntu/lucid/pitivi/lucid

« back to all changes in this revision

Viewing changes to pitivi/ui/netstream_managerdialog.py

  • Committer: Bazaar Package Importer
  • Author(s): Sebastian Dröge
  • Date: 2009-05-27 14:22:49 UTC
  • mfrom: (1.2.1 upstream) (3.1.13 experimental)
  • Revision ID: james.westby@ubuntu.com-20090527142249-tj0qnkc37320ylml
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# PiTiVi , Non-linear video editor
 
2
#
 
3
#       pitivi/ui/netstream_managerdialog.py
 
4
#
 
5
# Copyright (c) 2008, Sarath Lakshman <sarathlakshman@slynux.org>
 
6
#
 
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.
 
11
#
 
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.
 
16
#
 
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.
 
21
 
 
22
import os
 
23
import gtk
 
24
import gtk.glade
 
25
import gst
 
26
import tempfile
 
27
from pitivi.sourcelist import SourceList
 
28
from pitivi.bin import SmartStreamBin, SinkBin
 
29
from pitivi.settings import ExportSettings
 
30
 
 
31
class NetstreamManagerDialog(object):
 
32
 
 
33
    def __init__(self):
 
34
        self.sourcefactories = SourceList()
 
35
        self.capture_pipe = None
 
36
        self.player = None
 
37
 
 
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")
 
49
 
 
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")
 
53
 
 
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")
 
59
 
 
60
 
 
61
        self.close_btn.connect("clicked", self.close)
 
62
        self.stream_window.connect("destroy", self.close)
 
63
 
 
64
 
 
65
        dic = { "on_close_clicked" : self.close,
 
66
                "on_preview_btn_clicked" : self.live_pipeline,
 
67
                "on_capture_btn_clicked" : self.capture_pipeline }
 
68
 
 
69
        self.objectpool_ui.signal_autoconnect(dic)
 
70
 
 
71
 
 
72
 
 
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")
 
76
 
 
77
 
 
78
    # For Setting up audio,video sinks
 
79
    def setSinks(self, uri):
 
80
        gst.debug("SmartStreamBin player created")
 
81
        self.player = SmartStreamBin(uri)
 
82
        sink = SinkBin()
 
83
        sink.connectSink(self.player, self.player.is_video, self.player.is_audio)
 
84
        self.player.set_state(gst.STATE_PLAYING)
 
85
 
 
86
 
 
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)
 
91
 
 
92
 
 
93
    # Create live display pipeline
 
94
    def live_pipeline(self, w=None):
 
95
 
 
96
        if self.player:
 
97
            self.player.set_state(gst.STATE_NULL)
 
98
 
 
99
        uri = self.uri.get_text()
 
100
 
 
101
        if uri != None :
 
102
 
 
103
            if gst.uri_is_valid (uri) is False:
 
104
                self.status.set_label("Invalid URI. Please verify.")
 
105
                gst.debug("Invalid URI")
 
106
                return
 
107
            if gst.uri_protocol_is_supported(gst.URI_SRC,
 
108
                                             uri.split('://')[0]):
 
109
                self.setSinks(uri)
 
110
                self.player.set_state(gst.STATE_PLAYING)
 
111
                self.status.push(self.status_id, "")
 
112
            else:
 
113
                self.status.set_label("Unsupported Protocol. Please verify the URI.")
 
114
                gst.debug("Unsupported Protocol")
 
115
 
 
116
 
 
117
 
 
118
    # Stream capture pipeline
 
119
    def capture_pipeline(self, w=None):
 
120
 
 
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.")
 
125
                return
 
126
            elif self.player is False:
 
127
                self.player.set_state(gst.STATE_NULL)
 
128
                self.setSinks(uri)
 
129
 
 
130
 
 
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")
 
135
 
 
136
 
 
137
        else:
 
138
            gst.debug("recording stopped")
 
139
            self.player.stopRecording()
 
140
            self.sourcefactories.sourcelist.addUris([self.filepath])
 
141
            self.capture_btn.set_label("Capture")
 
142
 
 
143
    def on_message(self, bus, message):
 
144
        t = message.type
 
145
        if t == gst.MESSAGE_EOS:
 
146
            if self.player:
 
147
                self.player.set_state(gst.gst.STATE_NULL)
 
148
            self.capture_btn.set_label("Capture")
 
149
 
 
150
        elif t == gst.MESSAGE_ERROR:
 
151
            err, debug = message.parse_error()
 
152
            if self.player:
 
153
                self.player.set_state(gst.STATE_NULL)
 
154
            self.capture_btn.set_label("Capture")
 
155
 
 
156
 
 
157
    def on_sync_message(self, bus, message):
 
158
        if message.structure is None :
 
159
            return
 
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)
 
165
 
 
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])
 
169
 
 
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())
 
172
 
 
173
 
 
174
 
 
175
    def close(self, w):
 
176
        self.stream_window.destroy()
 
177
        if self.player:
 
178
            self.player.set_state(gst.STATE_NULL)
 
179
        if self.capture_pipe:
 
180
            self.capture_pipe.set_state(gst.STATE_NULL)