- further productizing the fixed flag on GstCaps by using the flag on

Original commit message from CVS:
- further productizing the fixed flag on GstCaps by using the flag on
GstProps instead of keeping the two in sync.
- implemented proper flag updates in _props_set and _props_remove.
This commit is contained in:
Wim Taymans 2003-06-13 21:26:33 +00:00
parent 20ada53580
commit 024c51c559
4 changed files with 102 additions and 48 deletions

View file

@ -253,7 +253,7 @@ gst_caps_new_id (const gchar *name, const guint16 id, GstProps *props)
gst_alloc_trace_new (_gst_caps_trace, caps);
#endif
GST_DEBUG (GST_CAT_CAPS, "new %p", caps);
GST_DEBUG (GST_CAT_CAPS, "new %p, props %p", caps, props);
gst_props_ref (props);
gst_props_sink (props);
@ -265,11 +265,6 @@ gst_caps_new_id (const gchar *name, const guint16 id, GstProps *props)
caps->refcount = 1;
GST_CAPS_FLAG_SET (caps, GST_CAPS_FLOATING);
if (props && !GST_PROPS_IS_FIXED (props))
GST_CAPS_FLAG_UNSET (caps, GST_CAPS_FIXED);
else
GST_CAPS_FLAG_SET (caps, GST_CAPS_FIXED);
return caps;
}
@ -348,10 +343,7 @@ void
gst_caps_debug (GstCaps *caps, const gchar *label)
{
GST_DEBUG_ENTER ("caps debug: %s", label);
if (caps && caps->refcount == 0) {
g_warning ("Warning: refcount of caps %s is 0", label);
return;
}
while (caps) {
GST_DEBUG (GST_CAT_CAPS, "caps: %p %s %s (%sfixed) (refcount %d) %s",
caps, caps->name, gst_caps_get_mime (caps),
@ -645,11 +637,6 @@ gst_caps_set_props (GstCaps *caps, GstProps *props)
gst_props_replace_sink (&caps->properties, props);
if (props && !GST_PROPS_IS_FIXED (props))
GST_CAPS_FLAG_UNSET (caps, GST_CAPS_FIXED);
else
GST_CAPS_FLAG_SET (caps, GST_CAPS_FIXED);
return caps;
}
@ -1078,7 +1065,6 @@ gst_caps_load_thyself (xmlNodePtr parent)
xmlNodePtr subfield = field->xmlChildrenNode;
GstCaps *caps;
gchar *content;
GstCapsFlags fixed = GST_CAPS_FIXED;
caps = gst_mem_chunk_alloc0 (_gst_caps_chunk);
#ifndef GST_DISABLE_TRACE
@ -1104,13 +1090,10 @@ gst_caps_load_thyself (xmlNodePtr parent)
gst_props_ref (props);
gst_props_sink (props);
caps->properties = props;
fixed &= (GST_PROPS_IS_FIXED (caps->properties) ? GST_CAPS_FIXED : 0 );
}
subfield = subfield->next;
}
GST_CAPS_FLAG_SET (caps, fixed);
result = gst_caps_append (result, caps);
}

View file

@ -37,23 +37,24 @@ extern GType _gst_caps_type;
#define GST_TYPE_CAPS (_gst_caps_type)
typedef enum {
GST_CAPS_FIXED = (1 << 0), /* caps has no variable properties */
GST_CAPS_UNUSED = (1 << 0), /* unused flag */
GST_CAPS_FLOATING = (1 << 1) /* caps is floating */
} GstCapsFlags;
#define GST_CAPS(caps) ((GstCaps *)(caps))
#define GST_CAPS_FLAGS(caps) ((caps)->flags)
#define GST_CAPS_FLAG_IS_SET(caps,flag) (GST_CAPS_FLAGS (caps) & flag)
#define GST_CAPS_FLAG_SET(caps,flag) (GST_CAPS_FLAGS (caps) |= (flag))
#define GST_CAPS_FLAG_IS_SET(caps,flag) (GST_CAPS_FLAGS (caps) & (flag))
#define GST_CAPS_FLAG_SET(caps,flag) (GST_CAPS_FLAGS (caps) |= (flag))
#define GST_CAPS_FLAG_UNSET(caps,flag) (GST_CAPS_FLAGS (caps) &= ~(flag))
#define GST_CAPS_REFCOUNT(caps) ((caps)->refcount)
#define GST_CAPS_PROPERTIES(caps) ((caps)->properties)
#define GST_CAPS_NEXT(caps) ((caps)->next)
#define GST_CAPS_IS_FIXED(caps) (GST_CAPS_FLAGS (caps) & GST_CAPS_FIXED)
#define GST_CAPS_IS_FLOATING(caps) (GST_CAPS_FLAGS (caps) & GST_CAPS_FLOATING)
#define GST_CAPS_IS_FIXED(caps) (((caps)->properties == NULL) || \
(GST_PROPS_IS_FIXED ((caps)->properties)))
#define GST_CAPS_IS_FLOATING(caps) (GST_CAPS_FLAG_IS_SET ((caps), GST_CAPS_FLOATING))
#define GST_CAPS_IS_CHAINED(caps) (GST_CAPS_NEXT (caps) != NULL)
struct _GstCaps {

View file

@ -865,12 +865,44 @@ gst_props_add_entry (GstProps *props, GstPropsEntry *entry)
g_return_if_fail (props);
g_return_if_fail (entry);
/* only variable properties can change the fixed flag */
if (GST_PROPS_IS_FIXED (props) && GST_PROPS_ENTRY_IS_VARIABLE (entry)) {
GST_PROPS_FLAG_UNSET (props, GST_PROPS_FIXED);
}
props->properties = g_list_insert_sorted (props->properties, entry, props_compare_func);
}
static void
gst_props_remove_entry_by_id (GstProps *props, GQuark propid)
{
GList *properties;
gboolean found;
/* assume fixed */
GST_PROPS_FLAG_SET (props, GST_PROPS_FIXED);
found = FALSE;
properties = props->properties;
while (properties) {
GList *current = properties;
GstPropsEntry *lentry = (GstPropsEntry *) current->data;
properties = g_list_next (properties);
if (lentry->propid == propid) {
found = TRUE;
g_list_delete_link (props->properties, current);
}
else if (GST_PROPS_ENTRY_IS_VARIABLE (lentry)) {
GST_PROPS_FLAG_UNSET (props, GST_PROPS_FIXED);
/* no need to check for further variable entries
* if we already removed the entry */
if (found)
break;
}
}
}
/**
* gst_props_remove_entry:
* @props: the property to remove the entry from
@ -884,7 +916,7 @@ gst_props_remove_entry (GstProps *props, GstPropsEntry *entry)
g_return_if_fail (props != NULL);
g_return_if_fail (entry != NULL);
props->properties = g_list_remove (props->properties, entry);
gst_props_remove_entry_by_id (props, entry->propid);
}
/**
@ -897,18 +929,13 @@ gst_props_remove_entry (GstProps *props, GstPropsEntry *entry)
void
gst_props_remove_entry_by_name (GstProps *props, const gchar *name)
{
GList *lentry;
GQuark quark;
g_return_if_fail (props != NULL);
g_return_if_fail (name != NULL);
quark = g_quark_from_string (name);
lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func);
if (lentry) {
gst_props_remove_entry (props, (GstPropsEntry *)lentry->data);
}
gst_props_remove_entry_by_id (props, quark);
}
/**
@ -949,7 +976,8 @@ gst_props_debug (GstProps *props)
return;
}
GST_DEBUG (GST_CAT_PROPERTIES, "props %p, refcount %d, flags %d", props, props->refcount, props->flags);
GST_DEBUG (GST_CAT_PROPERTIES, "props %p, refcount %d, flags %d",
props, props->refcount, props->flags);
g_list_foreach (props->properties, (GFunc) gst_props_debug_entry, NULL);
}
@ -1237,26 +1265,66 @@ GstProps*
gst_props_set (GstProps *props, const gchar *name, ...)
{
GQuark quark;
GList *lentry;
GList *properties;
va_list var_args;
gboolean found;
gboolean was_fixed;
g_return_val_if_fail (props != NULL, NULL);
found = FALSE;
was_fixed = GST_PROPS_IS_FIXED (props);
GST_PROPS_FLAG_SET (props, GST_PROPS_FIXED);
quark = g_quark_from_string (name);
lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func);
if (lentry) {
/* this looks a little complicated but the idea is to get
* out of the loop ASAP. Changing the entry to a variable
* property immediatly marks the props as non-fixed.
* changing the entry to fixed when the props was fixed
* does not change the props and we can get out of the loop
* as well.
* When changing the entry to a fixed entry, we need to
* see if all entries are fixed before we can decide the props
*/
properties = props->properties;
while (properties) {
GstPropsEntry *entry;
entry = (GstPropsEntry *)lentry->data;
entry = (GstPropsEntry *) properties->data;
va_start (var_args, name);
gst_props_entry_clean (entry);
GST_PROPS_ENTRY_FILL (entry, var_args);
va_end (var_args);
if (entry->propid == quark) {
found = TRUE;
va_start (var_args, name);
gst_props_entry_clean (entry);
GST_PROPS_ENTRY_FILL (entry, var_args);
va_end (var_args);
/* if the props was fixed and we changed this entry
* with a fixed entry, we can stop now as the global
* props flag cannot change */
if (was_fixed && !GST_PROPS_ENTRY_IS_VARIABLE (entry))
break;
/* if we already found a non fixed entry we can exit */
if (!GST_PROPS_IS_FIXED (props))
break;
/* if the entry is variable, we'll get out of the loop
* in the next statement */
/* if the entry is fixed we have to check all other
* entries before we can decide if the props are fixed */
}
if (GST_PROPS_ENTRY_IS_VARIABLE (entry)) {
/* mark the props as variable */
GST_PROPS_FLAG_UNSET (props, GST_PROPS_FIXED);
/* if we already changed the entry, we can stop now */
if (found)
break;
}
properties = g_list_next (properties);
}
else {
if (!found) {
g_warning ("gstprops: no property '%s' to change\n", name);
}
@ -2424,7 +2492,9 @@ gst_props_normalize (GstProps *props)
GList *lentry;
newprops = gst_props_copy (props);
lentry = g_list_find_custom (newprops->properties, GINT_TO_POINTER (list_entry->propid), props_find_func);
lentry = g_list_find_custom (newprops->properties,
GINT_TO_POINTER (list_entry->propid),
props_find_func);
if (lentry) {
GList *new_list;

View file

@ -101,15 +101,15 @@ typedef enum {
} GstPropsFlags;
#define GST_PROPS_FLAGS(props) ((props)->flags)
#define GST_PROPS_FLAG_IS_SET(props,flag) (GST_PROPS_FLAGS (props) & flag)
#define GST_PROPS_FLAG_SET(props,flag) (GST_PROPS_FLAGS (props) |= (flag))
#define GST_PROPS_FLAG_IS_SET(props,flag) (GST_PROPS_FLAGS (props) & (flag))
#define GST_PROPS_FLAG_SET(props,flag) (GST_PROPS_FLAGS (props) |= (flag))
#define GST_PROPS_FLAG_UNSET(props,flag) (GST_PROPS_FLAGS (props) &= ~(flag))
#define GST_PROPS_REFCOUNT(props) ((props)->refcount)
#define GST_PROPS_PROPERTIES(props) ((props)->properties)
#define GST_PROPS_IS_FIXED(props) (GST_PROPS_FLAGS (props) & GST_PROPS_FIXED)
#define GST_PROPS_IS_FLOATING(props) (GST_PROPS_FLAGS (props) & GST_PROPS_FLOATING)
#define GST_PROPS_IS_FIXED(props) (GST_PROPS_FLAG_IS_SET ((props), GST_PROPS_FIXED))
#define GST_PROPS_IS_FLOATING(props) (GST_PROPS_FLAG_IS_SET ((props), GST_PROPS_FLOATING))
struct _GstProps {
gint refcount;