From: <co...@fr...> - 2005-04-26 20:10:56
|
CVS Root: /cvs/gstreamer Module: gst-python Changes by: company Date: Wed Apr 27 2005 06:10:51 EST Branch: BRANCH-GSTREAMER-0_8 Log message: * gst/gstbuffer.override: make Buffer() not use memory it doesn't own * testsuite/test_buffer.py: check that it doesn't Modified files: . : ChangeLog gst : gstbuffer.override testsuite : test_buffer.py Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/ChangeLog.diff?r1=1.157.2.6&r2=1.157.2.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gstbuffer.override.diff?r1=1.4&r2=1.4.2.1 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/testsuite/test_buffer.py.diff?r1=1.5&r2=1.5.2.1 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-python/ChangeLog,v retrieving revision 1.157.2.6 retrieving revision 1.157.2.7 diff -u -d -r1.157.2.6 -r1.157.2.7 --- ChangeLog 19 Apr 2005 16:17:12 -0000 1.157.2.6 +++ ChangeLog 26 Apr 2005 20:10:38 -0000 1.157.2.7 @@ -1,3 +1,10 @@ +2005-04-26 Benjamin Otte <in...@pu...> + + * gst/gstbuffer.override: + make Buffer() not use memory it doesn't own + * testsuite/test_buffer.py: + check that it doesn't 2005-04-19 Edward Hervey <bi...@bi...> * gst/gststructure.override: (_wrap_gst_structure_get_double): Index: gstbuffer.override RCS file: /cvs/gstreamer/gst-python/gst/gstbuffer.override,v retrieving revision 1.4 retrieving revision 1.4.2.1 diff -u -d -r1.4 -r1.4.2.1 --- gstbuffer.override 14 Dec 2004 16:53:09 -0000 1.4 +++ gstbuffer.override 26 Apr 2005 20:10:38 -0000 1.4.2.1 @@ -49,13 +49,14 @@ &data, &size, &buf_size)) return -1; + if (size < 0) { + PyErr_SetString(PyExc_TypeError, "buffer size must be >= 0"); + return -1; + } self->gtype = GST_TYPE_BUFFER; self->free_on_dealloc = FALSE; - if (buf_size != -1) - self->boxed = gst_buffer_new_and_alloc(buf_size); - else - self->boxed = gst_buffer_new(); + self->boxed = gst_buffer_new_and_alloc(buf_size > size ? buf_size : size); if (!self->boxed) { PyErr_SetString(PyExc_RuntimeError, "could not create GstBuffer object"); @@ -65,12 +66,7 @@ if (data == NULL) return 0; - if (buf_size != -1 && buf_size != size) { - PyErr_Format(PyExc_TypeError, "data must be of length %d, not %d", size, buf_size); - return -1; - } - - GST_BUFFER_DATA (self->boxed) = data; + memcpy (GST_BUFFER_DATA (self->boxed), data, size); GST_BUFFER_SIZE (self->boxed) = size; return 0; Index: test_buffer.py RCS file: /cvs/gstreamer/gst-python/testsuite/test_buffer.py,v retrieving revision 1.5 retrieving revision 1.5.2.1 diff -u -d -r1.5 -r1.5.2.1 --- test_buffer.py 14 Dec 2004 16:53:09 -0000 1.5 +++ test_buffer.py 26 Apr 2005 20:10:39 -0000 1.5.2.1 @@ -1,4 +1,5 @@ import sys +import gc from common import gobject, gst, unittest class BufferTest(unittest.TestCase): @@ -9,7 +10,13 @@ def testBufferStr(self): buffer = gst.Buffer('test') assert str(buffer) == 'test' - + def testBufferAlloc(self): + bla = 'mooooooo' + buffer = gst.Buffer(bla + '12345') + gc.collect () + assert str(buffer) == 'mooooooo12345' + def testBufferBadConstructor(self): self.assertRaises(TypeError, gst.Buffer, 'test', 0) |
From: <co...@fr...> - 2005-05-01 16:32:30
|
CVS Root: /cvs/gstreamer Module: gst-python Changes by: company Date: Mon May 02 2005 02:32:29 EST Branch: BRANCH-GSTREAMER-0_8 Log message: * gst/gst-types.c: remove, it's called gst-argtypes.c these days * gst/common.h: * gst/gst-argtypes.c: (pygst_caps_from_pyobject): add function to transform a PyObject to a GstCaps* * gst/gstcaps.override: implement more sequence functions, deprecate caps.get_structure() in favour of caps[i] and make the structure-by-reference stuff work * gst/gststructure.override: make structures from caps work by reference but don't die a horrible death if the caps get removed before the structure is * testsuite/Makefile.am: run with G_DEBUG=fatal_warnings so we crash on g_warnings in C code * testsuite/test_caps.py: add some checks Modified files: . : ChangeLog gst : common.h gst-argtypes.c gstcaps.override gststructure.override testsuite : Makefile.am test_caps.py Removed files: gst : gst-types.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/ChangeLog.diff?r1=1.157.2.12&r2=1.157.2.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/common.h.diff?r1=1.6.2.1&r2=1.6.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gst-argtypes.c.diff?r1=1.2&r2=1.2.2.1 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gst-types.c http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gstcaps.override.diff?r1=1.1&r2=1.1.2.1 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gststructure.override.diff?r1=1.1.2.3&r2=1.1.2.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/testsuite/Makefile.am.diff?r1=1.14&r2=1.14.2.1 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/testsuite/test_caps.py.diff?r1=1.6&r2=1.6.2.1 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-python/ChangeLog,v retrieving revision 1.157.2.12 retrieving revision 1.157.2.13 diff -u -d -r1.157.2.12 -r1.157.2.13 --- ChangeLog 30 Apr 2005 19:14:20 -0000 1.157.2.12 +++ ChangeLog 1 May 2005 16:32:16 -0000 1.157.2.13 @@ -1,3 +1,21 @@ +2005-05-01 Benjamin Otte <in...@pu...> + + * gst/gst-types.c: + remove, it's called gst-argtypes.c these days + * gst/common.h: + * gst/gst-argtypes.c: (pygst_caps_from_pyobject): + add function to transform a PyObject to a GstCaps* + * gst/gstcaps.override: + implement more sequence functions, deprecate caps.get_structure() in + favour of caps[i] and make the structure-by-reference stuff work + * gst/gststructure.override: + make structures from caps work by reference but don't die a horrible + death if the caps get removed before the structure is + * testsuite/Makefile.am: + run with G_DEBUG=fatal_warnings so we crash on g_warnings in C code + * testsuite/test_caps.py: + add some checks 2005-04-30 Benjamin Otte <ot...@gn...> * gst/gst.override: Index: common.h RCS file: /cvs/gstreamer/gst-python/gst/common.h,v retrieving revision 1.6.2.1 retrieving revision 1.6.2.2 diff -u -d -r1.6.2.1 -r1.6.2.2 --- common.h 30 Apr 2005 19:06:42 -0000 1.6.2.1 +++ common.h 1 May 2005 16:32:17 -0000 1.6.2.2 @@ -44,8 +44,10 @@ PyObject *func, *data; } PyGstCustomNotify; +/* from gst-types.c */ gboolean pygst_data_from_pyobject(PyObject *object, GstData **data); PyObject *pygst_data_to_pyobject(GstData *data); +GstCaps *pygst_caps_from_pyobject (PyObject *object, gboolean *copy); #endif /* __COMMON_H__ */ Index: gst-argtypes.c RCS file: /cvs/gstreamer/gst-python/gst/gst-argtypes.c,v retrieving revision 1.2 retrieving revision 1.2.2.1 diff -u -d -r1.2 -r1.2.2.1 --- gst-argtypes.c 3 May 2004 10:46:49 -0000 1.2 +++ gst-argtypes.c 1 May 2005 16:32:17 -0000 1.2.2.1 @@ -61,6 +61,44 @@ return 0; } +/* This function will return a copy, unless the following is all TRUE: + * - The given PyObject contains a GstCaps already + * - The copy parameter is non-NULL + * - New years is the first of January + * If copy is non-NULL, it is set to TRUE if a copy was made. + * If the PyObject could not be converted to a caps, a TypeError is raised + * and NULL is returned. + */ +GstCaps * +pygst_caps_from_pyobject (PyObject *object, gboolean *copy) +{ + if (pyg_boxed_check(object, GST_TYPE_CAPS)) { + GstCaps *caps = pyg_boxed_get(object, GstCaps); + if (copy) { + *copy = FALSE; + return caps; + } else { + return gst_caps_copy (caps); + } + } else if (pyg_boxed_check(object, GST_TYPE_STRUCTURE)) { + GstStructure *structure = pyg_boxed_get(object, GstStructure); + if (copy) + *copy = TRUE; + return gst_caps_new_full (gst_structure_copy (structure), NULL); + } else if (PyString_Check (object)) { + GstCaps *caps = gst_caps_from_string (PyString_AsString (object)); + if (!caps) { + PyErr_SetString(PyExc_TypeError, "could not convert string to GstCaps"); + return NULL; + return caps; + } + PyErr_SetString(PyExc_TypeError, "could not convert to GstCaps"); + return NULL; +} void _pygst_register_boxed_types(PyObject *moddict) { --- gst-types.c DELETED --- Index: gstcaps.override RCS file: /cvs/gstreamer/gst-python/gst/gstcaps.override,v retrieving revision 1.1 retrieving revision 1.1.2.1 diff -u -d -r1.1 -r1.1.2.1 --- gstcaps.override 1 Jan 2005 15:23:42 -0000 1.1 +++ gstcaps.override 1 May 2005 16:32:17 -0000 1.1.2.1 @@ -1,6 +1,7 @@ /* -*- Mode: C; c-basic-offset: 4 -*- */ /* gst-python * Copyright (C) 2005 Johan Dahlin + * 2005 Benjamin Otte <ot...@gn...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -18,13 +19,78 @@ * Boston, MA 02111-1307, USA. * * Author: Johan Dahlin <jo...@gn...> + * Benjamin Otte <ot...@gn...> */ %% +headers +/* This is a (hopefully) smart hack to allow access to a caps' + * structures without falling into traps when the caps get destroyed + * before the structures get. + * This Hash Table uses the structure PyObjects as keys and the caps + * PyObjects as values. No clue if this is a fast data structure but it + * probably doesn't matter anyway. +static GHashTable *structure_caps_map = NULL; +static void +pygst_caps_map_add (PyObject *structure, PyObject *caps) + /* we can't have free_on_dealloc stuff in here */ + g_assert (((PyGBoxed *)structure)->free_on_dealloc == FALSE); + g_hash_table_insert (structure_caps_map, structure, caps); +pygst_caps_map_remove_structure (PyObject *structure) + g_hash_table_remove (structure_caps_map, structure); +static gboolean +pygst_caps_map_foreach (gpointer structure, gpointer caps, gpointer match) + PyGBoxed *boxed = structure; + + if (match != caps) + return FALSE; + g_assert (boxed->free_on_dealloc == FALSE); + boxed->boxed = gst_structure_copy (boxed->boxed); + boxed->free_on_dealloc = TRUE; + return TRUE; +pygst_caps_map_modified (PyObject *caps) + g_hash_table_foreach_remove (structure_caps_map, pygst_caps_map_foreach, caps); +%% +init + structure_caps_map = g_hash_table_new (g_direct_hash, g_direct_equal); ignore gst_caps_new_simple gst_caps_new_full gst_caps_set_simple +override gst_caps_get_structure kwargs +static PyObject *pygst_caps_sq_item(PyObject *self, int i); +static PyObject * +_wrap_gst_caps_get_structure(PyObject *self, PyObject *args, PyObject *kwargs) + static char *kwlist[] = { "index", NULL }; + int index; + if (PyErr_Warn(PyExc_DeprecationWarning, "caps.get_structure(i) is deprecated, use caps[i]") < 0) + return NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:GstCaps.get_structure", kwlist, &index)) + return pygst_caps_sq_item (self, index); override gst_caps_new_empty kwargs static int _wrap_gst_caps_new_empty(PyGBoxed *self, PyObject *args, PyObject *kwargs) @@ -40,89 +106,141 @@ if (len == 0) { /* 0 length creates a new empty caps */ self->boxed = gst_caps_new_empty(); - goto beach; } else if (len == 1) { - /* 1 length is either a string or a structure */ item = PyTuple_GetItem(args, 0); - if (PyString_Check(item)) { - self->boxed = gst_caps_from_string(PyString_AsString(item)); - goto beach; - } else if (!pyg_boxed_check(item, GST_TYPE_STRUCTURE)) { - PyErr_SetString(PyExc_TypeError, "argument must be a string or a GstStructure"); - return -1; - } - } - /* it's either one GstStructure or several whatevers */ - self->boxed = gst_caps_new_empty(); - for (i = 0; i < len; i++) - { - item = PyTuple_GetItem(args, i); - if (!pyg_boxed_check(item, GST_TYPE_STRUCTURE)) - { - PyErr_SetString(PyExc_TypeError, "argument must be a GstStructure"); - gst_caps_free(self->boxed); + /* 1 length is either a string or a structure */ + self->boxed = pygst_caps_from_pyobject (item, NULL); + } else { + /* it's multiple arguments that can all be made to caps */ + GstCaps *append; + self->boxed = gst_caps_new_empty(); + for (i = 0; i < len; i++) + { + item = PyTuple_GetItem(args, i); + append = pygst_caps_from_pyobject (item, NULL); + if (!append) { + gst_caps_free (self->boxed); + self->boxed = NULL; + break; + } + gst_caps_append (self->boxed, append); } - gst_caps_append_structure(self->boxed, pyg_boxed_get(item, GstStructure)); } - -beach: if (!self->boxed) { - PyErr_SetString(PyExc_RuntimeError, "could not create GstCaps object"); + PyErr_SetString(PyExc_TypeError, "wrong arguemntes when creating GstCaps object"); return -1; return 0; -override gst_caps_get_structure kwargs -static PyObject * -_wrap_gst_caps_get_structure(PyObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "index", NULL }; - int index; - GstStructure *ret; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:GstCaps.get_structure", kwlist, &index)) - return NULL; - ret = gst_caps_get_structure(pyg_boxed_get(self, GstCaps), index); - - /* pyg_boxed_new handles NULL checking */ - return pyg_boxed_new(GST_TYPE_STRUCTURE, ret, FALSE, FALSE); -} +override-slot GstCaps.tp_basicsize +int _wrap_gst_caps_tp_basicsize = sizeof (GBoxed); override-slot GstCaps.tp_as_sequence -caps_length(PyGObject *self) +pygst_caps_sq_length(PyObject *self) - return gst_caps_get_size((GstCaps*)self->obj); + GstCaps *caps = pyg_boxed_get (self, GstCaps); + return gst_caps_get_size(caps); static PyObject * -caps_item(PyGObject *self, int i) - +pygst_caps_sq_concat (PyObject *self, PyObject *append) + GstCaps *caps2 = pygst_caps_from_pyobject (append, NULL); + if (!caps2) + return NULL; + caps = gst_caps_copy (caps); + gst_caps_append (caps, caps2); + return pyg_boxed_new(GST_TYPE_CAPS, caps, FALSE, TRUE); +pygst_caps_sq_item(PyObject *self, int i) GstStructure *structure; + PyObject *ret; - if (i < 0 || i >= gst_caps_get_size((GstCaps*)self->obj)) { + if (i < 0 || i >= gst_caps_get_size(caps)) { PyErr_SetString(PyExc_IndexError, "list index out of range"); return NULL; - structure = gst_caps_get_structure((GstCaps*)self->obj, i); - return pyg_boxed_new(GST_TYPE_STRUCTURE, structure, TRUE, TRUE); + structure = gst_caps_get_structure(caps, i); + + /* pyg_boxed_new handles NULL checking */ + ret = pyg_boxed_new(GST_TYPE_STRUCTURE, + gst_caps_get_structure(pyg_boxed_get(self, GstCaps), i), + FALSE, FALSE); + if (ret) + pygst_caps_map_add (ret, self); + return ret; +/* FIXME: This syntax sucks */ +pygst_caps_sq_slice(PyObject *self, int start, int end) + GstCaps *ret = gst_caps_new_empty (); + int i; + if (start < 0) + start = 0; + if (end > gst_caps_get_size (caps)) + end = gst_caps_get_size (caps); + for (i = start; i < end; i++) + gst_caps_append_structure (ret, gst_structure_copy (gst_caps_get_structure (caps, i))); + + return pyg_boxed_new(GST_TYPE_CAPS, ret, FALSE, TRUE); +static +PyObject * +pygst_caps_sq_inplace_concat (PyObject *self, PyObject *concat) + GstCaps *caps2 = pygst_caps_from_pyobject (concat, NULL); + return self; static PySequenceMethods _wrap_gst_caps_tp_as_sequence = { - (inquiry)caps_length, /* mp_length */ - NULL, - (intargfunc)caps_item, - NULL, + pygst_caps_sq_length, + pygst_caps_sq_concat, + NULL, /* doesn't make sense, because it'd still be the same */ + pygst_caps_sq_item, + pygst_caps_sq_slice, + NULL, /* doesn't make sense, you can only append */ + NULL, /* doesn't make sense really, unless you use is_subset */ + pygst_caps_sq_inplace_concat, + NULL /* doesn't make sense, because it'd still be the same */ }; +override-slot GstCaps.tp_dealloc +_wrap_gst_caps_tp_dealloc (PyObject *self) + PyGBoxed *boxed = (PyGBoxed *) self; + if (boxed->free_on_dealloc && boxed->boxed) { + pygst_caps_map_modified (self); + gst_caps_free (boxed->boxed); + self->ob_type->tp_free((PyObject *)self); override-slot GstCaps.tp_str _wrap_gst_caps_tp_str(PyGObject *self) Index: gststructure.override RCS file: /cvs/gstreamer/gst-python/gst/gststructure.override,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -d -r1.1.2.3 -r1.1.2.4 --- gststructure.override 19 Apr 2005 16:17:13 -0000 1.1.2.3 +++ gststructure.override 1 May 2005 16:32:17 -0000 1.1.2.4 @@ -328,3 +328,18 @@ /* pyg_boxed_new handles NULL checking */ return pyg_boxed_new(GST_TYPE_STRUCTURE, ret, TRUE, TRUE); +override-slot GstStructure.tp_dealloc +_wrap_gst_structure_tp_dealloc (PyObject *self) + gst_structure_free (boxed->boxed); + } else if (boxed->boxed) { + pygst_caps_map_remove_structure (self); Index: Makefile.am RCS file: /cvs/gstreamer/gst-python/testsuite/Makefile.am,v retrieving revision 1.14 retrieving revision 1.14.2.1 diff -u -d -r1.14 -r1.14.2.1 --- Makefile.am 10 Jan 2005 17:29:47 -0000 1.14 +++ Makefile.am 1 May 2005 16:32:17 -0000 1.14.2.1 @@ -31,7 +31,7 @@ test_xml.py check-local: testhelper.la - @PYTHONPATH=$(PYTHONPATH):$(top_builddir):$(top_builddir)/gst/.libs $(PYTHON) $(srcdir)/runtests.py + @G_DEBUG=fatal_warnings PYTHONPATH=$(PYTHONPATH):$(top_builddir):$(top_builddir)/gst/.libs $(PYTHON) $(srcdir)/runtests.py @rm -fr *.pyc EXTRA_DIST = $(tests) common.py runtests.py test-object.h Index: test_caps.py RCS file: /cvs/gstreamer/gst-python/testsuite/test_caps.py,v retrieving revision 1.6 diff -u -d -r1.6 -r1.6.2.1 --- test_caps.py 6 Aug 2004 19:03:50 -0000 1.6 +++ test_caps.py 1 May 2005 16:32:17 -0000 1.6.2.1 @@ -61,6 +61,14 @@ assert isinstance(struct['height'], float) assert struct['height'] == 20.0 + def testCapsRefernceStructs(self): + 'test that shows why it\'s not a good idea to use structures by reference' + caps = gst.Caps('hi/mom,width=0') + structure = caps.get_structure(0) + del caps + assert structure['width'] == 0 def testCapsStructureChange(self): 'test if changing the structure of the caps works by reference' assert self.structure['width'] == 10 @@ -80,6 +88,13 @@ # This causes segfault! #self.assertRaises(TypeError, gst.Caps, struct, 10, None) + def testTrueFalse(self): + 'test that comparisons using caps work the intended way' + #assert gst.Caps('ANY') # not empty even though it has no structures + assert not gst.Caps() # empty + assert not gst.Caps('EMPTY') # also empty + assert gst.Caps('your/mom') if __name__ == "__main__": unittest.main() |
From: <co...@fr...> - 2005-05-02 02:40:58
|
CVS Root: /cvs/gstreamer Module: gst-python Changes by: company Date: Mon May 02 2005 12:40:56 EST Branch: BRANCH-GSTREAMER-0_8 Log message: * gst/Makefile.am: running the code generator depends on the files it uses * gst/arg-types.py: add GstCaps parsing * gst/gstelement.override: make element.link take an optional caps parameter, deprecate element.link_filtered * testsuite/test_caps.py: replace caps.get_strcuture(i) calls with caps[i], the deprecation warnings are annoying Modified files: . : ChangeLog gst : Makefile.am arg-types.py gstelement.override testsuite : test_caps.py Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/ChangeLog.diff?r1=1.157.2.14&r2=1.157.2.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/Makefile.am.diff?r1=1.36.2.1&r2=1.36.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/arg-types.py.diff?r1=1.6.2.1&r2=1.6.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gstelement.override.diff?r1=1.1&r2=1.1.2.1 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/testsuite/test_caps.py.diff?r1=1.6.2.1&r2=1.6.2.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-python/ChangeLog,v retrieving revision 1.157.2.14 retrieving revision 1.157.2.15 diff -u -d -r1.157.2.14 -r1.157.2.15 --- ChangeLog 1 May 2005 17:36:38 -0000 1.157.2.14 +++ ChangeLog 2 May 2005 02:40:44 -0000 1.157.2.15 @@ -1,3 +1,16 @@ +2005-05-02 Benjamin Otte <in...@pu...> + + * gst/Makefile.am: + running the code generator depends on the files it uses + * gst/arg-types.py: + add GstCaps parsing + * gst/gstelement.override: + make element.link take an optional caps parameter, deprecate + element.link_filtered + * testsuite/test_caps.py: + replace caps.get_strcuture(i) calls with caps[i], the deprecation + warnings are annoying 2005-05-01 Thomas Vander Stichele <thomas at apestaart dot org> * testsuite/test_interface.py: Index: Makefile.am RCS file: /cvs/gstreamer/gst-python/gst/Makefile.am,v retrieving revision 1.36.2.1 retrieving revision 1.36.2.2 diff -u -d -r1.36.2.1 -r1.36.2.2 --- Makefile.am 14 Apr 2005 11:47:57 -0000 1.36.2.1 +++ Makefile.am 2 May 2005 02:40:44 -0000 1.36.2.2 @@ -30,6 +30,7 @@ INCLUDES = $(PYTHON_INCLUDES) EXTRA_DIST = $(defs_DATA) common.h arg-types.py ltihooks.py PYGTK_DEFSDIR = @PYGTK_DEFSDIR@ +GEN_FILES = arg-types.py gst-types.defs # GStreamer bindings _gst_la_CFLAGS = $(common_cflags) @@ -49,7 +50,7 @@ GST_DEFS = gst.defs gst-types.defs CLEANFILES = gst.c EXTRA_DIST += $(GST_DEFS) $(GST_OVERRIDES) -gst.c: $(GST_DEFS) $(GST_OVERRIDES) +gst.c: $(GST_DEFS) $(GST_OVERRIDES) $(GEN_FILES) # gst-play bindings play_la_CFLAGS = $(common_cflags) $(GST_PLAY_CFLAGS) @@ -61,7 +62,7 @@ PLAY_DEFS = play.defs CLEANFILES += play.c EXTRA_DIST += $(PLAY_DEFS) $(PLAY_OVERRIDES) -play.c: $(PLAY_DEFS) $(PLAY_OVERRIDES) +play.c: $(PLAY_DEFS) $(PLAY_OVERRIDES) $(GEN_FILES) # GStreamer interfaces bindings interfaces_la_CFLAGS = $(common_cflags) $(GST_INTERFACES_CFLAGS) @@ -73,9 +74,9 @@ INTERFACES_DEFS = interfaces.defs xoverlay.defs xwindowlistener.defs CLEANFILES += interfaces.c EXTRA_DIST += $(INTERFACES_DEFS) $(INTERFACES_OVERRIDES) -interfaces.c: $(INTERFACES_DEFS) $(INTERFACES_OVERRIDES) +interfaces.c: $(INTERFACES_DEFS) $(INTERFACES_OVERRIDES) $(GEN_FILES) -.defs.c: +.defs.c: (cd $(srcdir) \ && $(PYGTK_CODEGEN) \ --load-types $(srcdir)/arg-types.py \ Index: arg-types.py RCS file: /cvs/gstreamer/gst-python/gst/arg-types.py,v retrieving revision 1.6.2.1 retrieving revision 1.6.2.2 diff -u -d -r1.6.2.1 -r1.6.2.2 --- arg-types.py 30 Apr 2005 19:06:42 -0000 1.6.2.1 +++ arg-types.py 2 May 2005 02:40:44 -0000 1.6.2.2 @@ -86,7 +86,7 @@ info.add_parselist('O', ['&py'+pname], [pname]) info.arglist.append(pname) self.names["name"] = pname - info.codebefore.append(self.parm %self.names) + info.codebefore.append(self.parm % self.names) info.codeafter.append(self.parmp % self.names); def write_return(self, ptype, ownsreturn, info): info.varlist.add('PyObject', '*xml = _gst_get_libxml2_module()') @@ -103,12 +103,64 @@ "xptr":"xmlDocPtr", "xwrap":"libxml_xmlDocPtrWrap"} +class GstCapsArg(ArgType): + """GstCaps node generator""" + before = (' %(name)s = pygst_caps_from_pyobject (py_%(name)s, %(namecopy)s);\n') + beforenull = (' if (py_%(name)s == Py_None)\n' + ' %(name)s = NULL;\n' + ' else\n' + ' ' + before) + after = (' if (%(name)s && %(name)s_is_copy)\n' + ' gst_caps_free (%(name)s);\n') + def write_param(self, ptype, pname, pdflt, pnull, info): + if ptype == 'const-GstCaps*': + self.write_const_param(pname, pdflt, pnull, info) + elif ptype == 'GstCaps*': + self.write_normal_param(pname, pdflt, pnull, info) + else: + raise RuntimeError, "write_param not implemented for %s" % ptype + def write_const_param(self, pname, pdflt, pnull, info): + info.varlist.add('PyObject', '*py_'+pname) + info.varlist.add('GstCaps', '*'+pname) + info.varlist.add('gboolean', pname+'_is_copy') + info.add_parselist('O', ['&py_'+pname], [pname]) + info.arglist.append(pname) + if pnull: + info.codebefore.append (self.beforenull % { 'name' : pname, 'namecopy' : '&'+pname+'_is_copy' }) + info.codebefore.append (self.before % { 'name' : pname, 'namecopy' : '&'+pname+'_is_copy' }) + info.codeafter.append (self.after % { 'name' : pname, 'namecopy' : '&'+pname+'_is_copy' }) + def write_normal_param(self, pname, pdflt, pnull, info): + info.codebefore.append (self.beforenull % { 'name' : pname, 'namecopy' : 'NULL' }) + info.codebefore.append (self.before % { 'name' : pname, 'namecopy' : 'NULL' }) + def write_return(self, ptype, ownsreturn, info): + if ptype == 'GstCaps*': + info.varlist.add('GstCaps', '*ret') + copyval = 'FALSE' + elif ptype == 'const-GstCaps*': + info.varlist.add('const GstCaps', '*ret') + copyval = 'TRUE' + raise RuntimeError, "write_return not implemented for %s" % ptype + info.codeafter.append(' return pyg_boxed_new (GST_TYPE_CAPS, ret, '+copyval+', TRUE);') matcher.register('GstData*', GstDataPtrArg()) matcher.register('GstClockTime', UInt64Arg()) matcher.register('GstClockTimeDiff', Int64Arg()) matcher.register('xmlNodePtr', XmlNodeArg()) matcher.register('xmlDocPtr', XmlDocArg()) +matcher.register('GstCaps', GstCapsArg()) #FIXME: does this work? +matcher.register('GstCaps*', GstCapsArg()) #FIXME: does this work? +matcher.register('const-GstCaps*', GstCapsArg()) arg = PointerArg('gpointer', 'G_TYPE_POINTER') matcher.register('GstClockID', arg) Index: gstelement.override RCS file: /cvs/gstreamer/gst-python/gst/gstelement.override,v retrieving revision 1.1 retrieving revision 1.1.2.1 diff -u -d -r1.1 -r1.1.2.1 --- gstelement.override 1 Jan 2005 15:23:42 -0000 1.1 +++ gstelement.override 2 May 2005 02:40:44 -0000 1.1.2.1 @@ -188,14 +188,23 @@ static PyObject * _wrap_gst_element_link(PyGObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = { "dest", NULL }; + static char *kwlist[] = { "dest", "filtercaps", NULL }; PyGObject *dest; + PyObject *py_caps = NULL; int ret; + GstCaps *caps = NULL; + gboolean caps_is_copy; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!:GstElement.link", - kwlist, &PyGstElement_Type, &dest)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O:GstElement.link", + kwlist, &PyGstElement_Type, &dest, &py_caps)) return NULL; - ret = gst_element_link(GST_ELEMENT(self->obj), GST_ELEMENT(dest->obj)); + if (py_caps == NULL) + caps = NULL; + else + caps = pygst_caps_from_pyobject (py_caps, &caps_is_copy); + ret = gst_element_link_filtered(GST_ELEMENT(self->obj), GST_ELEMENT(dest->obj), caps); + if (caps && caps_is_copy) + gst_caps_free (caps); if (!ret) { PyErr_Format(PyGstExc_LinkError, "failed to link %s with %s", @@ -217,30 +226,10 @@ PyObject *py_filtercaps; GstCaps *filtercaps = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "O!O:GstElement.link_filtered", - kwlist, &PyGstElement_Type, - &dest, &py_filtercaps)) - return NULL; - if (pyg_boxed_check(py_filtercaps, GST_TYPE_CAPS)) - filtercaps = pyg_boxed_get(py_filtercaps, GstCaps); - else { - PyErr_SetString(PyExc_TypeError, "filtercaps should be a GstCaps"); - } - ret = gst_element_link_filtered(GST_ELEMENT(self->obj), - GST_ELEMENT(dest->obj), - filtercaps); - if (!ret) { - PyErr_Format(PyGstExc_LinkError, - "failed to link %s with %s", - GST_ELEMENT_NAME(self->obj), - GST_ELEMENT_NAME(dest->obj)); - return PyBool_FromLong(ret); + + if (PyErr_Warn(PyExc_DeprecationWarning, "element.link_filtered is deprecated, use element.link") < 0) + return NULL; + return _wrap_gst_element_link (self, args, kwargs); } %% Index: test_caps.py RCS file: /cvs/gstreamer/gst-python/testsuite/test_caps.py,v --- test_caps.py 1 May 2005 16:32:17 -0000 1.6.2.1 +++ test_caps.py 2 May 2005 02:40:44 -0000 1.6.2.2 @@ -4,7 +4,7 @@ class CapsTest(unittest.TestCase): def setUp(self): self.caps = gst.caps_from_string('video/x-raw-yuv,width=10,framerate=5.0;video/x-raw-rgb,width=15,framerate=10.0') - self.structure = self.caps.get_structure(0) + self.structure = self.caps[0] def testCapsMime(self): mime = self.structure.get_name() @@ -64,7 +64,7 @@ def testCapsRefernceStructs(self): 'test that shows why it\'s not a good idea to use structures by reference' caps = gst.Caps('hi/mom,width=0') - structure = caps.get_structure(0) + structure = caps[0] del caps assert structure['width'] == 0 |
From: <co...@fr...> - 2005-05-02 22:40:29
|
CVS Root: /cvs/gstreamer Module: gst-python Changes by: company Date: Tue May 03 2005 08:40:26 EST Branch: BRANCH-GSTREAMER-0_8 Log message: * testsuite/Makefile.am: run tests with GST_DEBUG=*:0 so they don't produce any debugging output * testsuite/test_element.py: don't disable stderr * gst/gstbuffer.override: initialize size correctly Modified files: . : ChangeLog gst : gstbuffer.override testsuite : Makefile.am test_element.py Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/ChangeLog.diff?r1=1.157.2.17&r2=1.157.2.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gstbuffer.override.diff?r1=1.4.2.4&r2=1.4.2.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/testsuite/Makefile.am.diff?r1=1.14.2.1&r2=1.14.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/testsuite/test_element.py.diff?r1=1.15&r2=1.15.2.1 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-python/ChangeLog,v retrieving revision 1.157.2.17 retrieving revision 1.157.2.18 diff -u -d -r1.157.2.17 -r1.157.2.18 --- ChangeLog 2 May 2005 22:23:07 -0000 1.157.2.17 +++ ChangeLog 2 May 2005 22:40:14 -0000 1.157.2.18 @@ -1,3 +1,13 @@ +2005-05-03 Benjamin Otte <in...@pu...> + + * testsuite/Makefile.am: + run tests with GST_DEBUG=*:0 so they don't produce any debugging + output + * testsuite/test_element.py: + don't disable stderr + * gst/gstbuffer.override: + initialize size correctly 2005-05-03 Thomas Vander Stichele <thomas at apestaart dot org> * testsuite/runtests.py: also return exit code 1 in case of errors Index: Makefile.am RCS file: /cvs/gstreamer/gst-python/testsuite/Makefile.am,v retrieving revision 1.14.2.1 retrieving revision 1.14.2.2 diff -u -d -r1.14.2.1 -r1.14.2.2 --- Makefile.am 1 May 2005 16:32:17 -0000 1.14.2.1 +++ Makefile.am 2 May 2005 22:40:14 -0000 1.14.2.2 @@ -31,7 +31,7 @@ test_xml.py check-local: testhelper.la - @G_DEBUG=fatal_warnings PYTHONPATH=$(PYTHONPATH):$(top_builddir):$(top_builddir)/gst/.libs $(PYTHON) $(srcdir)/runtests.py + @G_DEBUG=fatal_warnings GST_DEBUG=*:0 PYTHONPATH=$(PYTHONPATH):$(top_builddir):$(top_builddir)/gst/.libs $(PYTHON) $(srcdir)/runtests.py @rm -fr *.pyc EXTRA_DIST = $(tests) common.py runtests.py test-object.h Index: test_element.py RCS file: /cvs/gstreamer/gst-python/testsuite/test_element.py,v retrieving revision 1.15 retrieving revision 1.15.2.1 diff -u -d -r1.15 -r1.15.2.1 --- test_element.py 11 Oct 2004 08:47:37 -0000 1.15 +++ test_element.py 2 May 2005 22:40:14 -0000 1.15.2.1 @@ -2,7 +2,6 @@ # # testsuite for gstreamer.Element -import common from common import gst, unittest class ElementTest(unittest.TestCase): @@ -44,7 +43,7 @@ self.error = True self.element.connect('error', error_cb) - common.run_silent(self.element.set_state, state) + self.element.set_state (state) assert self.error, 'error not set' #assert error_message.find('ERROR') != -1 Index: gstbuffer.override RCS file: /cvs/gstreamer/gst-python/gst/gstbuffer.override,v retrieving revision 1.4.2.4 retrieving revision 1.4.2.5 diff -u -d -r1.4.2.4 -r1.4.2.5 --- gstbuffer.override 30 Apr 2005 19:06:42 -0000 1.4.2.4 +++ gstbuffer.override 2 May 2005 22:40:14 -0000 1.4.2.5 @@ -41,7 +41,7 @@ { static char *kwlist[] = { "data", "buffer_size", NULL }; char *data = NULL; - int size; + int size = 0; int buf_size = -1; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|z#i:GstBuffer.__init__", kwlist, |
From: <co...@fr...> - 2005-05-03 02:07:54
|
CVS Root: /cvs/gstreamer Module: gst-python Changes by: company Date: Tue May 03 2005 12:07:53 EST Branch: BRANCH-GSTREAMER-0_8 Log message: * gst/pygstvalue.c: * gst/gst-argtypes.c: * gst/gst.override: define NO_IMPORT_PYGOBJECT to have a correct extern declaration reenable _pygst_element_init and ifdef it correctly * gst/arg-types.py: check errors * gst/gstcaps.override: - remove list append functionality. Sets don't support the + operator - implement richcompare and coerce, nonzero, or, xor and subtract number functions * testsuite/test_caps.py: add tests for the new stuff Modified files: . : ChangeLog gst : arg-types.py gst-argtypes.c gst.override gstcaps.override pygstvalue.c testsuite : test_caps.py Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/ChangeLog.diff?r1=1.157.2.22&r2=1.157.2.23 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/arg-types.py.diff?r1=1.6.2.2&r2=1.6.2.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gst-argtypes.c.diff?r1=1.2.2.1&r2=1.2.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gst.override.diff?r1=1.46.2.4&r2=1.46.2.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/gstcaps.override.diff?r1=1.1.2.1&r2=1.1.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/gst/pygstvalue.c.diff?r1=1.1.2.1&r2=1.1.2.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-python/testsuite/test_caps.py.diff?r1=1.6.2.2&r2=1.6.2.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-python/ChangeLog,v retrieving revision 1.157.2.22 retrieving revision 1.157.2.23 diff -u -d -r1.157.2.22 -r1.157.2.23 --- ChangeLog 3 May 2005 00:13:37 -0000 1.157.2.22 +++ ChangeLog 3 May 2005 02:07:39 -0000 1.157.2.23 @@ -1,3 +1,20 @@ +2005-05-03 Benjamin Otte <in...@pu...> + + * gst/pygstvalue.c: + * gst/gst-argtypes.c: + * gst/gst.override: + define NO_IMPORT_PYGOBJECT to have a correct extern declaration + reenable _pygst_element_init and ifdef it correctly + * gst/arg-types.py: + check errors + * gst/gstcaps.override: + - remove list append functionality. Sets don't support the + + operator + - implement richcompare and coerce, nonzero, or, xor and subtract + number functions + * testsuite/test_caps.py: + add tests for the new stuff 2005-05-03 Thomas Vander Stichele <thomas at apestaart dot org> * testsuite/Makefile.am: Index: test_caps.py RCS file: /cvs/gstreamer/gst-python/testsuite/test_caps.py,v retrieving revision 1.6.2.2 retrieving revision 1.6.2.3 diff -u -d -r1.6.2.2 -r1.6.2.3 --- test_caps.py 2 May 2005 02:40:44 -0000 1.6.2.2 +++ test_caps.py 3 May 2005 02:07:40 -0000 1.6.2.3 @@ -5,6 +5,8 @@ def setUp(self): self.caps = gst.caps_from_string('video/x-raw-yuv,width=10,framerate=5.0;video/x-raw-rgb,width=15,framerate=10.0') self.structure = self.caps[0] + self.any = gst.Caps("ANY") + self.empty = gst.Caps() def testCapsMime(self): mime = self.structure.get_name() @@ -91,10 +93,54 @@ def testTrueFalse(self): 'test that comparisons using caps work the intended way' - #assert gst.Caps('ANY') # not empty even though it has no structures - assert not gst.Caps() # empty + assert self.any # not empty even though it has no structures + assert not self.empty assert not gst.Caps('EMPTY') # also empty assert gst.Caps('your/mom') + def testComaprisons(self): + assert self.empty < self.any + assert self.empty < self.structure + assert self.empty < self.caps + assert self.caps < self.any + assert self.empty <= self.empty + assert self.caps <= self.caps + assert self.caps <= self.any + assert self.empty == "EMPTY" + assert self.caps != self.any + assert self.empty != self.any + assert self.any > self.empty + assert self.any >= self.empty + def testFilters(self): + name = 'video/x-raw-yuv' + filtercaps = gst.Caps(*[struct for struct in self.caps if struct.get_name() == name]) + intersection = self.caps & 'video/x-raw-yuv' + assert filtercaps == intersection + def doSubtract(self, set, subset): + '''mimic the test in GStreamer core's testsuite/caps/subtract.c''' + assert not set - set + assert not subset - subset + assert not subset - set + test = set - subset + assert test + test2 = test | subset + test = test2 - set + assert not test + #our own extensions foolow here + assert subset == set & subset + assert set == set | subset + assert set - subset == set ^ subset + def testSubtract(self): + self.doSubtract( + gst.Caps ("some/mime, _int = [ 1, 2 ], list = { \"A\", \"B\", \"C\" }"), + gst.Caps ("some/mime, _int = 1, list = \"A\"")) + gst.Caps ("some/mime, _double = (double) 1.0; other/mime, _int = { 1, 2 }"), + gst.Caps ("some/mime, _double = (double) 1.0")) if __name__ == "__main__": unittest.main() Index: arg-types.py RCS file: /cvs/gstreamer/gst-python/gst/arg-types.py,v --- arg-types.py 2 May 2005 02:40:44 -0000 1.6.2.2 +++ arg-types.py 3 May 2005 02:07:39 -0000 1.6.2.3 @@ -106,7 +106,9 @@ class GstCapsArg(ArgType): """GstCaps node generator""" - before = (' %(name)s = pygst_caps_from_pyobject (py_%(name)s, %(namecopy)s);\n') + before = (' %(name)s = pygst_caps_from_pyobject (py_%(name)s, %(namecopy)s);\n' + ' if (PyErr_Occurred())\n' + ' return NULL;\n') beforenull = (' if (py_%(name)s == Py_None)\n' ' %(name)s = NULL;\n' ' else\n' Index: gst-argtypes.c RCS file: /cvs/gstreamer/gst-python/gst/gst-argtypes.c,v retrieving revision 1.2.2.1 retrieving revision 1.2.2.2 diff -u -d -r1.2.2.1 -r1.2.2.2 --- gst-argtypes.c 1 May 2005 16:32:17 -0000 1.2.2.1 +++ gst-argtypes.c 3 May 2005 02:07:39 -0000 1.2.2.2 @@ -19,6 +19,10 @@ * Author: Johan Dahlin <jo...@gn...> */ +/* define this for all source files that don't run init_pygobject() + * before including pygobject.h */ +#define NO_IMPORT_PYGOBJECT #include <gst/gst.h> #include "common.h" Index: gst.override RCS file: /cvs/gstreamer/gst-python/gst/gst.override,v retrieving revision 1.46.2.4 retrieving revision 1.46.2.5 diff -u -d -r1.46.2.4 -r1.46.2.5 --- gst.override 2 May 2005 23:32:31 -0000 1.46.2.4 +++ gst.override 3 May 2005 02:07:39 -0000 1.46.2.5 @@ -22,6 +22,10 @@ %% headers #ifdef HAVE_CONFIG_H # include <config.h> #endif @@ -124,7 +128,7 @@ return TRUE; } -/* +#ifdef pyg_register_class_init PyTypeObject PyGstPadTemplate_Type; static int add_templates (gpointer gclass, PyObject *templates) @@ -181,9 +185,7 @@ gst_element_class_set_details (gclass, &gstdetails); return 0; -*/ _pygst_element_init (gpointer gclass, PyTypeObject *pyclass) { @@ -207,7 +209,7 @@ +#endif include Index: gstcaps.override RCS file: /cvs/gstreamer/gst-python/gst/gstcaps.override,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- gstcaps.override 1 May 2005 16:32:17 -0000 1.1.2.1 +++ gstcaps.override 3 May 2005 02:07:39 -0000 1.1.2.2 @@ -132,30 +132,209 @@ } return 0; -override-slot GstCaps.tp_basicsize -int _wrap_gst_caps_tp_basicsize = sizeof (GBoxed); +override-slot GstCaps.tp_richcompare +static gboolean +pygst_caps_is_true_subset (GstCaps *caps1, GstCaps *caps2) +{ + GstCaps *tmp; + gboolean ret; + + /* order is important here */ + if (gst_caps_is_any (caps1)) + return FALSE; + if (gst_caps_is_any (caps2)) + return TRUE; + if (gst_caps_is_empty (caps2)) + if (gst_caps_is_empty (caps1)) + tmp = gst_caps_subtract (caps1, caps2); + ret = gst_caps_is_empty (tmp); + gst_caps_free (tmp); + if (!ret) + tmp = gst_caps_subtract (caps2, caps1); + return !ret; +} +static PyObject * +_wrap_gst_caps_tp_richcompare (PyObject *py_caps1, PyObject *py_caps2, int comparison) + GstCaps *caps1, *caps2; + gboolean caps2_is_copy; + PyObject *ret; + caps1 = pyg_boxed_get (py_caps1, GstCaps); + caps2 = pygst_caps_from_pyobject (py_caps2, &caps2_is_copy); + if (PyErr_Occurred()) + return NULL; + switch (comparison) { + case Py_LT: + ret = pygst_caps_is_true_subset (caps1, caps2) ? Py_True : Py_False; + break; + case Py_LE: + ret = gst_caps_is_subset (caps1, caps2) ? Py_True : Py_False; + case Py_NE: + ret = gst_caps_is_equal (caps1, caps2) ? Py_False : Py_True; + case Py_EQ: + ret = gst_caps_is_equal (caps1, caps2) ? Py_True : Py_False; + case Py_GE: + ret = gst_caps_is_subset (caps2, caps1) ? Py_True : Py_False; + case Py_GT: + ret = pygst_caps_is_true_subset (caps2, caps1) ? Py_True : Py_False; + default: + PyErr_SetString (PyExc_RuntimeError, "invalid comparison operation"); + if (caps2 && caps2_is_copy) + gst_caps_free (caps2); + return NULL; + } + if (caps2 && caps2_is_copy) + gst_caps_free (caps2); + Py_INCREF (ret); + return ret; -override-slot GstCaps.tp_as_sequence +override-slot GstCaps.tp_as_number +/* In this number code, we mimic the Python set.Set datatype. + * The same operations are supported. If you want to have an operation + * supported for caps, add it to Python's Set type first. + */ +#define BINARY_FUNC(name,func) \ +static PyObject * \ +name (PyObject *py_caps1, PyObject *py_caps2) \ +{ \ + GstCaps *caps1, *caps2, *ret; \ + gboolean caps2_is_copy; \ +\ + caps1 = pyg_boxed_get (py_caps1, GstCaps); \ + caps2 = pygst_caps_from_pyobject (py_caps2, &caps2_is_copy); \ + if (PyErr_Occurred()) \ + return NULL; \ + ret = func (caps1, caps2); \ + if (caps2 && caps2_is_copy) \ + gst_caps_free (caps2); \ + return pyg_boxed_new (GST_TYPE_CAPS, ret, FALSE, TRUE); \ +BINARY_FUNC (pygst_caps_nb_subtract, gst_caps_subtract) +BINARY_FUNC (pygst_caps_nb_and, gst_caps_intersect) +BINARY_FUNC (pygst_caps_nb_or, gst_caps_union) +static GstCaps * +pygst_caps_xor (const GstCaps *caps1, const GstCaps *caps2) + GstCaps *intersect, *_union, *ret; + intersect = gst_caps_intersect (caps1, caps2); + _union = gst_caps_union (caps1, caps2); + ret = gst_caps_subtract (_union, intersect); + gst_caps_free (_union); + gst_caps_free (intersect); + gst_caps_do_simplify (ret); +BINARY_FUNC (pygst_caps_nb_xor, pygst_caps_xor) -pygst_caps_sq_length(PyObject *self) +pygst_caps_nb_nonzero (PyObject *py_caps) - GstCaps *caps = pyg_boxed_get (self, GstCaps); - return gst_caps_get_size(caps); + GstCaps *caps = pyg_boxed_get (py_caps, GstCaps); + if (gst_caps_is_empty (caps)) + return 0; + else + return 1; -static PyObject * -pygst_caps_sq_concat (PyObject *self, PyObject *append) +static int +pygst_caps_nb_coerce (PyObject **py_caps1, PyObject **py_caps2) - GstCaps *caps2 = pygst_caps_from_pyobject (append, NULL); + GstCaps *caps1, *caps2; + gboolean caps1_is_copy, caps2_is_copy; + caps1 = pygst_caps_from_pyobject (*py_caps1, &caps1_is_copy); + if (caps1) + caps2 = pygst_caps_from_pyobject (*py_caps2, &caps2_is_copy); + if (PyErr_Occurred ()) { + PyErr_Clear (); + if (caps1 && !caps1_is_copy) + gst_caps_free (caps1); + if (caps2 && !caps2_is_copy) + gst_caps_free (caps2); + /* if they're not copies, they're caps already */ + if (caps1_is_copy) + *py_caps1 = pyg_boxed_new (GST_TYPE_CAPS, caps1, FALSE, TRUE); + Py_INCREF (*py_caps1); + if (caps2_is_copy) + *py_caps2 = pyg_boxed_new (GST_TYPE_CAPS, caps2, FALSE, TRUE); + Py_INCREF (*py_caps2); - if (!caps2) - return NULL; + return 0; - caps = gst_caps_copy (caps); - gst_caps_append (caps, caps2); - return pyg_boxed_new(GST_TYPE_CAPS, caps, FALSE, TRUE); +static PyNumberMethods _wrap_gst_caps_tp_as_number = { + 0, /* nb_add */ + pygst_caps_nb_subtract, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_divide */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* nb_positive */ + 0, /* nb_absolute */ + pygst_caps_nb_nonzero, /* nb_nonzero */ + 0, /* nb_invert */ + 0, /* nb_lshift */ + 0, /* nb_rshift */ + pygst_caps_nb_and, /* nb_and */ + pygst_caps_nb_xor, /* nb_xor */ + pygst_caps_nb_or, /* nb_or */ + pygst_caps_nb_coerce, /* nb_coerce */ + 0, /* nb_int */ + 0, /* nb_long */ + 0, /* nb_float */ + 0, /* nb_oct */ + 0, /* nb_hex */ + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply */ + 0, /* nb_inplace_divide */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + 0, /* nb_floor_divide */ + 0, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ +}; +%% +override-slot GstCaps.tp_as_sequence +pygst_caps_sq_length(PyObject *self) + GstCaps *caps = pyg_boxed_get (self, GstCaps); + return gst_caps_get_size(caps); static PyObject * @@ -200,30 +379,16 @@ return pyg_boxed_new(GST_TYPE_CAPS, ret, FALSE, TRUE); -static -PyObject * -pygst_caps_sq_inplace_concat (PyObject *self, PyObject *concat) -{ - GstCaps *caps2 = pygst_caps_from_pyobject (concat, NULL); - - return self; -} static PySequenceMethods _wrap_gst_caps_tp_as_sequence = { pygst_caps_sq_length, - pygst_caps_sq_concat, + NULL, /* not allowed for sets, use | instead of + */ NULL, /* doesn't make sense, because it'd still be the same */ pygst_caps_sq_item, pygst_caps_sq_slice, NULL, /* doesn't make sense, you can only append */ NULL, /* doesn't make sense really, unless you use is_subset */ - pygst_caps_sq_inplace_concat, NULL /* doesn't make sense, because it'd still be the same */ }; Index: pygstvalue.c RCS file: /cvs/gstreamer/gst-python/gst/Attic/pygstvalue.c,v --- pygstvalue.c 14 Apr 2005 14:22:07 -0000 1.1.2.1 +++ pygstvalue.c 3 May 2005 02:07:39 -0000 1.1.2.2 * Author: Andy Wingo <wi...@po...> #include "pygstvalue.h" |