From ebae6492604bf75cc941433a9db0a42bab7eb2a7 Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Mon, 29 Nov 2004 12:14:27 +0000 Subject: [PATCH] gst/gst.override: Apply patch from Brian Warner to throw a link error when element and pad linking fails. Original commit message from CVS: * gst/gst.override: Apply patch from Brian Warner to throw a link error when element and pad linking fails. --- ChangeLog | 6 ++ gst/gst.override | 180 ++++++++++++++++++++++++++++++++++++++++++++++- gst/gstmodule.c | 9 ++- 3 files changed, 191 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 069bad6609..2d342fb728 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-11-29 Johan Dahlin + + * gst/gstmodule.c: + * gst/gst.override: Apply patch from Brian Warner to throw a link + error when element and pad linking fails. + 2004-11-27 Martin Soto * gst/gst.override (_wrap_gst_event_new_any) diff --git a/gst/gst.override b/gst/gst.override index 5831e84596..d720e71fc7 100644 --- a/gst/gst.override +++ b/gst/gst.override @@ -36,6 +36,7 @@ headers #include extern gboolean pygst_data_from_pyobject (PyObject *object, GstData **data); +PyObject *PyGstExc_LinkError = NULL; GSList *mainloops = NULL; void @@ -312,8 +313,12 @@ _wrap_gst_element_link_many(PyObject *self, PyObject *args) i = 2; while (1) { - if (!gst_element_link(GST_ELEMENT(element->obj), GST_ELEMENT(element2->obj))) - return PyInt_FromLong(0); + if (!gst_element_link(GST_ELEMENT(element->obj), + GST_ELEMENT(element2->obj))) + { + PyErr_SetString(PyGstExc_LinkError, "link failed"); + return NULL; + } if (i >= len) break; @@ -326,6 +331,122 @@ _wrap_gst_element_link_many(PyObject *self, PyObject *args) return PyInt_FromLong(1); } + + +%% +override gst_element_link kwargs +static PyObject * +_wrap_gst_element_link(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "dest", NULL }; + PyGObject *dest; + int ret; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!:GstElement.link", + kwlist, &PyGstElement_Type, &dest)) + return NULL; + ret = gst_element_link(GST_ELEMENT(self->obj), GST_ELEMENT(dest->obj)); + if (!ret) { + PyErr_SetString(PyGstExc_LinkError, "link failed"); + return NULL; + } + return PyBool_FromLong(ret); +} + +%% +override gst_element_link_filtered kwargs +static PyObject * +_wrap_gst_element_link_filtered(PyGObject *self, PyObject *args, + PyObject *kwargs) +{ + static char *kwlist[] = { "dest", "filtercaps", NULL }; + PyGObject *dest; + PyObject *py_filtercaps; + int ret; + 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"); + return NULL; + } + ret = gst_element_link_filtered(GST_ELEMENT(self->obj), + GST_ELEMENT(dest->obj), + filtercaps); + if (!ret) { + PyErr_SetString(PyGstExc_LinkError, "link failed"); + return NULL; + } + return PyBool_FromLong(ret); + +} + +%% +override gst_element_link_pads kwargs +static PyObject * +_wrap_gst_element_link_pads(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "srcpadname", "dest", "destpadname", NULL }; + char *srcpadname, *destpadname; + PyGObject *dest; + int ret; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "sO!s:GstElement.link_pads", kwlist, + &srcpadname, &PyGstElement_Type, &dest, + &destpadname)) + return NULL; + ret = gst_element_link_pads(GST_ELEMENT(self->obj), srcpadname, + GST_ELEMENT(dest->obj), destpadname); + if (!ret) { + PyErr_SetString(PyGstExc_LinkError, "link failed"); + return NULL; + } + return PyBool_FromLong(ret); + +} + +%% +override gst_element_link_pads_filtered kwargs +static PyObject * +_wrap_gst_element_link_pads_filtered(PyGObject *self, PyObject *args, + PyObject *kwargs) +{ + static char *kwlist[] = { "srcpadname", "dest", "destpadname", + "filtercaps", NULL }; + char *srcpadname, *destpadname; + PyGObject *dest; + int ret; + PyObject *py_filtercaps; + GstCaps *filtercaps = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "sO!sO:GstElement.link_pads_filtered", + kwlist, &srcpadname, &PyGstElement_Type, + &dest, &destpadname, &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"); + return NULL; + } + ret = gst_element_link_pads_filtered(GST_ELEMENT(self->obj), srcpadname, + GST_ELEMENT(dest->obj), destpadname, + filtercaps); + if (!ret) { + PyErr_SetString(PyGstExc_LinkError, "link failed"); + return NULL; + } + return PyBool_FromLong(ret); +} + %% override gst_element_unlink_many args static PyObject * @@ -371,8 +492,61 @@ _wrap_gst_element_unlink_many(PyObject *self, PyObject *args) Py_INCREF(Py_None); return Py_None; } + + %% -override GstPad.get_negotiated_caps +override gst_pad_link kwargs +static PyObject * +_wrap_gst_pad_link(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "sinkpad", NULL }; + PyGObject *sinkpad; + int ret; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!:GstPad.link", kwlist, + &PyGstPad_Type, &sinkpad)) + return NULL; + ret = gst_pad_link(GST_PAD(self->obj), GST_PAD(sinkpad->obj)); + if (!ret) { + PyErr_SetString(PyGstExc_LinkError, "link failed"); + return NULL; + } + return PyBool_FromLong(ret); +} + +%% +override gst_pad_link_filtered kwargs +static PyObject * +_wrap_gst_pad_link_filtered(PyGObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = { "sinkpad", "filtercaps", NULL }; + PyGObject *sinkpad; + PyObject *py_filtercaps; + int ret; + GstCaps *filtercaps = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O:GstPad.link_filtered", + kwlist, &PyGstPad_Type, &sinkpad, + &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"); + return NULL; + } + ret = gst_pad_link_filtered(GST_PAD(self->obj), + GST_PAD(sinkpad->obj), + filtercaps); + if (!ret) { + PyErr_SetString(PyGstExc_LinkError, "link failed"); + return NULL; + } + return PyBool_FromLong(ret); +} + +%% +override gst_pad_get_negotiated_caps static PyObject * _wrap_gst_pad_get_negotiated_caps(PyGObject *self) { diff --git a/gst/gstmodule.c b/gst/gstmodule.c index 4359f56d89..a2a1d216df 100644 --- a/gst/gstmodule.c +++ b/gst/gstmodule.c @@ -37,6 +37,7 @@ void pygst_add_constants(PyObject *module, const gchar *strip_prefix); extern PyMethodDef pygst_functions[]; extern GSList *mainloops; extern void _pygst_main_quit(void); +extern PyObject *PyGstExc_LinkError; /* This is a timeout that gets added to the mainloop to handle SIGINT (Ctrl-C) @@ -133,7 +134,13 @@ init_gst (void) PyModule_AddIntConstant(m, "SECOND", GST_SECOND); PyModule_AddIntConstant(m, "MSECOND", GST_MSECOND); PyModule_AddIntConstant(m, "NSECOND", GST_NSECOND); - + + /* LinkError exception */ + PyGstExc_LinkError = PyErr_NewException("gst.LinkError", + PyExc_RuntimeError, + NULL); + PyDict_SetItemString(d, "LinkError", PyGstExc_LinkError); + pygst_register_classes (d); pygst_add_constants (m, "GST_");