mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-04 23:46:43 +00:00
bbedab4e65
The way to properly fix this issue was in fact to disable the registry scanning when we import gst from the python plugin loader since... we are 100% guaranteed this is being called from a registry scan :)
229 lines
6.6 KiB
Python
229 lines
6.6 KiB
Python
# -*- Mode: Python -*-
|
|
# vi:si:et:sw=4:sts=4:ts=4
|
|
#
|
|
# gst-python
|
|
# Copyright (C) 2002 David I. Lehn
|
|
#
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Library General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2 of the License, or (at your option) any later version.
|
|
#
|
|
# This library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Library General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Library General Public
|
|
# License along with this library; if not, write to the
|
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
# Boston, MA 02111-1307, USA.
|
|
#
|
|
# Author: David I. Lehn <dlehn@users.sourceforge.net>
|
|
|
|
try:
|
|
import gstlibtoolimporter
|
|
gstlibtoolimporter.install()
|
|
except ImportError:
|
|
gstlibtoolimporter = None
|
|
|
|
import sys
|
|
|
|
# we always require 2.0 of pygtk; so if pygtk is not imported anywhere
|
|
# yet, we import pygtk here and .require
|
|
if 'gobject' not in sys.modules:
|
|
import pygtk
|
|
pygtk.require('2.0')
|
|
|
|
class Value:
|
|
def __init__(self, type):
|
|
assert type in ('fourcc', 'intrange', 'doublerange', 'fractionrange', 'fraction')
|
|
self.type = type
|
|
|
|
class Fourcc(Value):
|
|
def __init__(self, string):
|
|
Value.__init__(self, 'fourcc')
|
|
self.fourcc = string
|
|
|
|
def __repr__(self):
|
|
return '<gst.Fourcc %s>' % self.fourcc
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, Fourcc):
|
|
return self.fourcc == other.fourcc
|
|
|
|
return False
|
|
|
|
def __ne__(self, other):
|
|
return not self.__eq__(other)
|
|
|
|
class IntRange(Value):
|
|
def __init__(self, low, high):
|
|
Value.__init__(self, 'intrange')
|
|
self.low = low
|
|
self.high = high
|
|
def __repr__(self):
|
|
return '<gst.IntRange [%d, %d]>' % (self.low, self.high)
|
|
|
|
class DoubleRange(Value):
|
|
def __init__(self, low, high):
|
|
Value.__init__(self, 'doublerange')
|
|
self.low = low
|
|
self.high = high
|
|
def __repr__(self):
|
|
return '<gst.DoubleRange [%f, %f]>' % (self.low, self.high)
|
|
|
|
class FractionRange(Value):
|
|
def __init__(self, low, high):
|
|
Value.__init__(self, 'fractionrange')
|
|
self.low = low
|
|
self.high = high
|
|
def __repr__(self):
|
|
return '<gst.FractionRange [%d/%d, %d/%d]>' % (self.low.num,
|
|
self.low.denom,
|
|
self.high.num,
|
|
self.high.denom)
|
|
|
|
class Fraction(Value):
|
|
def __init__(self, num, denom=1):
|
|
def __gcd(a,b):
|
|
while b != 0:
|
|
tmp = a
|
|
a = b
|
|
b = tmp % b
|
|
return abs(a)
|
|
|
|
def __simplify():
|
|
num = self.num
|
|
denom = self.denom
|
|
|
|
if num < 0:
|
|
num = -num
|
|
denom = -denom
|
|
|
|
# Compute greatest common divisor
|
|
gcd = __gcd(num,denom)
|
|
if gcd != 0:
|
|
num /= gcd
|
|
denom /= gcd
|
|
|
|
self.num = num
|
|
self.denom = denom
|
|
|
|
Value.__init__(self, 'fraction')
|
|
|
|
self.num = num
|
|
self.denom = denom
|
|
|
|
__simplify()
|
|
|
|
def __repr__(self):
|
|
return '<gst.Fraction %d/%d>' % (self.num, self.denom)
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, Fraction):
|
|
return self.num * other.denom == other.num * self.denom
|
|
return False
|
|
|
|
def __ne__(self, other):
|
|
return not self.__eq__(other)
|
|
|
|
def __mul__(self, other):
|
|
if isinstance(other, Fraction):
|
|
return Fraction(self.num * other.num,
|
|
self.denom * other.denom)
|
|
elif isinstance(other, int):
|
|
return Fraction(self.num * other, self.denom)
|
|
raise TypeError
|
|
|
|
__rmul__ = __mul__
|
|
|
|
def __div__(self, other):
|
|
if isinstance(other, Fraction):
|
|
return Fraction(self.num * other.denom,
|
|
self.denom * other.num)
|
|
elif isinstance(other, int):
|
|
return Fraction(self.num, self.denom * other)
|
|
return TypeError
|
|
|
|
def __rdiv__(self, other):
|
|
if isinstance(other, int):
|
|
return Fraction(self.denom * other, self.num)
|
|
return TypeError
|
|
|
|
def __float__(self):
|
|
return float(self.num) / float(self.denom)
|
|
|
|
try:
|
|
dlsave = sys.getdlopenflags()
|
|
from DLFCN import RTLD_GLOBAL, RTLD_LAZY
|
|
except AttributeError:
|
|
# windows doesn't have sys.getdlopenflags()
|
|
RTLD_GLOBAL = -1
|
|
RTLD_LAZY = -1
|
|
except ImportError:
|
|
RTLD_GLOBAL = -1
|
|
RTLD_LAZY = -1
|
|
import os
|
|
osname = os.uname()[0]
|
|
if osname == 'Linux' or osname == 'SunOS' or osname == 'FreeBSD':
|
|
machinename = os.uname()[4]
|
|
if machinename == 'mips' or machinename == 'mips64':
|
|
RTLD_GLOBAL = 0x4
|
|
RTLD_LAZY = 0x1
|
|
else:
|
|
RTLD_GLOBAL = 0x100
|
|
RTLD_LAZY = 0x1
|
|
elif osname == 'Darwin':
|
|
RTLD_GLOBAL = 0x8
|
|
RTLD_LAZY = 0x1
|
|
del os
|
|
except:
|
|
RTLD_GLOBAL = -1
|
|
RTLD_LAZY = -1
|
|
|
|
if RTLD_GLOBAL != -1 and RTLD_LAZY != -1:
|
|
sys.setdlopenflags(RTLD_LAZY | RTLD_GLOBAL)
|
|
|
|
try:
|
|
import libxml2
|
|
except:
|
|
pass
|
|
|
|
from _gst import *
|
|
import interfaces
|
|
|
|
if RTLD_GLOBAL != -1 and RTLD_LAZY != -1:
|
|
sys.setdlopenflags(dlsave)
|
|
del sys
|
|
|
|
version = get_gst_version
|
|
|
|
# Fixes for API cleanups that would cause an API breakage.
|
|
# See #446674
|
|
|
|
import warnings
|
|
if locals().has_key("parse_bin_from_description"):
|
|
def gst_parse_bin_from_description(*args, **kwargs):
|
|
warnings.warn("gst_parse_bin_from_description() is deprecated, please use parse_bin_from_description instead",
|
|
DeprecationWarning)
|
|
return parse_bin_from_description(*args, **kwargs)
|
|
|
|
if locals().has_key("message_new_buffering"):
|
|
def gst_message_new_buffering(*args, **kwargs):
|
|
warnings.warn("gst_message_new_buffering() is deprecated, please use message_new_buffering() instead",
|
|
DeprecationWarning)
|
|
return message_new_buffering(*args, **kwargs)
|
|
|
|
# this restores previously installed importhooks, so we don't interfere
|
|
# with other people's module importers
|
|
# it also clears out the module completely as if it were never loaded,
|
|
# so that if anyone else imports gstltihooks the hooks get installed
|
|
if gstlibtoolimporter is not None:
|
|
import audio
|
|
import pbutils
|
|
import tag
|
|
import video
|
|
gstlibtoolimporter.uninstall()
|
|
import sys
|
|
del sys.modules["gstlibtoolimporter"]
|