mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 03:31:05 +00:00
overrides: Make it possible to add metadatas and PadTemplates to GstElementClass
This commit is contained in:
parent
0f8f27e55c
commit
5adc55d50f
1 changed files with 101 additions and 4 deletions
|
@ -1,6 +1,7 @@
|
|||
/* -*- Mode: C; ; c-file-style: "k&r"; c-basic-offset: 4 -*- */
|
||||
/* gst-python
|
||||
* Copyright (C) 2002 David I. Lehn
|
||||
* Copyright (C) 2012 Thibault Saunier <thibault.saunier@collabora.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
|
@ -16,7 +17,7 @@
|
|||
* 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: David I. Lehn <dlehn@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
|
@ -31,8 +32,8 @@
|
|||
|
||||
#include <locale.h>
|
||||
|
||||
#define PYGLIB_MODULE_START(symbol, modname) \
|
||||
DL_EXPORT(void) init##symbol(void) \
|
||||
#define PYGLIB_MODULE_START(symbol, modname) \
|
||||
DL_EXPORT(void) init##symbol(void) \
|
||||
{ \
|
||||
PyObject *module; \
|
||||
module = Py_InitModule(modname, symbol##_functions);
|
||||
|
@ -92,6 +93,102 @@ gi_gst_register_types (PyObject * d)
|
|||
gi_gst_fraction_from_value, gi_gst_fraction_to_value);
|
||||
}
|
||||
|
||||
static int
|
||||
add_templates (gpointer gclass, PyObject * templates)
|
||||
{
|
||||
gint i, len;
|
||||
PyGObject *templ;
|
||||
|
||||
if (PyTuple_Check (templates)) {
|
||||
|
||||
len = PyTuple_Size (templates);
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
templ = (PyGObject *) PyTuple_GetItem (templates, i);
|
||||
if (GST_IS_PAD_TEMPLATE (pygobject_get (templ)) == FALSE) {
|
||||
PyErr_SetString (PyExc_TypeError,
|
||||
"entries for __gsttemplates__ must be of type GstPadTemplate");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
templ = (PyGObject *) PyTuple_GetItem (templates, i);
|
||||
gst_element_class_add_pad_template (gclass,
|
||||
GST_PAD_TEMPLATE (templ->obj));
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
if (GST_IS_PAD_TEMPLATE (pygobject_get (templ)) == FALSE) {
|
||||
PyErr_SetString (PyExc_TypeError,
|
||||
"entry for __gsttemplates__ must be of type GstPadTemplate");
|
||||
return -1;
|
||||
}
|
||||
|
||||
gst_element_class_add_pad_template (gclass,
|
||||
GST_PAD_TEMPLATE (pygobject_get (templates)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
_pygst_element_set_metadata (gpointer gclass, PyObject * metadata)
|
||||
{
|
||||
|
||||
const gchar *longname, *classification, *description, *author;
|
||||
|
||||
if (!PyTuple_Check (metadata)) {
|
||||
PyErr_SetString (PyExc_TypeError, "__gstmetadata__ must be a tuple");
|
||||
return -1;
|
||||
}
|
||||
if (PyTuple_Size (metadata) != 4) {
|
||||
PyErr_SetString (PyExc_TypeError,
|
||||
"__gstmetadata__ must contain 4 elements");
|
||||
return -1;
|
||||
}
|
||||
if (!PyArg_ParseTuple (metadata, "ssss", &longname, &classification,
|
||||
&description, &author)) {
|
||||
PyErr_SetString (PyExc_TypeError, "__gstmetadata__ must contain 4 strings");
|
||||
return -1;
|
||||
}
|
||||
GST_DEBUG
|
||||
("setting metadata on gclass %p from __gstmetadata__, longname %s",
|
||||
gclass, longname);
|
||||
|
||||
gst_element_class_set_metadata (gclass, longname, classification,
|
||||
description, author);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
_pygst_element_init (gpointer gclass, PyTypeObject * pyclass)
|
||||
{
|
||||
PyObject *templates, *metadata;
|
||||
|
||||
GST_DEBUG ("_pygst_element_init for gclass %p", gclass);
|
||||
templates = PyDict_GetItemString (pyclass->tp_dict, "__gsttemplates__");
|
||||
if (templates) {
|
||||
if (add_templates (gclass, templates) != 0)
|
||||
return -1;
|
||||
} else {
|
||||
PyErr_Clear ();
|
||||
}
|
||||
metadata = PyDict_GetItemString (pyclass->tp_dict, "__gstmetadata__");
|
||||
if (metadata) {
|
||||
if (_pygst_element_set_metadata (gclass, metadata) != 0)
|
||||
return -1;
|
||||
PyDict_DelItemString (pyclass->tp_dict, "__gstmetadata__");
|
||||
} else {
|
||||
PyErr_Clear ();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PyMethodDef _gi_gst_functions[] = { {0,} };
|
||||
|
||||
PYGLIB_MODULE_START (_gi_gst, "_gi_gst")
|
||||
|
@ -102,7 +199,7 @@ PYGLIB_MODULE_START (_gi_gst, "_gi_gst")
|
|||
|
||||
d = PyModule_GetDict (module);
|
||||
gi_gst_register_types (d);
|
||||
|
||||
pyg_register_class_init (GST_TYPE_ELEMENT, _pygst_element_init);
|
||||
}
|
||||
|
||||
PYGLIB_MODULE_END;
|
||||
|
|
Loading…
Reference in a new issue