[gst-cvs] gst-python: wrap gst_tag_to_vorbis_comment; fix uint tag setting
Thomas Vander Stichele
thomasvs at kemper.freedesktop.org
Mon Jun 1 13:04:16 PDT 2009
Module: gst-python
Branch: master
Commit: 26fa6dd184a8d6d103eaddf5f12bd7e5144413fb
URL: http://cgit.freedesktop.org/gstreamer/gst-python/commit/?id=26fa6dd184a8d6d103eaddf5f12bd7e5144413fb
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date: Mon Jun 1 22:02:47 2009 +0200
wrap gst_tag_to_vorbis_comment; fix uint tag setting
Setting gst.TAG_TRACK_NUMBER was failing because GStreamer
expects a uint while Python object -> GValue conversion was
giving an int. gst_tag_to_vorbis_comment was wrapped so
this conversion could be tested and failed on properly.
---
gst/gsttaglist.override | 18 ++++++++++++++++++
gst/tag.override | 40 ++++++++++++++++++++++++++++++++++++++++
testsuite/common.py | 11 +++++++++++
testsuite/test_pipeline.py | 32 ++++++++++++++++++++++++++++++++
testsuite/test_taglist.py | 6 +++++-
5 files changed, 106 insertions(+), 1 deletions(-)
diff --git a/gst/gsttaglist.override b/gst/gsttaglist.override
index 93c902f..3775232 100644
--- a/gst/gsttaglist.override
+++ b/gst/gsttaglist.override
@@ -95,15 +95,33 @@ _wrap_gst_tag_list_ass_subscript(PyGObject *self,
{
const char *key;
GstStructure* structure;
+ GType tagtype;
structure = (GstStructure*)self->obj;
key = PyString_AsString(py_key);
if (py_value != NULL) {
GValue v = { 0, };
+
if (!pygst_value_init_for_pyobject (&v, py_value))
return -1;
if (pygst_value_from_pyobject(&v, py_value))
return -1;
+
+ /* some tags are supposed to be uint, but there is no unsigned
+ * int python type, so convert here if needed */
+ if (gst_tag_exists (key)) {
+ tagtype = gst_tag_get_type (key);
+
+ if (tagtype && tagtype != G_VALUE_TYPE (&v)) {
+ GValue w = { 0, };
+
+ g_value_init (&w, tagtype);
+ g_value_transform (&v, &w);
+ g_value_unset (&v);
+ g_value_init (&v, tagtype);
+ g_value_copy (&w, &v);
+ }
+ }
gst_structure_set_value(structure, key, &v);
g_value_unset(&v);
} else {
diff --git a/gst/tag.override b/gst/tag.override
index 52ef76b..b908d5b 100644
--- a/gst/tag.override
+++ b/gst/tag.override
@@ -62,3 +62,43 @@ ignore-glob
*init
*_free
*_get_type
+
+%%
+override gst_tag_to_vorbis_comments
+static PyObject *
+_wrap_gst_tag_to_vorbis_comments(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ PyObject *py_taglist;
+ const GstTagList *taglist;
+ const gchar *tag;
+
+ const GList *list;
+ const GList *l;
+ PyObject *py_list;
+
+ if (!PyArg_ParseTuple(args, "Os", &py_taglist, &tag))
+ return NULL;
+
+ if (pyg_boxed_check(py_taglist, GST_TYPE_TAG_LIST))
+ taglist = pyg_boxed_get(py_taglist, GstTagList);
+ else {
+ PyErr_SetString(PyExc_TypeError, "list should be a GstTagList");
+ return NULL;
+ }
+
+
+ pyg_begin_allow_threads;
+ list = gst_tag_to_vorbis_comments (taglist, tag);
+ pyg_end_allow_threads;
+
+ py_list = PyList_New(0);
+
+ for (l = list; l; l = l->next) {
+ gchar *pair = (gchar *)l->data;
+ PyObject *py_pair = PyString_FromString(pair);
+ PyList_Append(py_list, py_pair);
+ Py_DECREF(py_pair);
+ }
+ return py_list;
+
+}
diff --git a/testsuite/common.py b/testsuite/common.py
index 5ec46f4..cc81745 100644
--- a/testsuite/common.py
+++ b/testsuite/common.py
@@ -78,6 +78,17 @@ except ImportError:
file = gst.interfaces.__file__
assert file.startswith(path), 'bad gst.interfaces path: %s' % file
+# gst's tags is in topbuilddir/gst
+path = os.path.abspath(os.path.join(topbuilddir, 'gst'))
+try:
+ import gst.tag
+except ImportError:
+ # hack: we import it from our builddir/gst/.libs instead; ugly
+ import tag
+ gst.tag = tag
+file = gst.tag.__file__
+assert file.startswith(path), 'bad gst.tag path: %s' % file
+
# gst's pbutils is in topbuilddir/gst
path = os.path.abspath(os.path.join(topbuilddir, 'gst'))
try:
diff --git a/testsuite/test_pipeline.py b/testsuite/test_pipeline.py
index a84b988..a57c7f9 100644
--- a/testsuite/test_pipeline.py
+++ b/testsuite/test_pipeline.py
@@ -73,6 +73,38 @@ class Pipeline(TestCase):
self.pipeline.set_state(gst.STATE_NULL)
self.assertEqual(self.pipeline.get_state()[1], gst.STATE_NULL)
+class PipelineTags(TestCase):
+ def setUp(self):
+ self.gctrack()
+ self.pipeline = gst.parse_launch('audiotestsrc num-buffers=100 ! vorbisenc name=encoder ! oggmux name=muxer ! fakesink')
+
+ def tearDown(self):
+ del self.pipeline
+ self.gccollect()
+ self.gcverify()
+
+ def testRun(self):
+ # in 0.10.15.1, this triggers
+ # sys:1: gobject.Warning: g_value_get_uint: assertion `G_VALUE_HOLDS_UINT (value)' failed
+ # during pipeline playing
+
+ l = gst.TagList()
+ l[gst.TAG_ARTIST] = 'artist'
+ l[gst.TAG_TRACK_NUMBER] = 1
+ encoder = self.pipeline.get_by_name('encoder')
+ encoder.merge_tags(l, gst.TAG_MERGE_APPEND)
+
+ self.assertEqual(self.pipeline.get_state()[1], gst.STATE_NULL)
+ self.pipeline.set_state(gst.STATE_PLAYING)
+ self.assertEqual(self.pipeline.get_state()[1], gst.STATE_PLAYING)
+
+ time.sleep(1)
+
+ self.assertEqual(self.pipeline.get_state()[1], gst.STATE_PLAYING)
+ self.pipeline.set_state(gst.STATE_NULL)
+ self.assertEqual(self.pipeline.get_state()[1], gst.STATE_NULL)
+
+
class Bus(TestCase):
def testGet(self):
pipeline = gst.Pipeline('test')
diff --git a/testsuite/test_taglist.py b/testsuite/test_taglist.py
index 227a812..2b94918 100644
--- a/testsuite/test_taglist.py
+++ b/testsuite/test_taglist.py
@@ -64,4 +64,8 @@ class TestTagList(TestCase):
self.failUnless(isinstance(taglist[gst.TAG_ARTIST], unicode))
self.assertEquals(taglist[gst.TAG_ARTIST], u'S\xc3\xadgur R\xc3\xb3s')
-
+ def testUnsignedInt(self):
+ taglist = gst.TagList()
+ taglist[gst.TAG_TRACK_NUMBER] = 1
+ vorbis = gst.tag.to_vorbis_comments(taglist, gst.TAG_TRACK_NUMBER)
+ self.assertEquals(vorbis, ['TRACKNUMBER=1'])
More information about the Gstreamer-commits
mailing list