From: <wt...@ke...> - 2006-07-31 16:34:54
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Mon Jul 31 2006 16:34:53 UTC Log message: * gst/gstvalue.c: (gst_value_compare_list): Fix GstValueList comparison code. Fixes #347293. * tests/check/gst/gstvalue.c: (GST_START_TEST): Check to test GstValueList comparison. Modified files: . : ChangeLog gst : gstvalue.c tests/check/gst : gstvalue.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.2719&r2=1.2720 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstvalue.c.diff?r1=1.121&r2=1.122 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/tests/check/gst/gstvalue.c.diff?r1=1.23&r2=1.24 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.2719 retrieving revision 1.2720 diff -u -d -r1.2719 -r1.2720 --- ChangeLog 31 Jul 2006 15:12:01 -0000 1.2719 +++ ChangeLog 31 Jul 2006 16:34:40 -0000 1.2720 @@ -1,3 +1,11 @@ +2006-07-31 Wim Taymans <wi...@fl...> + + * gst/gstvalue.c: (gst_value_compare_list): + Fix GstValueList comparison code. Fixes #347293. + * tests/check/gst/gstvalue.c: (GST_START_TEST): + Check to test GstValueList comparison. 2006-07-31 Jan Schmidt <th...@ma...> * gst/gstelementfactory.c: (gst_element_factory_create): Index: gstvalue.c RCS file: /cvs/gstreamer/gstreamer/gst/gstvalue.c,v retrieving revision 1.121 retrieving revision 1.122 diff -u -d -r1.121 -r1.122 --- gstvalue.c 11 Jul 2006 20:14:20 -0000 1.121 +++ gstvalue.c 31 Jul 2006 16:34:41 -0000 1.122 @@ -465,22 +465,45 @@ GArray *array2 = value2->data[0].v_pointer; GValue *v1; GValue *v2; + gint len, to_remove; + guint8 *removed; - if (array1->len != array2->len) + /* get length and do initial length check. */ + len = array1->len; + if (len != array2->len) return GST_VALUE_UNORDERED; - for (i = 0; i < array1->len; i++) { + /* place to mark removed value indices of array2 */ + removed = g_newa (guint8, len); + memset (removed, 0, len); + to_remove = len; + /* loop over array1, all items should be in array2. When we find an + * item in array2, remove it from array2 by marking it as removed */ + for (i = 0; i < len; i++) { v1 = &g_array_index (array1, GValue, i); - for (j = 0; j < array1->len; j++) { + for (j = 0; j < len; j++) { + /* item is removed, we can skip it */ + if (removed[j]) + continue; v2 = &g_array_index (array2, GValue, j); - if (gst_value_compare (v1, v2) == GST_VALUE_EQUAL) + if (gst_value_compare (v1, v2) == GST_VALUE_EQUAL) { + /* mark item as removed now that we found it in array2 and + * decrement the number of remaining items in array2. */ + removed[j] = 1; + to_remove--; break; + } } - if (j == array1->len) { + /* item in array1 and not in array2, UNORDERED */ + if (j == len) return GST_VALUE_UNORDERED; - } } + /* if not all items were removed, array2 contained something not in array1 */ + if (to_remove != 0) + return GST_VALUE_UNORDERED; + /* arrays are equal */ return GST_VALUE_EQUAL; } RCS file: /cvs/gstreamer/gstreamer/tests/check/gst/gstvalue.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstvalue.c 11 Jul 2006 20:14:20 -0000 1.23 +++ gstvalue.c 31 Jul 2006 16:34:41 -0000 1.24 @@ -590,6 +590,16 @@ fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL, "Value lists with different size were equal when they shouldn't be"); + /* Carry over the lists to this next check: */ + /* Lists with same size but list1 contains one more element not in list2 */ + g_value_set_int (&tmp, 5); + gst_value_list_append_value (&value1, &tmp); + fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL, + "Value lists with different elements were equal when they shouldn't be"); + fail_if (gst_value_compare (&value2, &value1) == GST_VALUE_EQUAL, g_value_unset (&value1); g_value_unset (&value2); g_value_unset (&tmp); @@ -634,6 +644,9 @@ "Value arrays with different size were equal when they shouldn't be"); + /* order should not matter */ + "Value arrays with different size were equal when they shouldn't be"); |