summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim.muller@collabora.co.uk>2012-09-29 14:35:58 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-12-11 10:52:43 +0000
commit401f9b3de72de759c76da155a339c754b653bf9d (patch)
treefc45a2a5ab435f7dd4997f7c34344daf3c78497a
parent8914ccad3f2378843cbe4e6325d884ab96eb77de (diff)
downloadgstreamer-401f9b3de72de759c76da155a339c754b653bf9d.tar.gz
value: avoid duplicates when intersecting lists
Fixes negotiation taking a ridiculous amount of time (multiple 10s of seconds on a core2) when there are duplicate entries in lists. Could have a negative performance impact on other scenarios because we now have to iterate the dest list to avoid duplicates, but we don't have a lot of lists any more these days, and they tend to be small anyway. The negatives are hopefully countered by the positive effects of reducing the list length early on in the process. And in any case, it's the right thing to do. Based on patch by Andre Moreira Magalhaes. https://bugzilla.gnome.org/show_bug.cgi?id=684981
-rw-r--r--gst/gstvalue.c2
-rw-r--r--tests/check/gst/gstcaps.c65
2 files changed, 66 insertions, 1 deletions
diff --git a/gst/gstvalue.c b/gst/gstvalue.c
index bf9bb13cb9..9a3177b913 100644
--- a/gst/gstvalue.c
+++ b/gst/gstvalue.c
@@ -2757,7 +2757,7 @@ gst_value_intersect_list (GValue * dest, const GValue * value1,
gst_value_init_and_copy (&temp, dest);
g_value_unset (dest);
- gst_value_list_concat (dest, &temp, &intersection);
+ gst_value_list_merge (dest, &temp, &intersection);
g_value_unset (&temp);
}
g_value_unset (&intersection);
diff --git a/tests/check/gst/gstcaps.c b/tests/check/gst/gstcaps.c
index cd8b9d0b3b..e7d31a0b8e 100644
--- a/tests/check/gst/gstcaps.c
+++ b/tests/check/gst/gstcaps.c
@@ -788,6 +788,70 @@ GST_START_TEST (test_intersect2)
GST_END_TEST;
+GST_START_TEST (test_intersect_list_duplicate)
+{
+ GstCaps *caps1, *caps2, *icaps;
+
+ /* make sure we don't take too long to intersect these.. */
+ caps1 = gst_caps_from_string ("video/x-raw, format=(string)YV12; "
+ "video/x-raw, format=(string)I420; video/x-raw, format=(string)YUY2; "
+ "video/x-raw, format=(string)UYVY; "
+ "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx,"
+ " xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } } } }, BGRA, ARGB, { ABGR, ABGR, "
+ "{ ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } } } }, "
+ "RGB, BGR, Y41B, Y42B, YVYU, Y444 }; "
+ "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, "
+ "xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } } } }, BGRA, ARGB, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } } } }, "
+ "RGB, BGR, Y41B, Y42B, YVYU, Y444, NV12, NV21 }; "
+ "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, "
+ "BGRx, xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } }, BGRA, ARGB, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+ "RGB, BGR, Y41B, Y42B, YVYU, Y444, NV12, NV21 }");
+
+ caps2 = gst_caps_copy (caps1);
+
+ icaps = gst_caps_intersect (caps1, caps2);
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+ gst_caps_unref (icaps);
+}
+
+GST_END_TEST;
GST_START_TEST (test_intersect_zigzag)
{
@@ -997,6 +1061,7 @@ gst_caps_suite (void)
tcase_add_test (tc_chain, test_merge_subset);
tcase_add_test (tc_chain, test_intersect);
tcase_add_test (tc_chain, test_intersect2);
+ tcase_add_test (tc_chain, test_intersect_list_duplicate);
tcase_add_test (tc_chain, test_intersect_zigzag);
tcase_add_test (tc_chain, test_intersect_first);
tcase_add_test (tc_chain, test_intersect_first2);