- import logging
- from gi.repository import GLib, Gst, cairo
- from lib.config import Config
- class VideoWarningOverlay(object):
- """ Displays a Warning-Overlay above the Video-Feed of another VideoDisplay """
- def __init__(self):
- self.log = logging.getLogger('VideoWarningOverlay')
- 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
- return True
- def enable(self, text=None):
- self.text = text
- self.enabled = True
- def set_text(self, text=None):
- self.text = text
- def disable(self):
- self.enabled = False
- def draw_callback(self, cr, timestamp, duration):
- if not self.enabled:
- return
- w = self.width
- h = self.height / 20
- # 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
- if self.blink_state:
- cr.set_source_rgba(1.0, 0.0, 0.0, 0.8)
- else:
- cr.set_source_rgba(1.0, 0.5, 0.0, 0.8)
- cr.rectangle(0, 0, w, h)
- cr.fill()
- text = "Stream is Blanked"
- if self.text:
- text += ": "+self.text
- cr.set_font_size(h*0.75)
- xbearing, ybearing, txtwidth, txtheight, xadvance, yadvance = cr.text_extents(text)
- cr.move_to(w/2 - txtwidth/2, h*0.75)
- cr.set_source_rgba(1.0, 1.0, 1.0, 1.0)
- cr.show_text(text)
|