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:
Nicolas Dufresne 2017-03-27 14:59:24 -04:00
parent c6dee2c26b
commit d44975a1fe
3 changed files with 34 additions and 4 deletions

View file

@ -323,7 +323,7 @@ fail:
static PyObject *
gi_gst_array_from_value (const GValue * value)
{
PyObject *list;
PyObject *list, *array_type, *array;
gint i;
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));
}
return list;
array_type = gi_gst_get_type ("ValueArray");
array = PyObject_CallFunction (array_type, "N", list);
Py_DECREF (array_type);
return array;
}
static int
@ -382,7 +387,7 @@ fail:
static PyObject *
gi_gst_list_from_value (const GValue * value)
{
PyObject *list;
PyObject *list, *value_list_type, *value_list;
gint i;
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));
}
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

View file

@ -82,6 +82,18 @@ class TestFraction(TestCase):
st = Gst.Structure.new_empty("video/x-raw")
st["array"] = A([Gst.Fraction(1, 30), Gst.Fraction(1, 2)])
value = st["array"]
st["array"] = A(value)
self.failUnlessEqual(value[0], Gst.Fraction(1, 30))
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)

View file

@ -54,3 +54,11 @@ class TestFraction(TestCase):
self.failUnlessEqual(value[0], Gst.Fraction(1, 30))
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)