gstcaps: Use inlined version of _is_any()/_is_empty()

CAPS_IS_ANY and CAPS_IS_EMPTY are the equivalent of their gst_caps_*
counterpart except that they avoid the typechecking and are inlined.

CAPS_IS_EMPTY_SIMPLE only checks for empty caps (without checking if
the caps is ANY).
This commit is contained in:
Edward Hervey 2009-10-23 17:47:43 +02:00
parent c10690aea2
commit e5a13bd3fc

View file

@ -92,6 +92,17 @@
#define IS_WRITABLE(caps) \ #define IS_WRITABLE(caps) \
(g_atomic_int_get (&(caps)->refcount) == 1) (g_atomic_int_get (&(caps)->refcount) == 1)
/* same as gst_caps_is_any () */
#define CAPS_IS_ANY(caps) \
((caps)->flags & GST_CAPS_FLAGS_ANY)
/* same as gst_caps_is_empty () */
#define CAPS_IS_EMPTY(caps) \
(!CAPS_IS_ANY(caps) && CAPS_IS_EMPTY_SIMPLE(caps))
#define CAPS_IS_EMPTY_SIMPLE(caps) \
(((caps)->structs == NULL) || ((caps)->structs->len == 0))
/* quick way to get a caps structure at an index without doing a type or array /* quick way to get a caps structure at an index without doing a type or array
* length check */ * length check */
#define gst_caps_get_structure_unchecked(caps, index) \ #define gst_caps_get_structure_unchecked(caps, index) \
@ -610,7 +621,7 @@ gst_caps_append (GstCaps * caps1, GstCaps * caps2)
#ifdef USE_POISONING #ifdef USE_POISONING
CAPS_POISON (caps2); CAPS_POISON (caps2);
#endif #endif
if (G_UNLIKELY (gst_caps_is_any (caps1) || gst_caps_is_any (caps2))) { if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))) {
/* FIXME: this leaks */ /* FIXME: this leaks */
caps1->flags |= GST_CAPS_FLAGS_ANY; caps1->flags |= GST_CAPS_FLAGS_ANY;
for (i = caps2->structs->len - 1; i >= 0; i--) { for (i = caps2->structs->len - 1; i >= 0; i--) {
@ -652,12 +663,12 @@ gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
#ifdef USE_POISONING #ifdef USE_POISONING
CAPS_POISON (caps2); CAPS_POISON (caps2);
#endif #endif
if (G_UNLIKELY (gst_caps_is_any (caps1))) { if (G_UNLIKELY (CAPS_IS_ANY (caps1))) {
for (i = caps2->structs->len - 1; i >= 0; i--) { for (i = caps2->structs->len - 1; i >= 0; i--) {
structure = gst_caps_remove_and_get_structure (caps2, i); structure = gst_caps_remove_and_get_structure (caps2, i);
gst_structure_free (structure); gst_structure_free (structure);
} }
} else if (G_UNLIKELY (gst_caps_is_any (caps2))) { } else if (G_UNLIKELY (CAPS_IS_ANY (caps2))) {
caps1->flags |= GST_CAPS_FLAGS_ANY; caps1->flags |= GST_CAPS_FLAGS_ANY;
for (i = caps1->structs->len - 1; i >= 0; i--) { for (i = caps1->structs->len - 1; i >= 0; i--) {
structure = gst_caps_remove_and_get_structure (caps1, i); structure = gst_caps_remove_and_get_structure (caps1, i);
@ -1112,13 +1123,13 @@ gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
g_return_val_if_fail (subset != NULL, FALSE); g_return_val_if_fail (subset != NULL, FALSE);
g_return_val_if_fail (superset != NULL, FALSE); g_return_val_if_fail (superset != NULL, FALSE);
if (gst_caps_is_empty (subset) || gst_caps_is_any (superset)) if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
return TRUE; return TRUE;
if (gst_caps_is_any (subset) || gst_caps_is_empty (superset)) if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
return FALSE; return FALSE;
caps = gst_caps_subtract (subset, superset); caps = gst_caps_subtract (subset, superset);
ret = gst_caps_is_empty (caps); ret = CAPS_IS_EMPTY_SIMPLE (caps);
gst_caps_unref (caps); gst_caps_unref (caps);
return ret; return ret;
} }
@ -1306,11 +1317,11 @@ gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
return TRUE; return TRUE;
/* empty caps on either side, return empty */ /* empty caps on either side, return empty */
if (G_UNLIKELY (gst_caps_is_empty (caps1) || gst_caps_is_empty (caps2))) if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
return FALSE; return FALSE;
/* one of the caps is any */ /* one of the caps is any */
if (G_UNLIKELY (gst_caps_is_any (caps1) || gst_caps_is_any (caps2))) if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
return TRUE; return TRUE;
/* run zigzag on top line then right line, this preserves the caps order /* run zigzag on top line then right line, this preserves the caps order
@ -1428,13 +1439,13 @@ gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
return gst_caps_copy (caps1); return gst_caps_copy (caps1);
/* empty caps on either side, return empty */ /* empty caps on either side, return empty */
if (G_UNLIKELY (gst_caps_is_empty (caps1) || gst_caps_is_empty (caps2))) if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
return gst_caps_new_empty (); return gst_caps_new_empty ();
/* one of the caps is any, just copy the other caps */ /* one of the caps is any, just copy the other caps */
if (G_UNLIKELY (gst_caps_is_any (caps1))) if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
return gst_caps_copy (caps2); return gst_caps_copy (caps2);
if (G_UNLIKELY (gst_caps_is_any (caps2))) if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
return gst_caps_copy (caps1); return gst_caps_copy (caps1);
dest = gst_caps_new_empty (); dest = gst_caps_new_empty ();
@ -1565,10 +1576,10 @@ gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
g_return_val_if_fail (minuend != NULL, NULL); g_return_val_if_fail (minuend != NULL, NULL);
g_return_val_if_fail (subtrahend != NULL, NULL); g_return_val_if_fail (subtrahend != NULL, NULL);
if (gst_caps_is_empty (minuend) || gst_caps_is_any (subtrahend)) { if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
return gst_caps_new_empty (); return gst_caps_new_empty ();
} }
if (gst_caps_is_empty (subtrahend)) if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
return gst_caps_copy (minuend); return gst_caps_copy (minuend);
/* FIXME: Do we want this here or above? /* FIXME: Do we want this here or above?
@ -1576,7 +1587,7 @@ gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
ANY means for specific types, so it's not possible to reduce ANY partially ANY means for specific types, so it's not possible to reduce ANY partially
You can only remove everything or nothing and that is done above. You can only remove everything or nothing and that is done above.
Note: there's a test that checks this behaviour. */ Note: there's a test that checks this behaviour. */
g_return_val_if_fail (!gst_caps_is_any (minuend), NULL); g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
sublen = subtrahend->structs->len; sublen = subtrahend->structs->len;
g_assert (sublen > 0); g_assert (sublen > 0);
@ -1610,7 +1621,7 @@ gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
gst_caps_append_structure (dest, gst_structure_copy (min)); gst_caps_append_structure (dest, gst_structure_copy (min));
} }
} }
if (gst_caps_is_empty (dest)) { if (CAPS_IS_EMPTY_SIMPLE (dest)) {
gst_caps_unref (src); gst_caps_unref (src);
return dest; return dest;
} }
@ -1641,13 +1652,13 @@ gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
g_return_val_if_fail (caps1 != NULL, NULL); g_return_val_if_fail (caps1 != NULL, NULL);
g_return_val_if_fail (caps2 != NULL, NULL); g_return_val_if_fail (caps2 != NULL, NULL);
if (gst_caps_is_empty (caps1)) if (CAPS_IS_EMPTY (caps1))
return gst_caps_copy (caps2); return gst_caps_copy (caps2);
if (gst_caps_is_empty (caps2)) if (CAPS_IS_EMPTY (caps2))
return gst_caps_copy (caps1); return gst_caps_copy (caps1);
if (gst_caps_is_any (caps1) || gst_caps_is_any (caps2)) if (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))
return gst_caps_new_any (); return gst_caps_new_any ();
dest1 = gst_caps_copy (caps1); dest1 = gst_caps_copy (caps1);
@ -2015,10 +2026,10 @@ gst_caps_to_string (const GstCaps * caps)
if (caps == NULL) { if (caps == NULL) {
return g_strdup ("NULL"); return g_strdup ("NULL");
} }
if (gst_caps_is_any (caps)) { if (CAPS_IS_ANY (caps)) {
return g_strdup ("ANY"); return g_strdup ("ANY");
} }
if (gst_caps_is_empty (caps)) { if (CAPS_IS_EMPTY_SIMPLE (caps)) {
return g_strdup ("EMPTY"); return g_strdup ("EMPTY");
} }