start fixing Jingle Audio / Video
This commit is contained in:
parent
003ebf0b9d
commit
0735ec2214
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
from gi.repository import GdkX11
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
from gi.repository import Gdk
|
from gi.repository import Gdk
|
||||||
from gi.repository import GdkPixbuf
|
from gi.repository import GdkPixbuf
|
||||||
|
@ -2147,16 +2148,18 @@ class ChatControl(ChatControlBase):
|
||||||
fixed = self.xml.get_object('outgoing_fixed')
|
fixed = self.xml.get_object('outgoing_fixed')
|
||||||
fixed.set_no_show_all(False)
|
fixed.set_no_show_all(False)
|
||||||
video_hbox.show_all()
|
video_hbox.show_all()
|
||||||
|
out_da = self.xml.get_object('outgoing_drawingarea')
|
||||||
|
out_da.realize()
|
||||||
if os.name == 'nt':
|
if os.name == 'nt':
|
||||||
out_xid = self.xml.get_object(
|
out_xid = out_da.get_window().handle
|
||||||
'outgoing_drawingarea').get_window().handle
|
|
||||||
else:
|
else:
|
||||||
out_xid = self.xml.get_object(
|
out_xid = out_da.get_window().get_xid()
|
||||||
'outgoing_drawingarea').get_window().xid
|
|
||||||
else:
|
else:
|
||||||
out_xid = None
|
out_xid = None
|
||||||
video_hbox.show_all()
|
video_hbox.show_all()
|
||||||
in_xid = self.xml.get_object('incoming_drawingarea').get_window().xid
|
in_da = self.xml.get_object('incoming_drawingarea')
|
||||||
|
in_da.realize()
|
||||||
|
in_xid = in_da.get_window().get_xid()
|
||||||
sid = gajim.connections[self.account].start_video(
|
sid = gajim.connections[self.account].start_video(
|
||||||
self.contact.get_full_jid(), in_xid, out_xid)
|
self.contact.get_full_jid(), in_xid, out_xid)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -301,7 +301,7 @@ class Config:
|
||||||
'show_self_contact': [opt_str, 'when_other_resource', _('When is self contact row displayed. Can be "always", "when_other_resource" or "never"'), True],
|
'show_self_contact': [opt_str, 'when_other_resource', _('When is self contact row displayed. Can be "always", "when_other_resource" or "never"'), True],
|
||||||
'audio_input_device': [opt_str, 'autoaudiosrc ! volume name=gajim_vol'],
|
'audio_input_device': [opt_str, 'autoaudiosrc ! volume name=gajim_vol'],
|
||||||
'audio_output_device': [opt_str, 'autoaudiosink'],
|
'audio_output_device': [opt_str, 'autoaudiosink'],
|
||||||
'video_input_device': [opt_str, 'autovideosrc ! videoscale ! ffmpegcolorspace'],
|
'video_input_device': [opt_str, 'autovideosrc ! videoscale ! videoconvert'],
|
||||||
'video_output_device': [opt_str, 'autovideosink'],
|
'video_output_device': [opt_str, 'autovideosink'],
|
||||||
'video_framerate': [opt_str, '', _('Optionally fix jingle output video framerate. Example: 10/1 or 25/2')],
|
'video_framerate': [opt_str, '', _('Optionally fix jingle output video framerate. Example: 10/1 or 25/2')],
|
||||||
'video_size': [opt_str, '', _('Optionally resize jingle output video. Example: 320x240')],
|
'video_size': [opt_str, '', _('Optionally resize jingle output video. Example: 320x240')],
|
||||||
|
|
|
@ -197,8 +197,7 @@ class JingleRTPContent(JingleContent):
|
||||||
if self.is_ready():
|
if self.is_ready():
|
||||||
self.session.on_session_state_changed(self)
|
self.session.on_session_state_changed(self)
|
||||||
elif name == 'farstream-new-local-candidate':
|
elif name == 'farstream-new-local-candidate':
|
||||||
candidate = message.get_structure().get_value('candidate').copy(
|
candidate = self.p2pstream.parse_new_local_candidate(message)[1]
|
||||||
)
|
|
||||||
self.transport.candidates.append(candidate)
|
self.transport.candidates.append(candidate)
|
||||||
if self.sent:
|
if self.sent:
|
||||||
# FIXME: Is this case even possible?
|
# FIXME: Is this case even possible?
|
||||||
|
@ -374,8 +373,11 @@ class JingleAudio(JingleRTPContent):
|
||||||
|
|
||||||
|
|
||||||
class JingleVideo(JingleRTPContent):
|
class JingleVideo(JingleRTPContent):
|
||||||
def __init__(self, session, transport=None):
|
def __init__(self, session, transport=None, in_xid=0, out_xid=0):
|
||||||
JingleRTPContent.__init__(self, session, 'video', transport)
|
JingleRTPContent.__init__(self, session, 'video', transport)
|
||||||
|
self.in_xid = in_xid
|
||||||
|
self.out_xid = out_xid
|
||||||
|
self.out_xid_set = False
|
||||||
self.setup_stream()
|
self.setup_stream()
|
||||||
|
|
||||||
def setup_stream(self):
|
def setup_stream(self):
|
||||||
|
@ -383,6 +385,8 @@ class JingleVideo(JingleRTPContent):
|
||||||
# sometimes, one window won't show up,
|
# sometimes, one window won't show up,
|
||||||
# sometimes it'll freeze...
|
# sometimes it'll freeze...
|
||||||
JingleRTPContent.setup_stream(self, self._on_src_pad_added)
|
JingleRTPContent.setup_stream(self, self._on_src_pad_added)
|
||||||
|
bus = self.pipeline.get_bus()
|
||||||
|
bus.connect('sync-message::element', self._on_sync_message)
|
||||||
|
|
||||||
# the local parts
|
# the local parts
|
||||||
if gajim.config.get('video_framerate'):
|
if gajim.config.get('video_framerate'):
|
||||||
|
@ -398,17 +402,26 @@ class JingleVideo(JingleRTPContent):
|
||||||
video_size = 'video/x-raw,width=%s,height=%s ! ' % (w, h)
|
video_size = 'video/x-raw,width=%s,height=%s ! ' % (w, h)
|
||||||
else:
|
else:
|
||||||
video_size = ''
|
video_size = ''
|
||||||
|
if gajim.config.get('video_see_self'):
|
||||||
|
tee = '! tee name=t ! queue ! videoscale ! ' + \
|
||||||
|
'video/x-raw,width=160,height=120 ! videoconvert ! ' + \
|
||||||
|
'%s t. ! queue ' % gajim.config.get(
|
||||||
|
'video_output_device')
|
||||||
|
else:
|
||||||
|
tee = ''
|
||||||
|
|
||||||
self.src_bin = self.make_bin_from_config('video_input_device',
|
self.src_bin = self.make_bin_from_config('video_input_device',
|
||||||
'%%s ! %svideoscale ! %svideoconvert' % (framerate, video_size),
|
'%%s %s! %svideoscale ! %svideoconvert' % (tee, framerate,
|
||||||
_("video input"))
|
video_size), _("video input"))
|
||||||
#caps = gst.element_factory_make('capsfilter')
|
#caps = gst.element_factory_make('capsfilter')
|
||||||
#caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240'))
|
#caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240'))
|
||||||
|
|
||||||
self.pipeline.add(self.src_bin)#, caps)
|
self.pipeline.add(self.src_bin)#, caps)
|
||||||
|
self.pipeline.set_state(Gst.State.PLAYING)
|
||||||
#src_bin.link(caps)
|
#src_bin.link(caps)
|
||||||
|
|
||||||
self.sink = self.make_bin_from_config('video_output_device',
|
self.sink = self.make_bin_from_config('video_output_device',
|
||||||
'videoscale ! videoconvert ! %s force-aspect-ratio=True',
|
'videoscale ! videoconvert ! %s',
|
||||||
_("video output"))
|
_("video output"))
|
||||||
self.pipeline.add(self.sink)
|
self.pipeline.add(self.sink)
|
||||||
|
|
||||||
|
@ -418,11 +431,27 @@ class JingleVideo(JingleRTPContent):
|
||||||
# The following is needed for farstream to process ICE requests:
|
# The following is needed for farstream to process ICE requests:
|
||||||
self.pipeline.set_state(Gst.State.PLAYING)
|
self.pipeline.set_state(Gst.State.PLAYING)
|
||||||
|
|
||||||
|
def _on_sync_message(self, bus, message):
|
||||||
|
if message.structure is None:
|
||||||
|
return False
|
||||||
|
if message.structure.get_name() == 'prepare-xwindow-id':
|
||||||
|
message.src.set_property('force-aspect-ratio', True)
|
||||||
|
imagesink = message.src
|
||||||
|
if gajim.config.get('video_see_self') and not self.out_xid_set:
|
||||||
|
imagesink.set_xwindow_id(self.out_xid)
|
||||||
|
self.out_xid_set = True
|
||||||
|
else:
|
||||||
|
imagesink.set_xwindow_id(self.in_xid)
|
||||||
|
|
||||||
def get_fallback_src(self):
|
def get_fallback_src(self):
|
||||||
# TODO: Use avatar?
|
# TODO: Use avatar?
|
||||||
pipeline = 'videotestsrc is-live=true ! video/x-raw,framerate=10/1 ! videoconvert'
|
pipeline = 'videotestsrc is-live=true ! video/x-raw,framerate=10/1 ! videoconvert'
|
||||||
return Gst.parse_bin_from_description(pipeline, True)
|
return Gst.parse_bin_from_description(pipeline, True)
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
JingleRTPContent.destroy(self)
|
||||||
|
self.pipeline.get_bus().disconnect_by_func(self._on_sync_message)
|
||||||
|
|
||||||
def get_content(desc):
|
def get_content(desc):
|
||||||
if desc['media'] == 'audio':
|
if desc['media'] == 'audio':
|
||||||
return JingleAudio
|
return JingleAudio
|
||||||
|
|
Loading…
Reference in New Issue