mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +00:00
move over some of the extend stuff that I want to use right now
Original commit message from CVS: * configure.ac: * gst/Makefile.am: * gst/extend/Makefile.am: * gst/extend/__init__.py: * gst/extend/pygobject.py: * gst/extend/utils.py: move over some of the extend stuff that I want to use right now
This commit is contained in:
parent
3241bda36a
commit
74782ee345
7 changed files with 285 additions and 0 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2005-10-04 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
|
* configure.ac:
|
||||||
|
* gst/Makefile.am:
|
||||||
|
* gst/extend/Makefile.am:
|
||||||
|
* gst/extend/__init__.py:
|
||||||
|
* gst/extend/pygobject.py:
|
||||||
|
* gst/extend/utils.py:
|
||||||
|
move over some of the extend stuff that I want to use right now
|
||||||
|
|
||||||
2005-10-04 Edward Hervey <edward@fluendo.com>
|
2005-10-04 Edward Hervey <edward@fluendo.com>
|
||||||
|
|
||||||
* codegen/codegen.py:
|
* codegen/codegen.py:
|
||||||
|
|
|
@ -146,6 +146,7 @@ AC_OUTPUT([
|
||||||
Makefile
|
Makefile
|
||||||
codegen/Makefile
|
codegen/Makefile
|
||||||
gst/Makefile
|
gst/Makefile
|
||||||
|
gst/extend/Makefile
|
||||||
examples/Makefile
|
examples/Makefile
|
||||||
pkgconfig/Makefile
|
pkgconfig/Makefile
|
||||||
pkgconfig/gst-python.pc
|
pkgconfig/gst-python.pc
|
||||||
|
|
|
@ -77,3 +77,5 @@ interfaces.c: $(INTERFACES_DEFS) $(INTERFACES_OVERRIDES) $(GEN_FILES)
|
||||||
--prefix py$* $*.defs) > gen-$*.c \
|
--prefix py$* $*.defs) > gen-$*.c \
|
||||||
&& cp gen-$*.c $*.c \
|
&& cp gen-$*.c $*.c \
|
||||||
&& rm -f gen-$*.c
|
&& rm -f gen-$*.c
|
||||||
|
|
||||||
|
SUBDIRS = extend
|
||||||
|
|
4
gst/extend/Makefile.am
Normal file
4
gst/extend/Makefile.am
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
pkgpythondir = $(pythondir)/gst/extend
|
||||||
|
|
||||||
|
pygstdir = $(pkgpythondir)
|
||||||
|
pygst_PYTHON = __init__.py pygobject.py utils.py
|
21
gst/extend/__init__.py
Normal file
21
gst/extend/__init__.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- Mode: Python -*-
|
||||||
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
#
|
||||||
|
# GStreamer python bindings
|
||||||
|
# Copyright (C) 2002 David I. Lehn <dlehn@users.sourceforge.net>
|
||||||
|
# 2004 Johan Dahlin <johan@gnome.org>
|
||||||
|
|
||||||
|
# This library 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 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
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
172
gst/extend/pygobject.py
Normal file
172
gst/extend/pygobject.py
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- Mode: Python -*-
|
||||||
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
#
|
||||||
|
# GStreamer python bindings
|
||||||
|
# Copyright (C) 2004 Johan Dahlin <johan at gnome dot org>
|
||||||
|
|
||||||
|
# This library 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 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
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
"""
|
||||||
|
PyGTK helper functions
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import gobject
|
||||||
|
|
||||||
|
def gobject_set_property(object, property, value):
|
||||||
|
"""
|
||||||
|
Set the given property to the given value on the given object.
|
||||||
|
|
||||||
|
@type object: L{gobject.GObject}
|
||||||
|
@type property: string
|
||||||
|
@param value: value to set property to
|
||||||
|
"""
|
||||||
|
for pspec in gobject.list_properties(object):
|
||||||
|
if pspec.name == property:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise errors.PropertyError(
|
||||||
|
"Property '%s' in element '%s' does not exist" % (
|
||||||
|
property, object.get_property('name')))
|
||||||
|
|
||||||
|
if pspec.value_type in (gobject.TYPE_INT, gobject.TYPE_UINT,
|
||||||
|
gobject.TYPE_INT64, gobject.TYPE_UINT64):
|
||||||
|
try:
|
||||||
|
value = int(value)
|
||||||
|
except ValueError:
|
||||||
|
msg = "Invalid value given for property '%s' in element '%s'" % (
|
||||||
|
property, object.get_property('name'))
|
||||||
|
raise errors.PropertyError(msg)
|
||||||
|
|
||||||
|
elif pspec.value_type == gobject.TYPE_BOOLEAN:
|
||||||
|
if value == 'False':
|
||||||
|
value = False
|
||||||
|
elif value == 'True':
|
||||||
|
value = True
|
||||||
|
else:
|
||||||
|
value = bool(value)
|
||||||
|
elif pspec.value_type in (gobject.TYPE_DOUBLE, gobject.TYPE_FLOAT):
|
||||||
|
value = float(value)
|
||||||
|
elif pspec.value_type == gobject.TYPE_STRING:
|
||||||
|
value = str(value)
|
||||||
|
# FIXME: this is superevil ! we really need to find a better way
|
||||||
|
# of checking if this property is a param enum
|
||||||
|
# also, we only allow int for now
|
||||||
|
elif repr(pspec.__gtype__).startswith("<GType GParamEnum"):
|
||||||
|
value = int(value)
|
||||||
|
else:
|
||||||
|
raise errors.PropertyError('Unknown property type: %s' %
|
||||||
|
pspec.value_type)
|
||||||
|
|
||||||
|
object.set_property(property, value)
|
||||||
|
|
||||||
|
def gsignal(name, *args):
|
||||||
|
"""
|
||||||
|
Add a GObject signal to the current object.
|
||||||
|
To be used from class definition scope.
|
||||||
|
|
||||||
|
@type name: string
|
||||||
|
@type args: mixed
|
||||||
|
"""
|
||||||
|
frame = sys._getframe(1)
|
||||||
|
_locals = frame.f_locals
|
||||||
|
|
||||||
|
if not '__gsignals__' in _locals:
|
||||||
|
_dict = _locals['__gsignals__'] = {}
|
||||||
|
else:
|
||||||
|
_dict = _locals['__gsignals__']
|
||||||
|
|
||||||
|
_dict[name] = (gobject.SIGNAL_RUN_FIRST, None, args)
|
||||||
|
|
||||||
|
PARAM_CONSTRUCT = 1<<9
|
||||||
|
|
||||||
|
def with_construct_properties(__init__):
|
||||||
|
"""
|
||||||
|
Wrap a class' __init__ method in a procedure that will construct
|
||||||
|
gobject properties. This is necessary because pygtk's object
|
||||||
|
construction is a bit broken.
|
||||||
|
|
||||||
|
Usage::
|
||||||
|
|
||||||
|
class Foo(GObject):
|
||||||
|
def __init__(self):
|
||||||
|
GObject.__init(self)
|
||||||
|
__init__ = with_construct_properties(__init__)
|
||||||
|
"""
|
||||||
|
frame = sys._getframe(1)
|
||||||
|
_locals = frame.f_locals
|
||||||
|
gproperties = _locals['__gproperties__']
|
||||||
|
def hacked_init(self, *args, **kwargs):
|
||||||
|
__init__(self, *args, **kwargs)
|
||||||
|
self.__gproperty_values = {}
|
||||||
|
for p, v in gproperties.items():
|
||||||
|
if v[-1] & PARAM_CONSTRUCT:
|
||||||
|
self.set_property(p, v[3])
|
||||||
|
return hacked_init
|
||||||
|
|
||||||
|
def gproperty(type_, name, desc, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Add a GObject property to the current object.
|
||||||
|
To be used from class definition scope.
|
||||||
|
|
||||||
|
@type type_: type object
|
||||||
|
@type name: string
|
||||||
|
@type desc: string
|
||||||
|
@type args: mixed
|
||||||
|
"""
|
||||||
|
frame = sys._getframe(1)
|
||||||
|
_locals = frame.f_locals
|
||||||
|
flags = 0
|
||||||
|
|
||||||
|
def _do_get_property(self, prop):
|
||||||
|
try:
|
||||||
|
return self._gproperty_values[prop.name]
|
||||||
|
except (AttributeError, KeyError):
|
||||||
|
raise AttributeError('Property was never set', self, prop)
|
||||||
|
|
||||||
|
def _do_set_property(self, prop, value):
|
||||||
|
if not getattr(self, '_gproperty_values', None):
|
||||||
|
self._gproperty_values = {}
|
||||||
|
self._gproperty_values[prop.name] = value
|
||||||
|
|
||||||
|
_locals['do_get_property'] = _do_get_property
|
||||||
|
_locals['do_set_property'] = _do_set_property
|
||||||
|
|
||||||
|
if not '__gproperties__' in _locals:
|
||||||
|
_dict = _locals['__gproperties__'] = {}
|
||||||
|
else:
|
||||||
|
_dict = _locals['__gproperties__']
|
||||||
|
|
||||||
|
for i in 'readable', 'writable':
|
||||||
|
if not i in kwargs:
|
||||||
|
kwargs[i] = True
|
||||||
|
|
||||||
|
for k, v in kwargs.items():
|
||||||
|
if k == 'construct':
|
||||||
|
flags |= PARAM_CONSTRUCT
|
||||||
|
elif k == 'construct_only':
|
||||||
|
flags |= gobject.PARAM_CONSTRUCT_ONLY
|
||||||
|
elif k == 'readable':
|
||||||
|
flags |= gobject.PARAM_READABLE
|
||||||
|
elif k == 'writable':
|
||||||
|
flags |= gobject.PARAM_WRITABLE
|
||||||
|
elif k == 'lax_validation':
|
||||||
|
flags |= gobject.PARAM_LAX_VALIDATION
|
||||||
|
else:
|
||||||
|
raise Exception('Invalid GObject property flag: %r=%r' % (k, v))
|
||||||
|
|
||||||
|
_dict[name] = (type_, name, desc) + args + tuple((flags,))
|
75
gst/extend/utils.py
Normal file
75
gst/extend/utils.py
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
import gobject
|
||||||
|
import gst
|
||||||
|
|
||||||
|
def gst_dump(bin):
|
||||||
|
dump_element (bin, 0)
|
||||||
|
|
||||||
|
def dump_bin (bin, indent):
|
||||||
|
# Iterate the children
|
||||||
|
for child in bin.get_list():
|
||||||
|
dump_element (child, indent + 2)
|
||||||
|
|
||||||
|
def dump_element (element, indent):
|
||||||
|
states = { 1: 'NULL', 2: 'READY',
|
||||||
|
4: 'PAUSED', 8: 'PLAYING' }
|
||||||
|
|
||||||
|
state = 'UNKNOWN'
|
||||||
|
try:
|
||||||
|
state = states[element.get_state()]
|
||||||
|
except KeyError:
|
||||||
|
state = 'UNKNOWN (%d)' % element.get_state()
|
||||||
|
|
||||||
|
c = element.get_clock()
|
||||||
|
if c is None:
|
||||||
|
clock_str = "clock - None"
|
||||||
|
else:
|
||||||
|
clock_str = "clock - %s" % (c.get_name())
|
||||||
|
|
||||||
|
out = "%s (%s): state %s, %s" % (element.get_name(),
|
||||||
|
gobject.type_name (element.__gtype__), state, clock_str)
|
||||||
|
|
||||||
|
print out.rjust(len(out) + indent)
|
||||||
|
|
||||||
|
tmp = { True: 'active', False: 'inactive' }
|
||||||
|
|
||||||
|
for curpad in element.get_pad_list():
|
||||||
|
if curpad.get_direction() == gst.PAD_SRC:
|
||||||
|
if curpad.is_linked():
|
||||||
|
peer = curpad.get_peer()
|
||||||
|
out = " - %s:%s (%s) => %s:%s (%s)" % (
|
||||||
|
curpad.get_parent().get_name(), curpad.get_name(),
|
||||||
|
tmp[curpad.is_active()],
|
||||||
|
peer.get_parent().get_name(), peer.get_name(),
|
||||||
|
tmp[peer.is_active()])
|
||||||
|
|
||||||
|
print out.rjust(len(out) + indent)
|
||||||
|
|
||||||
|
if isinstance (element, gst.Bin):
|
||||||
|
dump_bin (element, indent + 2)
|
||||||
|
elif isinstance (element, gst.Queue):
|
||||||
|
out = " - time_level: %ld" % (element.get_property('current-level-time'))
|
||||||
|
print out.rjust(len(out) + indent)
|
||||||
|
out = " - bytes_level: %ld" % (element.get_property('current-level-bytes'))
|
||||||
|
print out.rjust(len(out) + indent)
|
||||||
|
|
||||||
|
def gc_collect(reason=None):
|
||||||
|
"""
|
||||||
|
Garbage-collect if GST_GC env var is set.
|
||||||
|
This helps in debugging object refcounting.
|
||||||
|
Sprinkle liberally around checkpoints.
|
||||||
|
"""
|
||||||
|
env = os.environ.get('GST_GC', None)
|
||||||
|
if not env:
|
||||||
|
return
|
||||||
|
import gc
|
||||||
|
if env == 'DEBUG_LEAK':
|
||||||
|
gc.set_debug(gc.DEBUG_LEAK)
|
||||||
|
|
||||||
|
gst.debug('collecting garbage')
|
||||||
|
if reason:
|
||||||
|
gst.debug('because of %s' % reason)
|
||||||
|
count = gc.collect()
|
||||||
|
gst.debug('collected garbage, %d objects collected, %d left' % (
|
||||||
|
count, len(gc.get_objects())))
|
Loading…
Reference in a new issue