mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 08:11:16 +00:00
170 lines
4.9 KiB
Python
170 lines
4.9 KiB
Python
|
# -*- Mode: Python; py-indent-offset: 4 -*-
|
||
|
# vim: tabstop=4 shiftwidth=4 expandtab
|
||
|
#
|
||
|
# Gst.py
|
||
|
#
|
||
|
# Copyright (C) 2012 Thibault Saunier <thibault.saunier@collabora.com>
|
||
|
#
|
||
|
# This program is free software; you can redistribute it and/or
|
||
|
# modify it under the terms of the GNU Lesser General Public
|
||
|
# License as published by the Free Software Foundation; either
|
||
|
# version 2.1 of the License, or (at your option) any later version.
|
||
|
#
|
||
|
# This program 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
|
||
|
# Lesser General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU Lesser General Public
|
||
|
# License along with this program; if not, write to the
|
||
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||
|
# Boston, MA 02111-1307, USA.
|
||
|
# This program is free software; you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License as published by
|
||
|
# the Free Software Foundation; either version 3, or (at your option)
|
||
|
# any later version.
|
||
|
|
||
|
import sys
|
||
|
from ..overrides import override
|
||
|
from ..importer import modules
|
||
|
|
||
|
if sys.version_info >= (3, 0):
|
||
|
_basestring = str
|
||
|
_callable = lambda c: hasattr(c, '__call__')
|
||
|
else:
|
||
|
_basestring = basestring
|
||
|
_callable = callable
|
||
|
|
||
|
Gst = modules['Gst']._introspection_module
|
||
|
__all__ = []
|
||
|
|
||
|
if Gst._version == '0.10':
|
||
|
import warnings
|
||
|
warn_msg = "You have imported the Gst 0.10 module. Because Gst 0.10 \
|
||
|
was not designed for use with introspection some of the \
|
||
|
interfaces and API will fail. As such this is not supported \
|
||
|
by the GStreamer development team and we encourage you to \
|
||
|
port your app to Gst 1 or greater. gst-python is the recomended \
|
||
|
python module to use with Gst 0.10"
|
||
|
|
||
|
warnings.warn(warn_msg, RuntimeWarning)
|
||
|
|
||
|
class Caps(Gst.Caps):
|
||
|
|
||
|
def __new__(cls, *kwargs):
|
||
|
if not kwargs:
|
||
|
return Caps.new_empty()
|
||
|
elif len(kwargs) > 1:
|
||
|
raise TypeError("wrong arguments when creating GstCaps object")
|
||
|
elif isinstance(kwargs[0], str):
|
||
|
return Caps.from_string(kwargs[0])
|
||
|
elif isinstance(kwargs[0], Caps):
|
||
|
return kwargs[0].copy()
|
||
|
|
||
|
raise TypeError("wrong arguments when creating GstCaps object")
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.to_string()
|
||
|
|
||
|
Caps = override(Caps)
|
||
|
__all__.append('Caps')
|
||
|
|
||
|
class ElementFactory(Gst.ElementFactory):
|
||
|
|
||
|
# ElementFactory
|
||
|
def get_longname(self):
|
||
|
return self.get_metadata("long-name")
|
||
|
|
||
|
def get_description(self):
|
||
|
return self.get_metadata("description")
|
||
|
|
||
|
def get_klass(self):
|
||
|
return self.get_metadata("klass")
|
||
|
|
||
|
ElementFactory = override(ElementFactory)
|
||
|
__all__.append('ElementFactory')
|
||
|
|
||
|
class Fraction(Gst.Fraction):
|
||
|
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
|
||
|
|
||
|
self.num = num
|
||
|
self.denom = denom
|
||
|
|
||
|
__simplify()
|
||
|
self.type = "fraction"
|
||
|
|
||
|
def __repr__(self):
|
||
|
return '<Gst.Fraction %d/%d>' % (self.num, self.denom)
|
||
|
|
||
|
def __value__(self):
|
||
|
return 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)
|
||
|
|
||
|
Fraction = override(Fraction)
|
||
|
__all__.append('Fraction')
|
||
|
|
||
|
initialized, argv = Gst.init_check(sys.argv)
|
||
|
import _gi_gst
|
||
|
print _gi_gst
|
||
|
|
||
|
sys.argv = list(argv)
|
||
|
if not initialized:
|
||
|
raise RuntimeError("Gst couldn't be initialized")
|
||
|
|