def _fix_gst_leaks(): """gst_element_add_pad and gst_bin_add are wrongly annotated and lead to PyGObject refing the passed element. Work around by adding a wrapper that unrefs afterwards. Can be called multiple times. https://bugzilla.gnome.org/show_bug.cgi?id=741390 https://bugzilla.gnome.org/show_bug.cgi?id=702960 """ from gi.repository import Gst assert Gst.is_initialized() def do_wrap(func): def wrap(self, obj): result = func(self, obj) obj.unref() return result return wrap parent = Gst.Bin() elm = Gst.Bin() parent.add(elm) if elm.__grefcount__ == 3: elm.unref() Gst.Bin.add = do_wrap(Gst.Bin.add) pad = Gst.Pad.new("foo", Gst.PadDirection.SRC) parent.add_pad(pad) if pad.__grefcount__ == 3: pad.unref() Gst.Element.add_pad = do_wrap(Gst.Element.add_pad)
def _init_gst(): """Call once before importing GStreamer""" assert "gi.repository.Gst" not in sys.modules import gi # We don't want python-gst, it changes API.. assert "gi.overrides.Gst" not in sys.modules sys.modules["gi.overrides.Gst"] = None # blacklist some modules, simply loading can cause segfaults sys.modules["gst"] = None # We don't depend on Gst overrides, so make sure it's initialized. try: gi.require_version("Gst", "1.0") from gi.repository import Gst except (ValueError, ImportError): return if Gst.is_initialized(): return from gi.repository import GLib try: ok, argv[:] = Gst.init_check(argv) except GLib.GError: print_e("Failed to initialize GStreamer") # Uninited Gst segfaults: make sure no one can use it sys.modules["gi.repository.Gst"] = None else: # monkey patching ahead _fix_gst_leaks()
def setup_gst(self, serial_number, fps): if not Gst.is_initialized(): Gst.init() fps_index = np.where( [int(fps) == int(opt) for opt in TISCam.FRAME_RATE_OPTIONS])[0][0] fps_frac = TISCam.FRAME_RATE_FRACTIONS[fps_index] fmat = "BGRx" if self.color else "GRAY8" pipeline = ("tcambin name=cam " "! videocrop name=crop " "! videoflip name=rotate " "! video/x-raw,format={},framerate={} ".format( fmat, fps_frac)) if self.display: pipe_sink = ("! tee name=t " "t. ! queue ! videoconvert ! ximagesink " "t. ! queue ! appsink name=sink") else: pipe_sink = "! appsink name=sink" pipeline += pipe_sink self.gst_pipeline = Gst.parse_launch(pipeline) self.cam = self.gst_pipeline.get_by_name("cam") self.cam.set_property("serial", serial_number) self.set_exposure(self.exposure) self.set_crop(self.crop) self.set_rotation(self.rotate) self.set_sink()
def arg_restrictions(): if not Gst.is_initialized(): Gst.init() source = Gst.ElementFactory.make("tcambin") return { "serial_number": source.get_device_serials(), "fps": TISCam.FRAME_RATE_OPTIONS, "rotate": TISCam.ROTATE_OPTIONS, "color": [True, False], "display": [True, False], }
def _get_gst() -> "Gst": # type: ignore # noqa F821 global CACHED_GST if CACHED_GST is None: try: import gi gi.require_version("Gst", "1.0") from gi.repository import Gst CACHED_GST = Gst if not Gst.is_initialized(): raise GstNotInitializedError() except Exception as e: raise GstNotInitializedError() from e return CACHED_GST
def __init__(self, builder=None): log.debug("Init KFSW %r %r", self, builder) if issubclass(self.__class__, object): super(KeyFprScanWidget, self).__init__() else: Gtk.VBox.__init__(self) log.debug("Inited parent KFSW %r", self) widget_name = 'scanner_widget' if not builder: thisdir = os.path.dirname(os.path.abspath(__file__)) builder = Gtk.Builder() builder.add_objects_from_file(os.path.join(thisdir, 'receive.ui'), [widget_name]) widget = builder.get_object(widget_name) parent = widget.get_parent() if parent: parent.remove(widget) self.add(widget) self.scanner = builder.get_object("scanner") if not Gst.is_initialized(): log.error("Gst does not seem to be initialised. Call Gst.init()!") # This needs to be called before creating a BarcodeReaderGTK Gst.init(None) reader = BarcodeReaderGTK() reader.set_size_request(150,150) reader.connect('barcode', self.on_barcode) self.scanner.add(reader) # We keep a referece here to not "lose" the object. # If we don't, Gtk crashes. With a segfault. Probably # because the object is freed but still used. # Somebody should look at that... self.reader = reader self.fpr_entry = builder.get_object("fingerprint_entry") self.fpr_entry.connect('changed', self.on_text_changed) self.set_hexpand(True) self.set_vexpand(True) # Temporary measure... self.barcode_scanner = self
def init(): if not Gst.is_initialized(): raise RuntimeError( "Gst.init() needs to be called before importing GstPbutils") real_init() @override class EncodingVideoProfile(GstPbutils.EncodingVideoProfile): def __init__(self, format, preset=None, restriction=None, presence=0): GstPbutils.EncodingVideoProfile.__init__(self) self.set_format(format) if preset is not None: self.set_preset(preset) if restriction is None: restriction = Gst.Caps('ANY') self.set_restriction(restriction) self.set_presence(presence) @override class EncodingAudioProfile(GstPbutils.EncodingAudioProfile): def __init__(self, format, preset=None, restriction=None, presence=0): GstPbutils.EncodingAudioProfile.__init__(self) self.set_format(format) if preset is not None: self.set_preset(preset) if restriction is None: restriction = Gst.Caps('ANY') self.set_restriction(restriction) self.set_presence(presence) @override class EncodingContainerProfile(GstPbutils.EncodingContainerProfile): def __init__(self, name, description, format, preset=None): GstPbutils.EncodingContainerProfile.__init__(self) self.set_format(format) if name is not None: self.set_name(name) if description is not None: self.set_description(description) if preset is not None: self.set_preset(preset)
def _gst_init(): """Call once before importing GStreamer""" assert "gi.repository.Gst" not in sys.modules import gi # We don't want python-gst, it changes API.. assert "gi.overrides.Gst" not in sys.modules sys.modules["gi.overrides.Gst"] = None # blacklist some modules, simply loading can cause segfaults sys.modules["gst"] = None # We don't depend on Gst overrides, so make sure it's initialized. try: gi.require_version("Gst", "1.0") from gi.repository import Gst except (ValueError, ImportError): return if Gst.is_initialized(): return from gi.repository import GLib try: ok, argv = Gst.init_check(sys.argv) except GLib.GError: print_e("Failed to initialize GStreamer") # Uninited Gst segfaults: make sure no one can use it sys.modules["gi.repository.Gst"] = None else: sys.argv = argv # monkey patching ahead _fix_gst_leaks() # https://bugzilla.gnome.org/show_bug.cgi?id=710447 import threading threading.Thread(target=lambda: None).start()
def _init_gst(): """Call once before importing GStreamer""" arch_key = "64" if sys.maxsize > 2**32 else "32" registry_name = "gst-registry-%s-%s.bin" % (sys.platform, arch_key) environ["GST_REGISTRY"] = os.path.join(get_cache_dir(), registry_name) assert "gi.repository.Gst" not in sys.modules import gi # We don't want python-gst, it changes API.. assert "gi.overrides.Gst" not in sys.modules sys.modules["gi.overrides.Gst"] = None # blacklist some modules, simply loading can cause segfaults sys.modules["gst"] = None # We don't depend on Gst overrides, so make sure it's initialized. try: gi.require_version("Gst", "1.0") from gi.repository import Gst except (ValueError, ImportError): return if Gst.is_initialized(): return from gi.repository import GLib try: ok, argv[:] = Gst.init_check(argv) except GLib.GError: print_e("Failed to initialize GStreamer") # Uninited Gst segfaults: make sure no one can use it sys.modules["gi.repository.Gst"] = None else: # monkey patching ahead _fix_gst_leaks()
def start(self, params = None, last_return = None): """ Starts the GStreamer process und underlying library if applicable. :param params: Parameter specified :param last_return: The return value from the last hook called. :since: v0.2.00 """ with self._instance_lock: if (self._glib_mainloop is None): self._glib_mainloop = GLib.get_mainloop_instance() # with Gstreamer._lock: if (not Gst.is_initialized()): Gst.segtrap_set_enabled(False) Gst.Registry.fork_set_enabled(False) if (not Gst.init_check(sys.argv)): raise IOException("GStreamer initialization failed") gst_version = Gst.version_string() if (self.log_handler is not None): self.log_handler.debug("#echo(__FILEPATH__)# -{0!r}.__init__()- reporting: {1} ready", self, gst_version, context = "pas_gapi_gstreamer")
def _gtk_init(icon=None): import gi try: # not sure if this is available under Windows gi.require_version("GdkX11", "3.0") from gi.repository import GdkX11 except (ValueError, ImportError): pass gi.require_version("GLib", "2.0") gi.require_version("Gtk", "3.0") gi.require_version("Gdk", "3.0") gi.require_version("GObject", "2.0") gi.require_version("Pango", "1.0") gi.require_version("GdkPixbuf", "2.0") gi.require_version("Gio", "2.0") from gi.repository import Gtk, GObject, GLib, Gdk # add Gtk.TreePath.__getitem__/__len__ for PyGObject 3.2 try: Gtk.TreePath()[0] except TypeError: Gtk.TreePath.__getitem__ = lambda self, index: list(self)[index] Gtk.TreePath.__len__ = lambda self: self.get_depth() # GTK+ 3.4+ constants if not hasattr(Gdk, "BUTTON_PRIMARY"): Gdk.BUTTON_PRIMARY = 1 Gdk.BUTTON_MIDDLE = 2 Gdk.BUTTON_SECONDARY = 3 # Force menu/button image related settings. We might show too many atm # but this makes sure we don't miss cases where we forgot to force them # per widget. settings = Gtk.Settings.get_default() settings.set_property("gtk-button-images", True) settings.set_property("gtk-menu-images", True) # Make sure PyGObject includes support for foreign cairo structs some_window = Gtk.OffscreenWindow() some_window.show() try: some_window.get_surface() except TypeError: print_e("PyGObject is missing cairo support") exit(1) # CSS overrides style_provider = Gtk.CssProvider() style_provider.load_from_data(""" /* Make GtkPaned look like in <=3.12, we depend on the spacing */ GtkPaned { -GtkPaned-handle-size: 6; background-image: none; margin: 0; } """) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) # https://bugzilla.gnome.org/show_bug.cgi?id=708676 warnings.filterwarnings('ignore', '.*g_value_get_int.*', Warning) # We don't want python-gst, it changes API.. assert "gi.overrides.Gst" not in sys.modules sys.modules["gi.overrides.Gst"] = None # We don't depend on Gst overrides, so make sure it's initialized. try: gi.require_version("Gst", "1.0") from gi.repository import Gst except (ValueError, ImportError): pass else: if not Gst.is_initialized(): try: ok, argv = Gst.init_check(sys.argv) except GLib.GError: print_e("Failed to initialize GStreamer") # Uninited Gst segfaults: make sure no one can use it sys.modules["gi.repository.Gst"] = None else: sys.argv = argv # https://bugzilla.gnome.org/show_bug.cgi?id=710447 import threading threading.Thread(target=lambda: None).start() # some code depends on utf-8 default encoding (pygtk used to set it) reload(sys) sys.setdefaultencoding("utf-8") # blacklist some modules, simply loading can cause segfaults sys.modules["gtk"] = None sys.modules["gpod"] = None sys.modules["glib"] = None sys.modules["gobject"] = None sys.modules["gnome"] = None from quodlibet.qltk import pygobject_version if pygobject_version < (3, 9): GObject.threads_init() theme = Gtk.IconTheme.get_default() theme.append_search_path(quodlibet.const.IMAGEDIR) if icon: Gtk.Window.set_default_icon_name(icon)
#!/usr/bin/env python import logging import sys import gi gi.require_version('Gst', '1.0') from gi.repository import Gst if not Gst.is_initialized(): Gst.init(sys.argv) ## FIXME: tamano real mas luego. ## VIDEO_CAPS = Gst.Caps.from_string ('image/jpeg,width=800,heigth=448,rate=30,framerate=30/1') ## 16:9 , alcanza para tres camaras en un usb 2.0. VIDEO_WIDTH = 1024 VIDEO_HEIGHT = 576 VIDEO_WIDTH = 640 VIDEO_HEIGHT = 480 VIDEO_RATE = "24/1" VIDEO_CAPS = Gst.Caps.from_string ('image/jpeg,width=%d,height=%d,framerate=%s,format=I420' % (VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_RATE)) VIDEO_CAPS_SIZE = Gst.Caps.from_string ('video/x-raw,width=%d,height=%d,framerate=%s,format=I420' % (VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_RATE)) AUDIO_CAPS = Gst.Caps.from_string ('audio/x-raw,rate=48000,channels=2,format=S16LE')
self.set_presence(presence) @override class EncodingAudioProfile(GstPbutils.EncodingAudioProfile): def __init__(self, format, preset=None, restriction=None, presence=0): GstPbutils.EncodingAudioProfile.__init__(self) self.set_format(format) if preset is not None: self.set_preset(preset) if restriction is None: restriction = Gst.Caps('ANY') self.set_restriction(restriction) self.set_presence(presence) @override class EncodingContainerProfile(GstPbutils.EncodingContainerProfile): def __init__(self, name, description, format, preset=None): GstPbutils.EncodingContainerProfile.__init__(self) self.set_format(format) if name is not None: self.set_name(name) if description is not None: self.set_description(description) if preset is not None: self.set_preset(preset) GstPbutils.pb_utils_init = init GstPbutils.init = init if Gst.is_initialized(): init()
# but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with gusic. If not, see <http://www.gnu.org/licenses/>. # # Copyright 2012-2013, Stijn Van Campenhout <*****@*****.**> # import pygst # pygst.require("0.10") import gi gi.require_version("Gst", "1.0") from gi.repository import Gst as gst gst.is_initialized() or gst.init(None) import logging log = logging.getLogger("gusic") class GStreamer(object): def __init__(self): self.status = "NULL" self.player = None self.nowplaying = None self.PLAYING = "PLAYING" self.STOPPED = "STOPPED" self.STOP = "STOP" self.PAUSED = "PAUSED" self.NULL = "NULL"