+static gboolean
+gst_value_intersect_double_double_range (GValue *dest, const GValue *src1,
+ const GValue *src2)
+{
+ g_return_val_if_fail(G_VALUE_TYPE(src1) == G_TYPE_DOUBLE, FALSE);
+ g_return_val_if_fail(G_VALUE_TYPE(src2) == GST_TYPE_DOUBLE_RANGE, FALSE);
+
+ if (src2->data[0].v_double <= src1->data[0].v_double &&
+ src2->data[1].v_double >= src1->data[0].v_double){
+ g_value_init(dest, G_TYPE_DOUBLE);
+ g_value_copy(src1, dest);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_double_range_double_range (GValue *dest, const GValue *src1,
+ const GValue *src2)
+{
+ double min;
+ double max;
+
+ g_return_val_if_fail(G_VALUE_TYPE(src1) == GST_TYPE_DOUBLE_RANGE, FALSE);
+ g_return_val_if_fail(G_VALUE_TYPE(src2) == GST_TYPE_DOUBLE_RANGE, FALSE);
+
+ min = MAX(src1->data[0].v_double, src2->data[0].v_double);
+ max = MIN(src1->data[1].v_double, src2->data[1].v_double);
+
+ if(min < max){
+ g_value_init(dest, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range(dest, min, max);
+ return TRUE;
+ }
+ if(min == max){
+ g_value_init(dest, G_TYPE_DOUBLE);
+ g_value_set_int(dest, min);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_list (GValue *dest, const GValue *value1, const GValue *value2)
+{
+ guint i, size;
+ GValue intersection = { 0, };
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (GST_VALUE_HOLDS_LIST (value1), FALSE);
+
+ size = gst_value_list_get_size (value1);
+ for (i = 0; i < size; i++) {
+ const GValue *cur = gst_value_list_get_value (value1, i);
+
+ if (gst_value_intersect (&intersection, cur, value2)) {
+ /* append value */
+ if (!ret) {
+ g_value_init (dest, G_VALUE_TYPE(&intersection));
+ g_value_copy (dest, &intersection);
+ ret = TRUE;
+ } else if (GST_VALUE_HOLDS_LIST (dest)) {
+ gst_value_list_append_value (dest, &intersection);
+ } else {
+ GValue temp = {0, };
+
+ g_value_init (&temp, G_VALUE_TYPE(dest));
+ g_value_copy (dest, &temp);
+ g_value_unset (dest);
+ gst_value_list_concat (dest, &temp, &intersection);
+ }
+ g_value_unset (&intersection);
+ }
+ }
+
+ return ret;
+}
+