Skip to content

Commit beb5ee7

Browse files
committed
Revert "Merge pull request #366 from justjanne/wayland-ui"
1 parent ea6040d commit beb5ee7

File tree

7 files changed

+76
-66
lines changed

7 files changed

+76
-66
lines changed

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

voctogui/lib/ui.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import logging
2-
from typing import cast
3-
42
from gi.repository import Gtk, Gdk
53

64
from voctogui.lib.config import Config
@@ -81,14 +79,12 @@ def setup(self):
8179
self.mix_audio_display = AudioDisplay(audio_box, "mix", uibuilder=self)
8280

8381
# Create Main-Video Display
84-
video_main = cast(Gtk.Box, self.find_widget_recursive(self.win, 'video_main'))
8582
self.mix_video_display = VideoDisplay(
83+
self.find_widget_recursive(self.win, 'video_main'),
8684
self.mix_audio_display,
8785
port=Port.MIX_PREVIEW if Config.getPreviewsEnabled() else Port.MIX_OUT,
8886
name="MIX"
8987
)
90-
video_main.pack_start(self.mix_video_display.widget, fill=True, expand=True, padding=0)
91-
self.mix_video_display.play()
9288

9389
for idx, livepreview in enumerate(Config.getLivePreviews()):
9490
if Config.getPreviewsEnabled():

voctogui/lib/videodisplay.py

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import logging
22
import sys
3-
from typing import cast
43

5-
from gi.repository import Gst, Gdk, Gtk
4+
from gi.repository import Gst, Gdk
65

76
from voctogui.lib.args import Args
87
from voctogui.lib.config import Config
@@ -16,14 +15,12 @@
1615

1716
class VideoDisplay(object):
1817
"""Displays a Voctomix-Video-Stream into a GtkWidget"""
19-
imagesink: Gst.Element
20-
widget: Gtk.Widget
21-
pipeline: Gst.Pipeline
2218

23-
def __init__(self, audio_display, port, name, width=None, height=None,
19+
def __init__(self, video_drawing_area, audio_display, port, name, width=None, height=None,
2420
has_audio=True, play_audio=False):
2521
self.log = logging.getLogger('VideoDisplay:%s' % name)
2622
self.name = name
23+
self.video_drawing_area = video_drawing_area
2724
self.level_callback = None if audio_display is None else audio_display.callback
2825
video_decoder = None
2926

@@ -81,16 +78,28 @@ def __init__(self, audio_display, port, name, width=None, height=None,
8178
# Video Display
8279
videosystem = Config.getVideoSystem()
8380
self.log.debug('Configuring for Video-System %s', videosystem)
84-
if videosystem == 'gtk':
85-
pipe += """ ! gtksink
86-
name=imagesink-{name} sync=false
87-
""".format(name=name)
8881

89-
elif videosystem == 'gtkgl':
82+
if videosystem == 'gl':
9083
pipe += """ ! glupload
91-
! gtkglsink
92-
name=imagesink-{name} sync=false
93-
""".format(name=name)
84+
! glcolorconvert
85+
! glimagesinkelement
86+
name=imagesink-{name}
87+
""".format(name=name)
88+
89+
elif videosystem == 'xv':
90+
pipe += """ ! xvimagesink
91+
name=imagesink-{name}
92+
""".format(name=name)
93+
94+
elif videosystem == 'x':
95+
pipe += """ ! ximagesink
96+
name=imagesink-{name}
97+
""".format(name=name)
98+
99+
elif videosystem == 'vaapi':
100+
pipe += """ ! vaapisink
101+
name=imagesink-{name}
102+
""".format(name=name)
94103

95104
else:
96105
raise Exception(
@@ -125,27 +134,48 @@ def __init__(self, audio_display, port, name, width=None, height=None,
125134
self.log.info("Creating Display-Pipeline:\n%s", pretty(pipe))
126135
try:
127136
# launch gstreamer pipeline
128-
self.pipeline = cast(Gst.Pipeline, Gst.parse_launch(pipe))
137+
self.pipeline = Gst.parse_launch(pipe)
129138
self.log.info("pipeline launched successfuly")
130139
except:
131140
self.log.error("Can not launch pipeline")
132141
sys.exit(-1)
133142

134-
self.imagesink = cast(Gst.Element, self.pipeline.get_by_name('imagesink-{name}'.format(name=self.name)))
135-
self.widget = cast(Gtk.Widget, self.imagesink.get_property("widget"))
136-
137143
if Args.dot:
138144
self.log.debug("Generating DOT image of videodisplay pipeline")
139145
gst_generate_dot(self.pipeline, "gui.videodisplay.{}".format(name), Args.gst_debug_details)
140146

141-
self.pipeline.set_clock(Clock)
147+
self.pipeline.use_clock(Clock)
148+
149+
self.video_drawing_area.add_events(
150+
Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK)
151+
self.video_drawing_area.connect("realize", self.on_realize)
142152
bus = self.pipeline.get_bus()
143153
bus.add_signal_watch()
144154
bus.enable_sync_message_emission()
145155

146156
bus.connect('message::error', self.on_error)
157+
bus.connect('sync-message::element', self.on_syncmsg)
158+
bus.connect('message::state-changed', self.on_state_changed)
147159
bus.connect("message::element", self.on_level)
148160

161+
def on_realize(self, win):
162+
self.imagesink = self.pipeline.get_by_name(
163+
'imagesink-{name}'.format(name=self.name))
164+
self.xid = self.video_drawing_area.get_property('window').get_xid()
165+
166+
self.log.debug('Realized Drawing-Area with xid %u', self.xid)
167+
self.video_drawing_area.realize()
168+
169+
self.log.info("Launching Display-Pipeline")
170+
self.pipeline.set_state(Gst.State.PLAYING)
171+
172+
def on_syncmsg(self, bus, msg):
173+
if type(msg) == Gst.Message and self.imagesink:
174+
if msg.get_structure().get_name() == "prepare-window-handle":
175+
self.log.info(
176+
'Setting imagesink window-handle to 0x%x', self.xid)
177+
self.imagesink.set_window_handle(self.xid)
178+
149179
def on_error(self, bus, message):
150180
(error, debug) = message.parse_error()
151181
self.log.error(
@@ -162,5 +192,6 @@ def on_level(self, bus, msg):
162192
decay = msg.get_structure().get_value('decay')
163193
self.level_callback(rms, peak, decay)
164194

165-
def play(self):
166-
self.pipeline.set_state(Gst.State.PLAYING)
195+
def on_state_changed(self, bus, message):
196+
if message.parse_state_changed().newstate == Gst.State.PLAYING:
197+
self.video_drawing_area.show()

voctogui/lib/videopreviewframe.py

Lines changed: 0 additions & 26 deletions
This file was deleted.

voctogui/lib/videopreviews.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
import math
55
import os
66
from configparser import NoOptionError
7-
from typing import cast
87

9-
from gi.repository import Gst, Gtk, Gdk, GObject
10-
from voctogui.lib.videopreviewframe import VideoPreviewFrame
8+
from gi.repository import Gtk, Gdk, GObject
119
from voctogui.lib.videodisplay import VideoDisplay
1210
from voctogui.lib.audioonlydisplay import AudioOnlyDisplay
1311
from voctogui.lib.audiodisplay import AudioDisplay
@@ -62,16 +60,18 @@ def addPreview(self, uibuilder, source, port, has_volume=True):
6260
if has_audio and Config.getAudioStreams().get_source_streams(source):
6361
mix_audio_display = AudioDisplay(self.audio_box, source, uibuilder, has_volume)
6462
if source in Config.getVideoSources(internal=True):
65-
player = VideoDisplay(audio_display=mix_audio_display, port=port,
63+
video = uibuilder.load_check_widget('video',
64+
os.path.dirname(uibuilder.uifile) +
65+
"/widgetpreview.ui")
66+
video.set_size_request(*self.previewSize)
67+
self.video_box.pack_start(video, fill=False,
68+
expand=False, padding=0)
69+
70+
player = VideoDisplay(video, mix_audio_display, port=port,
6671
width=self.previewSize[0],
6772
height=self.previewSize[1],
6873
name=source.upper(),
6974
has_audio=has_audio,
7075
)
71-
video = cast(Gtk.Widget, player.widget)
72-
frame = VideoPreviewFrame(*self.previewSize)
73-
frame.add(video)
74-
self.video_box.pack_start(frame, False, False, 0)
75-
player.play()
7676
elif has_audio and Config.getAudioStreams().get_source_streams(source):
7777
player = AudioOnlyDisplay(mix_audio_display, port=port, name=source.upper())

voctogui/ui/voctogui.ui

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,13 @@
113113
<property name="shadow-type">none</property>
114114
<property name="obey-child">False</property>
115115
<child>
116-
<object class="GtkBox" id="video_main">
116+
<object class="GtkDrawingArea" id="video_main">
117117
<property name="width-request">100</property>
118118
<property name="visible">True</property>
119119
<property name="can-focus">False</property>
120120
<property name="double-buffered">False</property>
121121
<property name="hexpand">True</property>
122122
<property name="vexpand">True</property>
123-
<child>
124-
<placeholder/>
125-
</child>
126123
</object>
127124
</child>
128125
</object>

voctogui/ui/widgetpreview.ui

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!-- Generated with glade 3.22.1 -->
3+
<interface>
4+
<requires lib="gtk+" version="3.0"/>
5+
<object class="GtkDrawingArea" id="video">
6+
<property name="width_request">320</property>
7+
<property name="height_request">180</property>
8+
<property name="visible">True</property>
9+
<property name="can_focus">False</property>
10+
<property name="double_buffered">False</property>
11+
</object>
12+
</interface>

0 commit comments

Comments
 (0)