diff options
author | Thibault Saunier <thibault.saunier@osg.samsung.com> | 2017-07-25 16:17:54 -0400 |
---|---|---|
committer | Thibault Saunier <thibault.saunier@osg.samsung.com> | 2017-07-26 15:27:21 -0400 |
commit | cb0dd804f7e933fb0bc3e7ce5067e83c0b00cf95 (patch) | |
tree | 6eb2e7943448aa70a7d3f7085fea53ac42138a71 | |
parent | fe222637a670929609f4ea6a0cf6c874159f7f55 (diff) |
Add support for Gst.Bitmask
-rw-r--r-- | gi/overrides/Gst.py | 18 | ||||
-rw-r--r-- | gi/overrides/gstmodule.c | 31 | ||||
-rw-r--r-- | testsuite/test_types.py | 19 |
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') |