diff options
author | Tim-Philipp Müller <tim.muller@collabora.co.uk> | 2012-09-29 14:35:58 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-12-11 10:52:43 +0000 |
commit | 401f9b3de72de759c76da155a339c754b653bf9d (patch) | |
tree | fc45a2a5ab435f7dd4997f7c34344daf3c78497a | |
parent | 8914ccad3f2378843cbe4e6325d884ab96eb77de (diff) | |
download | gstreamer-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.c | 2 | ||||
-rw-r--r-- | tests/check/gst/gstcaps.c | 65 |
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); |