array/list: Make gvalue conversion symmetric
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Mon, 27 Mar 2017 18:59:24 +0000 (14:59 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Mon, 27 Mar 2017 19:02:41 +0000 (15:02 -0400)
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.

gi/overrides/gstmodule.c
testsuite/test_valuearray.py
testsuite/test_valuelist.py

index a286ba3..a9f4cd1 100644 (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
index 9a77715..99ddc99 100644 (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)
+    
+
+        
index b9fa129..fcada68 100644 (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)