mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
array/list: Make gvalue conversion symmetric
This is needed to support matrix. Otherwise, getting a matrix would remove the rows envelopess, which would make the "cast" fails, since it would not know if the internal rows are ValueArray or ValueList. I think reading, modifying and setting back the matrix is an important use case.
This commit is contained in:
parent
c6dee2c26b
commit
d44975a1fe
3 changed files with 34 additions and 4 deletions
|
@ -323,7 +323,7 @@ fail:
|
||||||
static PyObject *
|
static PyObject *
|
||||||
gi_gst_array_from_value (const GValue * value)
|
gi_gst_array_from_value (const GValue * value)
|
||||||
{
|
{
|
||||||
PyObject *list;
|
PyObject *list, *array_type, *array;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
list = PyList_New (gst_value_array_get_size (value));
|
list = PyList_New (gst_value_array_get_size (value));
|
||||||
|
@ -333,7 +333,12 @@ gi_gst_array_from_value (const GValue * value)
|
||||||
PyList_SET_ITEM (list, i, pyg_value_as_pyobject (v, TRUE));
|
PyList_SET_ITEM (list, i, pyg_value_as_pyobject (v, TRUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
array_type = gi_gst_get_type ("ValueArray");
|
||||||
|
array = PyObject_CallFunction (array_type, "N", list);
|
||||||
|
|
||||||
|
Py_DECREF (array_type);
|
||||||
|
|
||||||
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -382,7 +387,7 @@ fail:
|
||||||
static PyObject *
|
static PyObject *
|
||||||
gi_gst_list_from_value (const GValue * value)
|
gi_gst_list_from_value (const GValue * value)
|
||||||
{
|
{
|
||||||
PyObject *list;
|
PyObject *list, *value_list_type, *value_list;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
list = PyList_New (gst_value_list_get_size (value));
|
list = PyList_New (gst_value_list_get_size (value));
|
||||||
|
@ -392,7 +397,12 @@ gi_gst_list_from_value (const GValue * value)
|
||||||
PyList_SET_ITEM (list, i, pyg_value_as_pyobject (v, TRUE));
|
PyList_SET_ITEM (list, i, pyg_value_as_pyobject (v, TRUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
value_list_type = gi_gst_get_type ("ValueList");
|
||||||
|
value_list = PyObject_CallFunction (value_list_type, "N", list);
|
||||||
|
|
||||||
|
Py_DECREF (value_list_type);
|
||||||
|
|
||||||
|
return value_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -82,6 +82,18 @@ class TestFraction(TestCase):
|
||||||
st = Gst.Structure.new_empty("video/x-raw")
|
st = Gst.Structure.new_empty("video/x-raw")
|
||||||
st["array"] = A([Gst.Fraction(1, 30), Gst.Fraction(1, 2)])
|
st["array"] = A([Gst.Fraction(1, 30), Gst.Fraction(1, 2)])
|
||||||
value = st["array"]
|
value = st["array"]
|
||||||
|
st["array"] = A(value)
|
||||||
|
|
||||||
self.failUnlessEqual(value[0], Gst.Fraction(1, 30))
|
self.failUnlessEqual(value[0], Gst.Fraction(1, 30))
|
||||||
self.failUnlessEqual(value[1], Gst.Fraction(1, 2))
|
self.failUnlessEqual(value[1], Gst.Fraction(1, 2))
|
||||||
|
|
||||||
|
st["matrix"] = A([A([0, 1]), A([-1, 0])])
|
||||||
|
value = st["matrix"]
|
||||||
|
|
||||||
|
self.failUnlessEqual(value[0][0], 0)
|
||||||
|
self.failUnlessEqual(value[0][1], 1)
|
||||||
|
self.failUnlessEqual(value[1][0], -1)
|
||||||
|
self.failUnlessEqual(value[1][1], 0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,3 +54,11 @@ class TestFraction(TestCase):
|
||||||
|
|
||||||
self.failUnlessEqual(value[0], Gst.Fraction(1, 30))
|
self.failUnlessEqual(value[0], Gst.Fraction(1, 30))
|
||||||
self.failUnlessEqual(value[1], Gst.Fraction(1, 2))
|
self.failUnlessEqual(value[1], Gst.Fraction(1, 2))
|
||||||
|
|
||||||
|
st["matrix"] = L([L([0, 1]), L([-1 ,0])])
|
||||||
|
value = st["matrix"]
|
||||||
|
|
||||||
|
self.failUnlessEqual(value[0][0], 0)
|
||||||
|
self.failUnlessEqual(value[0][1], 1)
|
||||||
|
self.failUnlessEqual(value[1][0], -1)
|
||||||
|
self.failUnlessEqual(value[1][1], 0)
|
||||||
|
|
Loading…
Reference in a new issue