~ubuntu-branches/ubuntu/trusty/pitivi/trusty

« back to all changes in this revision

Viewing changes to pitivi/ui/netstream_managerdialog.py

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2011-07-07 13:43:47 UTC
  • mto: (6.1.9 sid) (1.2.12)
  • mto: This revision was merged to the branch mainline in revision 32.
  • Revision ID: james.westby@ubuntu.com-20110707134347-cari9kxjiakzej9z
Tags: upstream-0.14.1
ImportĀ upstreamĀ versionĀ 0.14.1

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.configure import LIBDIR
28
 
from pitivi.sourcelist import SourceList
29
 
from pitivi.bin import SmartStreamBin, SinkBin
30
 
from pitivi.settings import ExportSettings
31
 
 
32
 
class NetstreamManagerDialog(object):
33
 
 
34
 
    def __init__(self):
35
 
        self.sourcefactories = SourceList()
36
 
        self.capture_pipe = None
37
 
        self.player = None
38
 
 
39
 
        if 'pitivi.exe' in __file__.lower():
40
 
            glade_dir = LIBDIR + '\\pitivi.exe'
41
 
        else:
42
 
            glade_dir = os.path.dirname(os.path.abspath(__file__))
43
 
 
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")
54
 
 
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")
58
 
 
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")
64
 
 
65
 
 
66
 
        self.close_btn.connect("clicked", self.close)
67
 
        self.stream_window.connect("destroy", self.close)
68
 
 
69
 
 
70
 
        dic = { "on_close_clicked" : self.close,
71
 
                "on_preview_btn_clicked" : self.live_pipeline,
72
 
                "on_capture_btn_clicked" : self.capture_pipeline }
73
 
 
74
 
        self.objectpool_ui.signal_autoconnect(dic)
75
 
 
76
 
 
77
 
 
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")
81
 
 
82
 
 
83
 
    # For Setting up audio,video sinks
84
 
    def setSinks(self, uri):
85
 
        gst.debug("SmartStreamBin player created")
86
 
        self.player = SmartStreamBin(uri)
87
 
        sink = SinkBin()
88
 
        sink.connectSink(self.player, self.player.is_video, self.player.is_audio)
89
 
        self.player.set_state(gst.STATE_PLAYING)
90
 
 
91
 
 
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)
96
 
 
97
 
 
98
 
    # Create live display pipeline
99
 
    def live_pipeline(self, w=None):
100
 
 
101
 
        if self.player:
102
 
            self.player.set_state(gst.STATE_NULL)
103
 
 
104
 
        uri = self.uri.get_text()
105
 
 
106
 
        if uri != None :
107
 
 
108
 
            if gst.uri_is_valid (uri) is False:
109
 
                self.status.set_label("Invalid URI. Please verify.")
110
 
                gst.debug("Invalid URI")
111
 
                return
112
 
            if gst.uri_protocol_is_supported(gst.URI_SRC,
113
 
                                             uri.split('://')[0]):
114
 
                self.setSinks(uri)
115
 
                self.player.set_state(gst.STATE_PLAYING)
116
 
                self.status.push(self.status_id, "")
117
 
            else:
118
 
                self.status.set_label("Unsupported Protocol. Please verify the URI.")
119
 
                gst.debug("Unsupported Protocol")
120
 
 
121
 
 
122
 
 
123
 
    # Stream capture pipeline
124
 
    def capture_pipeline(self, w=None):
125
 
 
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.")
130
 
                return
131
 
            elif self.player is False:
132
 
                self.player.set_state(gst.STATE_NULL)
133
 
                self.setSinks(uri)
134
 
 
135
 
 
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")
140
 
 
141
 
 
142
 
        else:
143
 
            gst.debug("recording stopped")
144
 
            self.player.stopRecording()
145
 
            self.sourcefactories.sourcelist.addUris([self.filepath])
146
 
            self.capture_btn.set_label("Capture")
147
 
 
148
 
    def on_message(self, bus, message):
149
 
        t = message.type
150
 
        if t == gst.MESSAGE_EOS:
151
 
            if self.player:
152
 
                self.player.set_state(gst.gst.STATE_NULL)
153
 
            self.capture_btn.set_label("Capture")
154
 
 
155
 
        elif t == gst.MESSAGE_ERROR:
156
 
            err, debug = message.parse_error()
157
 
            if self.player:
158
 
                self.player.set_state(gst.STATE_NULL)
159
 
            self.capture_btn.set_label("Capture")
160
 
 
161
 
 
162
 
    def on_sync_message(self, bus, message):
163
 
        if message.structure is None :
164
 
            return
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)
170
 
 
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])
174
 
 
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())
177
 
 
178
 
 
179
 
 
180
 
    def close(self, w):
181
 
        self.stream_window.destroy()
182
 
        if self.player:
183
 
            self.player.set_state(gst.STATE_NULL)
184
 
        if self.capture_pipe:
185
 
            self.capture_pipe.set_state(gst.STATE_NULL)