gstreamer/gst/pygstiterator.c
Edward Hervey fd5f5ad8d0 gst/pygstiterator.c: Unref the return value, since the iterator refs them.
Original commit message from CVS:
* gst/pygstiterator.c:
Unref the return value, since the iterator refs them.
* testsuite/test_iterator.py:
Added more test cases, re-enabled gcverify now the bug is fixed
* gst/pygstminiobject.c: (pygstminiobject_register_wrapper),
(pygstminiobject_new), (pygstminiobject_dealloc):
Comments to better track the creation/destruction of PyGstMiniObject
Fixed naming (gst.GstMiniObject => gst.MiniObject)
* testsuite/python.supp:
Updated python specific valgrind suppressions to latest version and
added x86_64 cases
* testsuite/gstpython.supp:
Series of suppressions for errors/leaks not solvable within gst-python
* testsuite/Makefile.am:
Added gstpython.supp
2005-10-07 16:21:22 +00:00

155 lines
4.4 KiB
C

/* -*- Mode: C; c-basic-offset: 4 -*- */
/* gst-python
* Copyright (C) 2005 Johan Dahlin
*
* 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: Johan Dahlin <johan@gnome.org>
*/
#include "common.h"
static void
pygst_iterator_dealloc(PyGstIterator *self)
{
gst_iterator_free(self->iter);
PyObject_Del((PyObject*) self);
}
static PyObject *
pygst_iterator_iter_next(PyGstIterator *self)
{
gpointer element;
PyObject *retval = NULL;
GstIteratorResult result;
result = gst_iterator_next(self->iter, &element);
switch (result)
{
case GST_ITERATOR_DONE:
PyErr_SetNone(PyExc_StopIteration);
break;
case GST_ITERATOR_OK:
if (g_type_is_a(self->iter->type, GST_TYPE_OBJECT)) {
retval = pygstobject_new(G_OBJECT(element));
pygst_object_unref (element);
} else if (g_type_is_a(self->iter->type, G_TYPE_OBJECT)) {
retval = pygobject_new(G_OBJECT(element));
g_object_unref (element);
} else if (g_type_is_a(self->iter->type, GST_TYPE_MINI_OBJECT)) {
retval = pygstminiobject_new(GST_MINI_OBJECT(element));
gst_mini_object_unref (element);
} else {
const gchar *type_name;
type_name = g_type_name(self->iter->type);
PyErr_Format(PyExc_TypeError, "Unsupported child type: %s",
type_name ? type_name : "unknown");
}
break;
case GST_ITERATOR_RESYNC:
/* XXX: add/raise gst.IteratorResync */
PyErr_SetString(PyExc_TypeError, "Resync");
break;
case GST_ITERATOR_ERROR:
PyErr_SetString(PyExc_TypeError, "Error");
break;
default:
g_assert_not_reached();
break;
}
return retval;
}
static PyObject *
pygst_iterator_next(PyGstIterator *self)
{
/* Be compatible with Pythons API rather than GStreamers */
return pygst_iterator_iter_next(self);
}
static PyObject *
pygst_iterator_push(PyGstIterator *self, PyObject *args)
{
PyGstIterator *other;
if (!PyArg_ParseTuple(args, "O!:push", &PyGstIterator_Type, &other))
return NULL;
gst_iterator_push(self->iter, other->iter);
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
pygst_iterator_resync(PyGstIterator *self)
{
gst_iterator_resync(self->iter);
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef _PyGstIterator_methods[] = {
{ "next", (PyCFunction)pygst_iterator_next, METH_NOARGS },
{ "push", (PyCFunction)pygst_iterator_push, METH_VARARGS },
{ "resync", (PyCFunction)pygst_iterator_resync, METH_NOARGS },
{ NULL, NULL, 0 }
};
PyTypeObject PyGstIterator_Type = {
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
"gst.Iterator", /* tp_name */
sizeof(PyGstIterator), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)pygst_iterator_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
"GstIterator wrapper", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)pygst_iterator_iter_next, /* tp_iternext */
_PyGstIterator_methods, /* tp_methods */
};
PyObject*
pygst_iterator_new(GstIterator *iter)
{
PyGstIterator *self;
self = PyObject_NEW(PyGstIterator, &PyGstIterator_Type);
self->iter = iter;
GST_DEBUG("self:%p , iterator:%p, type:%d",
self, self->iter, self->iter->type);
return (PyObject *) self;
}