summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaZderMind <git@mazdermind.de>2015-12-03 00:44:22 +0100
committerMaZderMind <git@mazdermind.de>2015-12-03 00:44:22 +0100
commit331f1dc3fc5ee57c4714a0f5d78160e8aec9cbff (patch)
tree924ca1f2e67a7c9971f355631f75590506afe76d
parentcfae754c4a5d20431a42ed8d3864eec51de3c490 (diff)
[voctogui] implement warning-overlay in gtk instead of rendering it into the video
-rw-r--r--voctogui/lib/ui.py4
-rw-r--r--voctogui/lib/videodisplay.py17
-rw-r--r--voctogui/lib/warningoverlay.py39
-rw-r--r--voctogui/ui/voctogui.ui24
4 files changed, 37 insertions, 47 deletions
diff --git a/voctogui/lib/ui.py b/voctogui/lib/ui.py
index 451a619..68355df 100644
--- a/voctogui/lib/ui.py
+++ b/voctogui/lib/ui.py
@@ -36,7 +36,8 @@ class Ui(UiBuilder):
# Create Main-Video Overlay Controller
- self.video_warning_overlay = VideoWarningOverlay()
+ drawing_area = self.find_widget_recursive(self.win, 'video_overlay_drawingarea')
+ self.video_warning_overlay = VideoWarningOverlay(drawing_area)
# Create Main-Video Display
@@ -44,7 +45,6 @@ class Ui(UiBuilder):
self.main_video_display = VideoDisplay(drawing_area,
port=11000,
play_audio=Config.getboolean('mainvideo', 'playaudio'),
- draw_callback=self.video_warning_overlay.draw_callback,
level_callback=self.audio_level_display.level_callback)
diff --git a/voctogui/lib/videodisplay.py b/voctogui/lib/videodisplay.py
index 4195d70..bec6789 100644
--- a/voctogui/lib/videodisplay.py
+++ b/voctogui/lib/videodisplay.py
@@ -6,11 +6,10 @@ from lib.config import Config
class VideoDisplay(object):
""" Displays a Voctomix-Video-Stream into a GtkWidget """
- def __init__(self, drawing_area, port, play_audio=False, draw_callback=None, level_callback=None):
+ def __init__(self, drawing_area, port, play_audio=False, level_callback=None):
self.log = logging.getLogger('VideoDisplay[%s]' % drawing_area.get_name())
self.drawing_area = drawing_area
- self.draw_callback = draw_callback
self.level_callback = level_callback
caps = Config.get('mix', 'videocaps')
@@ -49,14 +48,6 @@ class VideoDisplay(object):
queue !
"""
- # If an overlay is required, add an cairooverlay-Element into the Video-Path
- if self.draw_callback:
- pipeline += """
- videoconvert !
- cairooverlay name=overlay !
- videoconvert !
- """
-
# Video Display
if Config.getboolean('x11', 'xv'):
pipeline += """
@@ -118,9 +109,6 @@ class VideoDisplay(object):
if self.level_callback:
bus.connect("message::element", self.on_level)
- if self.draw_callback:
- self.pipeline.get_by_name('overlay').connect('draw', self.on_draw)
-
self.log.debug('Launching Display-Pipeline')
self.pipeline.set_state(Gst.State.PLAYING)
@@ -146,6 +134,3 @@ class VideoDisplay(object):
peaks = msg.get_structure().get_value('peak')
rms = msg.get_structure().get_value('rms')
self.level_callback(peaks, rms)
-
- def on_draw(self, cairooverlay, cr, timestamp, duration):
- self.draw_callback(cr, timestamp, duration)
diff --git a/voctogui/lib/warningoverlay.py b/voctogui/lib/warningoverlay.py
index 3cbe13c..bf2c2cd 100644
--- a/voctogui/lib/warningoverlay.py
+++ b/voctogui/lib/warningoverlay.py
@@ -6,51 +6,40 @@ from lib.config import Config
class VideoWarningOverlay(object):
""" Displays a Warning-Overlay above the Video-Feed of another VideoDisplay """
- def __init__(self):
+ def __init__(self, drawing_area):
self.log = logging.getLogger('VideoWarningOverlay')
+ self.drawing_area = drawing_area
+ self.drawing_area.connect("draw", self.draw_callback)
+
self.text = None
- self.enabled = False
self.blink_state = False
GLib.timeout_add_seconds(1, self.on_blink_callback)
- caps_string = Config.get('mix', 'videocaps')
- self.log.debug('parsing video-caps: %s', caps_string)
- caps = Gst.Caps.from_string(caps_string)
- struct = caps.get_structure(0)
- _, self.width = struct.get_int('width')
- _, self.height = struct.get_int('height')
-
- self.log.debug('configuring size to %ux%u', self.width, self.height)
-
-
def on_blink_callback(self):
self.blink_state = not self.blink_state
+ self.drawing_area.queue_draw()
return True
def enable(self, text=None):
self.text = text
- self.enabled = True
+ self.drawing_area.show()
+ self.drawing_area.queue_draw()
def set_text(self, text=None):
self.text = text
+ self.drawing_area.queue_draw()
def disable(self):
- self.enabled = False
-
- def draw_callback(self, cr, timestamp, duration):
- if not self.enabled:
- return
+ self.drawing_area.hide()
+ self.drawing_area.queue_draw()
- w = self.width
- h = self.height / 20
+ def draw_callback(self, area, cr):
+ w = self.drawing_area.get_allocated_width();
+ h = self.drawing_area.get_allocated_height();
- # during startup, cr is sometimes another kind of context,
- # which does not expose set_source_rgba and other methods.
- # this check avoids the exceptions that would be thrown then.
- if isinstance(cr, cairo.Context):
- return
+ self.log.debug('draw_callback: w/h=%u/%u, blink_state=%u', w, h, self.blink_state)
if self.blink_state:
cr.set_source_rgba(1.0, 0.0, 0.0, 0.8)
diff --git a/voctogui/ui/voctogui.ui b/voctogui/ui/voctogui.ui
index 3501c1b..5586081 100644
--- a/voctogui/ui/voctogui.ui
+++ b/voctogui/ui/voctogui.ui
@@ -218,16 +218,32 @@
</packing>
</child>
<child>
- <object class="GtkDrawingArea" id="video_main">
- <property name="width_request">800</property>
- <property name="height_request">450</property>
+ <object class="GtkOverlay" id="video_overlay">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="double_buffered">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
+ <child>
+ <object class="GtkDrawingArea" id="video_main">
+ <property name="width_request">800</property>
+ <property name="height_request">450</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="double_buffered">False</property>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkDrawingArea" id="video_overlay_drawingarea">
+ <property name="height_request">32</property>
+ <property name="app_paintable">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="valign">start</property>
+ <property name="vexpand">False</property>
+ </object>
+ </child>
</object>
<packing>
<property name="expand">True</property>