caps: Fix subset check in gst_caps_merge()

Caps A are a subset of caps B even if caps B doesn't
have all fields of caps A.

Also add a unit test for this.
This commit is contained in:
Sebastian Dröge 2011-05-27 13:37:06 +02:00
parent d706ca0859
commit 0cf2dfd0ba
2 changed files with 30 additions and 12 deletions

View file

@ -569,13 +569,13 @@ static gboolean
gst_caps_structure_is_subset_field (GQuark field_id, const GValue * value, gst_caps_structure_is_subset_field (GQuark field_id, const GValue * value,
gpointer user_data) gpointer user_data)
{ {
GstStructure *subtract_from = user_data; GstStructure *superset = user_data;
GValue subtraction = { 0, }; GValue subtraction = { 0, };
const GValue *other; const GValue *other;
if (!(other = gst_structure_id_get_value (subtract_from, field_id))) if (!(other = gst_structure_id_get_value (superset, field_id)))
/* field is missing in one set */ /* field is missing in the superset => is subset */
return FALSE; return TRUE;
/* equal values are subset */ /* equal values are subset */
if (gst_value_compare (other, value) == GST_VALUE_EQUAL) if (gst_value_compare (other, value) == GST_VALUE_EQUAL)
@ -612,17 +612,15 @@ gst_caps_structure_is_subset_field (GQuark field_id, const GValue * value,
} }
static gboolean static gboolean
gst_caps_structure_is_subset (const GstStructure * minuend, gst_caps_structure_is_subset (const GstStructure * superset,
const GstStructure * subtrahend) const GstStructure * subset)
{ {
if ((minuend->name != subtrahend->name) || if ((superset->name != subset->name) ||
(gst_structure_n_fields (minuend) != (gst_structure_n_fields (superset) > gst_structure_n_fields (subset)))
gst_structure_n_fields (subtrahend))) {
return FALSE; return FALSE;
}
return gst_structure_foreach ((GstStructure *) subtrahend, return gst_structure_foreach ((GstStructure *) subset,
gst_caps_structure_is_subset_field, (gpointer) minuend); gst_caps_structure_is_subset_field, (gpointer) superset);
} }
/** /**

View file

@ -573,6 +573,26 @@ GST_START_TEST (test_merge_subset)
fail_unless (gst_caps_is_subset (test, c2)); fail_unless (gst_caps_is_subset (test, c2));
gst_caps_unref (test); gst_caps_unref (test);
gst_caps_unref (c2); gst_caps_unref (c2);
c2 = gst_caps_from_string ("audio/x-raw-int");
c1 = gst_caps_from_string ("audio/x-raw-int,channels=1");
gst_caps_merge (c2, c1);
GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
fail_unless (gst_caps_get_size (c2) == 1, NULL);
test = gst_caps_from_string ("audio/x-raw-int");
fail_unless (gst_caps_is_equal (c2, test));
gst_caps_unref (c2);
gst_caps_unref (test);
c2 = gst_caps_from_string ("audio/x-raw-int,channels=1");
c1 = gst_caps_from_string ("audio/x-raw-int");
gst_caps_merge (c2, c1);
GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
fail_unless (gst_caps_get_size (c2) == 2, NULL);
test = gst_caps_from_string ("audio/x-raw-int,channels=1; audio/x-raw-int");
fail_unless (gst_caps_is_equal (c2, test));
gst_caps_unref (c2);
gst_caps_unref (test);
} }
GST_END_TEST; GST_END_TEST;