diff options
author | Alessandro Decina <alessandro.decina@collabora.co.uk> | 2010-08-26 12:09:31 +0200 |
---|---|---|
committer | Alessandro Decina <alessandro.decina@collabora.co.uk> | 2010-08-26 12:15:19 +0200 |
commit | c5b2a96bc9bf8332dc9026de7713e448df75e987 (patch) | |
tree | 4fd1345e362583504a4e4997386eb56b13809ee1 /plugin | |
parent | 8b028933462796905a59f3a98593b5975bb77f6c (diff) |
plugin: refactor the initialization code.
Remove references to global python objects from the initialization code. This
makes it possible to avoid linking to libpython.
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/gstpythonplugin.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/plugin/gstpythonplugin.c b/plugin/gstpythonplugin.c index f8b0d0d..0134f19 100644 --- a/plugin/gstpythonplugin.c +++ b/plugin/gstpythonplugin.c @@ -25,6 +25,7 @@ /* include this first, before NO_IMPORT_PYGOBJECT is defined */ #include <pygobject.h> #include <gst/gst.h> +#include <Python.h> PyTypeObject *_PyGstElement_Type; #define PyGstElement_Type (*_PyGstElement_Type) @@ -40,35 +41,46 @@ static PyObject *element; static inline gboolean np_init_pygobject (void) { - PyObject *gobject = PyImport_ImportModule ("gobject"); - gboolean res = TRUE; - - if (gobject != NULL) { - PyObject *mdict = PyModule_GetDict (gobject); - PyObject *cobject = PyDict_GetItemString (mdict, "_PyGObject_API"); - if (PyCObject_Check (cobject)) { - _PyGObject_API = - (struct _PyGObject_Functions *) PyCObject_AsVoidPtr (cobject); - } else { - PyErr_SetString (PyExc_RuntimeError, - "could not find _PyGObject_API object"); - PyErr_Print (); - res = FALSE; - goto beach; - } - if (!(PyObject_CallMethod (gobject, "threads_init", NULL, NULL))) { - PyErr_SetString (PyExc_RuntimeError, "Could not initialize threads"); - PyErr_Print (); - res = FALSE; - goto beach; - } - } else { + gboolean res = FALSE; + PyObject *gobject = NULL; + PyObject *main_module = NULL; + PyObject *mdict = NULL; + + gobject = PyImport_ImportModule ("gobject"); + if (gobject == NULL) { PyErr_Print (); GST_WARNING ("could not import gobject"); - res = FALSE; + goto beach; + } + + main_module = PyImport_AddModule ("__main__"); + mdict = PyModule_GetDict (gobject); + + PyObject *cobject = PyDict_GetItemString (mdict, "_PyGObject_API"); + if (cobject == NULL) { + GST_WARNING ("could not find _PyGObject_API"); + goto beach; } + _PyGObject_API = + (struct _PyGObject_Functions *) PyCObject_AsVoidPtr (cobject); + if (_PyGObject_API == NULL) { + PyErr_Print (); + GST_WARNING ("_PyGObject_API is not a valid CObject"); + goto beach; + } + + if (!(PyObject_CallMethod (gobject, "threads_init", NULL, NULL))) { + PyErr_Print (); + GST_WARNING ("could not initialize threads"); + goto beach; + } + + res = TRUE; + beach: + Py_XDECREF (gobject); + return res; } |