summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Saunier <thibault.saunier@osg.samsung.com>2017-07-25 16:17:54 -0400
committerThibault Saunier <thibault.saunier@osg.samsung.com>2017-07-26 15:27:21 -0400
commitcb0dd804f7e933fb0bc3e7ce5067e83c0b00cf95 (patch)
tree6eb2e7943448aa70a7d3f7085fea53ac42138a71
parentfe222637a670929609f4ea6a0cf6c874159f7f55 (diff)
Add support for Gst.Bitmask
-rw-r--r--gi/overrides/Gst.py18
-rw-r--r--gi/overrides/gstmodule.c31
-rw-r--r--testsuite/test_types.py19
3 files changed, 67 insertions, 1 deletions
diff --git a/gi/overrides/Gst.py b/gi/overrides/Gst.py
index 2952f0b..fce3d1b 100644
--- a/gi/overrides/Gst.py
+++ b/gi/overrides/Gst.py
@@ -432,6 +432,24 @@ class Int64Range(Gst.Int64Range):
return self.range == other.range
return False
+class Bitmask(Gst.Bitmask):
+ def __init__(self, v):
+ if not isinstance(v, int):
+ raise TypeError("%s is not an int." % (type(v)))
+
+ self.v = v
+
+ def __str__(self):
+ return hex(self.v)
+
+ def __eq__(self, other):
+ return self.v == other
+
+
+Bitmask = override(Bitmask)
+__all__.append('Bitmask')
+
+
if sys.version_info >= (3, 0):
Int64Range = override(Int64Range)
__all__.append('Int64Range')
diff --git a/gi/overrides/gstmodule.c b/gi/overrides/gstmodule.c
index 73405c7..1c18699 100644
--- a/gi/overrides/gstmodule.c
+++ b/gi/overrides/gstmodule.c
@@ -401,6 +401,35 @@ fail:
}
static PyObject *
+gi_gst_bitmask_from_value (const GValue * value)
+{
+ PyObject *val, *bitmask_type;
+
+ bitmask_type = gi_gst_get_type ("Bitmask");
+ val = PyObject_CallFunction (bitmask_type, "L",
+ gst_value_get_bitmask (value));
+ Py_DECREF (bitmask_type);
+
+ return val;
+}
+
+static int
+gi_gst_bitmask_to_value (GValue * value, PyObject * object)
+{
+ PyObject *v = PyObject_GetAttrString (object, "v");
+ if (v == NULL)
+ goto fail;
+
+ gst_value_set_bitmask (value, PyLong_AsLong (v));
+
+ return 0;
+
+fail:
+ PyErr_SetString (PyExc_KeyError, "Object is not compatible with Gst.Bitmask");
+ return -1;
+}
+
+static PyObject *
gi_gst_list_from_value (const GValue * value)
{
PyObject *list, *value_list_type, *value_list;
@@ -487,9 +516,9 @@ gi_gst_register_types (PyObject * d)
gi_gst_date_time_from_value, gi_gst_date_time_to_value);
pyg_register_gtype_custom (GST_TYPE_FLAG_SET,
gi_gst_flag_set_from_value, gi_gst_flag_set_to_value);
+#endif
pyg_register_gtype_custom (GST_TYPE_BITMASK,
gi_gst_bitmask_from_value, gi_gst_bitmask_to_value);
-#endif
}
static int
diff --git a/testsuite/test_types.py b/testsuite/test_types.py
index 00a085b..2a87cb9 100644
--- a/testsuite/test_types.py
+++ b/testsuite/test_types.py
@@ -378,3 +378,22 @@ class TestIntRange(TestCase):
value = st["range"]
self.assertEqual(value, range(0, 10, 2))
+
+
+class TestBitmask(TestCase):
+ def testConstructor(self):
+ Gst.init(None)
+
+ r = Gst.Bitmask(1 << 5)
+ self.assertEqual(r, 1 << 5)
+
+ def testGetValue(self):
+ Gst.init(None)
+
+ self.assertEqual(Gst.Structure('test,test=(bitmask)0x20')['test'], 1 << 5)
+
+ def testStr(self):
+ Gst.init(None)
+
+ r = Gst.Bitmask(1 << 5)
+ self.assertEqual(str(r), '0x20')