mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 10:41:04 +00:00
testsuite/caps/value_serialize.c: merge from HEAD.
Original commit message from CVS: 2005-02-10 Andy Wingo <wingo@pobox.com> * testsuite/caps/value_serialize.c: merge from HEAD. * testsuite/caps/subtract.c: * testsuite/caps/filtercaps.c: * testsuite/caps/enumcaps.c: * testsuite/caps/deserialize.c: * testsuite/caps/caps.c: * testsuite/caps/audioscale.c: Unref caps, not free. * testsuite/caps/caps_strings: Merged from HEAD. * gst/elements/gstidentity.c (gst_identity_proxy_getcaps): Getcaps implementation for identity. * gst/gststructure.h * gst/gststructure.c (gst_caps_structure_fixate_field_nearest_double): (gst_caps_structure_fixate_field_nearest_int): Moved from gstcaps.c because we need the private IS_MUTABLE macro. (IS_MUTABLE): New macro, determines if a structure is mutable or not. (gst_structure_free): Don't allow free while holding a pointer to a parent's refcount. (gst_structure_set_name): Check for writability. (gst_structure_id_set_value): Same. (gst_structure_set_value): Same. (gst_structure_set_valist): Same. (gst_structure_remove_field): Same. (gst_structure_remove_all_fields): Same. (gst_structure_map_in_place): New routine, like _foreach but allows the function to mutate the value (via a non-const prototype). Check for writability. (gst_structure_foreach): Redefine to only take non-mutating functions. * gst/gstcaps.c (IS_WRITABLE): New macro, returns TRUE if the caps are writable. (gst_caps_copy): Add some docs about mutability, etc. (_gst_caps_free): Set the parent refcount pointer on structures to NULL before freeing them. (gst_caps_ref): Document. (gst_caps_make_writable): Doc. (gst_caps_make_writable): Changed to make_writable, get_writable sounds too much like retrieving a property. (gst_caps_copy_1): Removed, not very useful. (gst_caps_ref_by_count): Removed, no need to have something GLib doesn't. (gst_caps_copy_conditional): Ref instead of copying. (gst_static_caps_get): Retain a reference to the returned caps, so that the static caps will remain immutable. (gst_caps_remove_and_get_structure): Set the parent refcount to NULL when removing the structure. (gst_caps_append): Fix to work with structure parent refcounts. Check for writability. (gst_caps_append_structure): Check for writability, work with parent refcounts. (gst_caps_remove_structure): Check for writability. (gst_caps_set_simple): Check for writability. (gst_caps_set_simple_valist): Check for writability. (gst_caps_is_fixed_foreach): Update for non-mutating foreach. (gst_structure_is_equal_foreach): Same. (gst_caps_structure_intersect_field): Same. (gst_caps_structure_subtract_field): Same. Make static. (gst_caps_normalize_foreach): Same. (gst_caps_structure_figure_out_union): Same. (gst_caps_switch_structures): New static function, switches out structures inside a caps, taking care of parent_refcount setting. * gst/gstpad.c (gst_pad_get_allowed_caps): Remove the restriction on only src pads, wim von masterhack claims it was bogus. * testsuite/caps/Makefile.am * testsuite/caps/app_fixate.c: Removed app_fixate test, things are done a bit differently in THREADED.
This commit is contained in:
parent
45529cf00a
commit
7c0804b15c
38 changed files with 712 additions and 558 deletions
77
ChangeLog
77
ChangeLog
|
@ -10,6 +10,83 @@
|
|||
* docs/design/part-states.txt:
|
||||
Some docs updates.
|
||||
|
||||
2005-02-10 Andy Wingo <wingo@pobox.com>
|
||||
|
||||
* testsuite/caps/value_serialize.c: merge from HEAD.
|
||||
|
||||
* testsuite/caps/subtract.c:
|
||||
* testsuite/caps/filtercaps.c:
|
||||
* testsuite/caps/enumcaps.c:
|
||||
* testsuite/caps/deserialize.c:
|
||||
* testsuite/caps/caps.c:
|
||||
* testsuite/caps/audioscale.c: Unref caps, not free.
|
||||
|
||||
* testsuite/caps/caps_strings: Merged from HEAD.
|
||||
|
||||
* gst/elements/gstidentity.c (gst_identity_proxy_getcaps): Getcaps
|
||||
implementation for identity.
|
||||
|
||||
* gst/gststructure.h
|
||||
* gst/gststructure.c
|
||||
(gst_caps_structure_fixate_field_nearest_double):
|
||||
(gst_caps_structure_fixate_field_nearest_int): Moved from
|
||||
gstcaps.c because we need the private IS_MUTABLE macro.
|
||||
(IS_MUTABLE): New macro, determines if a
|
||||
structure is mutable or not.
|
||||
(gst_structure_free): Don't allow free while holding a pointer to
|
||||
a parent's refcount.
|
||||
(gst_structure_set_name): Check for writability.
|
||||
(gst_structure_id_set_value): Same.
|
||||
(gst_structure_set_value): Same.
|
||||
(gst_structure_set_valist): Same.
|
||||
(gst_structure_remove_field): Same.
|
||||
(gst_structure_remove_all_fields): Same.
|
||||
(gst_structure_map_in_place): New routine, like _foreach but
|
||||
allows the function to mutate the value (via a non-const
|
||||
prototype). Check for writability.
|
||||
(gst_structure_foreach): Redefine to only take non-mutating
|
||||
functions.
|
||||
|
||||
* gst/gstcaps.c (IS_WRITABLE): New macro, returns TRUE if the caps
|
||||
are writable.
|
||||
(gst_caps_copy): Add some docs about mutability, etc.
|
||||
(_gst_caps_free): Set the parent refcount pointer on structures to
|
||||
NULL before freeing them.
|
||||
(gst_caps_ref): Document.
|
||||
(gst_caps_make_writable): Doc.
|
||||
(gst_caps_make_writable): Changed to make_writable, get_writable
|
||||
sounds too much like retrieving a property.
|
||||
(gst_caps_copy_1): Removed, not very useful.
|
||||
(gst_caps_ref_by_count): Removed, no need to have something GLib
|
||||
doesn't.
|
||||
(gst_caps_copy_conditional): Ref instead of copying.
|
||||
(gst_static_caps_get): Retain a reference to the returned caps, so
|
||||
that the static caps will remain immutable.
|
||||
(gst_caps_remove_and_get_structure): Set the parent refcount to
|
||||
NULL when removing the structure.
|
||||
(gst_caps_append): Fix to work with structure parent refcounts.
|
||||
Check for writability.
|
||||
(gst_caps_append_structure): Check for writability, work with
|
||||
parent refcounts.
|
||||
(gst_caps_remove_structure): Check for writability.
|
||||
(gst_caps_set_simple): Check for writability.
|
||||
(gst_caps_set_simple_valist): Check for writability.
|
||||
(gst_caps_is_fixed_foreach): Update for non-mutating foreach.
|
||||
(gst_structure_is_equal_foreach): Same.
|
||||
(gst_caps_structure_intersect_field): Same.
|
||||
(gst_caps_structure_subtract_field): Same. Make static.
|
||||
(gst_caps_normalize_foreach): Same.
|
||||
(gst_caps_structure_figure_out_union): Same.
|
||||
(gst_caps_switch_structures): New static function, switches out
|
||||
structures inside a caps, taking care of parent_refcount setting.
|
||||
|
||||
* gst/gstpad.c (gst_pad_get_allowed_caps): Remove the restriction
|
||||
on only src pads, wim von masterhack claims it was bogus.
|
||||
|
||||
* testsuite/caps/Makefile.am
|
||||
* testsuite/caps/app_fixate.c: Removed app_fixate test, things are
|
||||
done a bit differently in THREADED.
|
||||
|
||||
2005-02-10 Andy Wingo <wingo@pobox.com>
|
||||
|
||||
* docs/design/part-MT-refcounting.txt (Refcounting): Some
|
||||
|
|
|
@ -105,6 +105,7 @@ static GstFlowReturn gst_identity_chain (GstPad * pad, GstBuffer * buffer);
|
|||
static GstFlowReturn gst_identity_getrange (GstPad * pad, guint64 offset,
|
||||
guint length, GstBuffer ** buffer);
|
||||
static void gst_identity_set_clock (GstElement * element, GstClock * clock);
|
||||
static GstCaps *gst_identity_proxy_getcaps (GstPad * pad);
|
||||
|
||||
|
||||
static guint gst_identity_signals[LAST_SIGNAL] = { 0 };
|
||||
|
@ -208,12 +209,16 @@ gst_identity_init (GstIdentity * identity)
|
|||
gst_element_add_pad (GST_ELEMENT (identity), identity->sinkpad);
|
||||
gst_pad_set_chain_function (identity->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_chain));
|
||||
gst_pad_set_getcaps_function (identity->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_proxy_getcaps));
|
||||
gst_pad_set_event_function (identity->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_event));
|
||||
|
||||
identity->srcpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
gst_pad_set_getcaps_function (identity->srcpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_proxy_getcaps));
|
||||
gst_pad_set_getrange_function (identity->srcpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_getrange));
|
||||
gst_element_add_pad (GST_ELEMENT (identity), identity->srcpad);
|
||||
|
@ -240,6 +245,17 @@ gst_identity_set_clock (GstElement * element, GstClock * clock)
|
|||
gst_object_replace ((GstObject **) & identity->clock, (GstObject *) clock);
|
||||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_identity_proxy_getcaps (GstPad * pad)
|
||||
{
|
||||
GstPad *otherpad;
|
||||
GstIdentity *identity = GST_IDENTITY (GST_OBJECT_PARENT (pad));
|
||||
|
||||
otherpad = pad == identity->srcpad ? identity->sinkpad : identity->srcpad;
|
||||
|
||||
return gst_pad_peer_get_caps (otherpad);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_identity_event (GstPad * pad, GstEvent * event)
|
||||
{
|
||||
|
|
326
gst/gstcaps.c
326
gst/gstcaps.c
|
@ -43,13 +43,15 @@
|
|||
structure = _newstruct; \
|
||||
} \
|
||||
} G_STMT_END
|
||||
#define IS_WRITABLE(caps) \
|
||||
(gst_atomic_int_read(&(caps)->refcount) == 1)
|
||||
|
||||
|
||||
static void gst_caps_transform_to_string (const GValue * src_value,
|
||||
GValue * dest_value);
|
||||
static gboolean gst_caps_from_string_inplace (GstCaps * caps,
|
||||
const gchar * string);
|
||||
static GstCaps *gst_caps_copy_conditional (const GstCaps * src);
|
||||
static GstCaps *gst_caps_copy_conditional (GstCaps * src);
|
||||
|
||||
GType
|
||||
gst_caps_get_type (void)
|
||||
|
@ -194,10 +196,16 @@ gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
|
|||
|
||||
/**
|
||||
* gst_caps_copy:
|
||||
* @caps: the #GstCaps to copy
|
||||
* @caps: the caps structure to copy
|
||||
*
|
||||
* Deeply copies a #GstCaps, including all structures and all the
|
||||
* structures' values.
|
||||
* Creates a new #GstCaps as a copy of the old @caps. The new caps will have a
|
||||
* refcount of 1, owned by the caller. The structures are copied as well.
|
||||
*
|
||||
* Note that this function is the semantic equivalent of a gst_caps_ref()
|
||||
* followed by a gst_caps_make_writable(). If you only want to hold on to a
|
||||
* reference to the data, you should use gst_caps_ref().
|
||||
*
|
||||
* When you are finished with the caps, call gst_caps_unref() on it.
|
||||
*
|
||||
* Returns: the new #GstCaps
|
||||
*/
|
||||
|
@ -227,10 +235,12 @@ _gst_caps_free (GstCaps * caps)
|
|||
GstStructure *structure;
|
||||
int i;
|
||||
|
||||
g_return_if_fail (GST_IS_CAPS (caps));
|
||||
/* The refcount must be 0, but since we're only called by gst_caps_unref,
|
||||
* don't bother testing. */
|
||||
|
||||
for (i = 0; i < caps->structs->len; i++) {
|
||||
structure = gst_caps_get_structure (caps, i);
|
||||
structure = (GstStructure *) gst_caps_get_structure (caps, i);
|
||||
gst_structure_set_parent_refcount (structure, NULL);
|
||||
gst_structure_free (structure);
|
||||
}
|
||||
g_ptr_array_free (caps->structs, TRUE);
|
||||
|
@ -241,8 +251,26 @@ _gst_caps_free (GstCaps * caps)
|
|||
g_free (caps);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_make_writable:
|
||||
* @caps: the #GstCaps to make writable
|
||||
*
|
||||
* Returns a writable copy of @caps.
|
||||
*
|
||||
* If there is only one reference count on @caps, the caller must be the owner,
|
||||
* and so this function will return the caps object unchanged. If on the other
|
||||
* hand there is more than one reference on the object, a new caps object will
|
||||
* be returned. The caller's reference on @caps will be removed, and instead the
|
||||
* caller will own a reference to the returned object.
|
||||
*
|
||||
* In short, this function unrefs the caps in the argument and refs the caps
|
||||
* that it returns. Don't access the argument after calling this function. See
|
||||
* also: gst_caps_ref().
|
||||
*
|
||||
* Returns: the same #GstCaps object.
|
||||
*/
|
||||
GstCaps *
|
||||
gst_caps_get_writable (GstCaps * caps)
|
||||
gst_caps_make_writable (GstCaps * caps)
|
||||
{
|
||||
GstCaps *copy;
|
||||
|
||||
|
@ -259,6 +287,21 @@ gst_caps_get_writable (GstCaps * caps)
|
|||
return copy;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_ref:
|
||||
* @caps: the #GstCaps to reference
|
||||
*
|
||||
* Add a reference to a #GstCaps object.
|
||||
*
|
||||
* From this point on, until the caller calls gst_caps_unref() or
|
||||
* gst_caps_make_writable(), it is guaranteed that the caps object will not
|
||||
* change. This means its structures won't change, etc. To use a #GstCaps
|
||||
* object, you must always have a refcount on it -- either the one made
|
||||
* implicitly by gst_caps_new(), or via taking one explicitly with this
|
||||
* function.
|
||||
*
|
||||
* Returns: the same #GstCaps object.
|
||||
*/
|
||||
GstCaps *
|
||||
gst_caps_ref (GstCaps * caps)
|
||||
{
|
||||
|
@ -274,21 +317,6 @@ gst_caps_ref (GstCaps * caps)
|
|||
return caps;
|
||||
}
|
||||
|
||||
GstCaps *
|
||||
gst_caps_ref_by_count (GstCaps * caps, gint count)
|
||||
{
|
||||
g_return_val_if_fail (caps != NULL, NULL);
|
||||
|
||||
#ifdef DEBUG_REFCOUNT
|
||||
GST_CAT_LOG (GST_CAT_CAPS, "%p %d->%d", caps,
|
||||
GST_CAPS_REFCOUNT_VALUE (caps), GST_CAPS_REFCOUNT_VALUE (caps) + count);
|
||||
#endif
|
||||
|
||||
gst_atomic_int_add (&caps->refcount, count);
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_unref:
|
||||
* @caps: the #GstCaps to unref
|
||||
|
@ -327,14 +355,21 @@ gst_static_caps_get (GstStaticCaps * static_caps)
|
|||
GstCaps *caps = (GstCaps *) static_caps;
|
||||
gboolean ret;
|
||||
|
||||
|
||||
if (caps->type == 0) {
|
||||
caps->type = GST_TYPE_CAPS;
|
||||
/* initialize the caps to a refcount of 1 so the caps can be writable... */
|
||||
gst_atomic_int_init (&(caps)->refcount, 1);
|
||||
caps->structs = g_ptr_array_new ();
|
||||
ret = gst_caps_from_string_inplace (caps, static_caps->string);
|
||||
|
||||
if (!ret) {
|
||||
g_critical ("Could not convert static caps \"%s\"", static_caps->string);
|
||||
}
|
||||
/* and now that we return it to the user, keep a ref for ourselves. This
|
||||
* makes the caps immutable... AND INVINCIBLE! WOULD YOU LIKE TO TRY MY
|
||||
* IMMUTABLE CAPS STYLE? I AM A CAPS WARRIOR!!! */
|
||||
gst_caps_ref (caps);
|
||||
}
|
||||
|
||||
return caps;
|
||||
|
@ -342,14 +377,24 @@ gst_static_caps_get (GstStaticCaps * static_caps)
|
|||
|
||||
/* manipulation */
|
||||
|
||||
static GstStructure *
|
||||
gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
|
||||
{
|
||||
/* don't use index_fast, gst_caps_simplify relies on the order */
|
||||
GstStructure *s = g_ptr_array_remove_index (caps->structs, idx);
|
||||
|
||||
gst_structure_set_parent_refcount (s, NULL);
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_append:
|
||||
* @caps1: the #GstCaps that will be appended to
|
||||
* @caps2: the #GstCaps to append
|
||||
*
|
||||
* Appends the structures contained in @caps2 to @caps1. The structures
|
||||
* in @caps2 are not copied -- they are transferred to @caps1, and then
|
||||
* @caps2 is freed.
|
||||
* Appends the structures contained in @caps2 to @caps1. The structures in
|
||||
* @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
|
||||
* freed. If either caps is ANY, the resulting caps will be ANY.
|
||||
*/
|
||||
void
|
||||
gst_caps_append (GstCaps * caps1, GstCaps * caps2)
|
||||
|
@ -359,28 +404,25 @@ gst_caps_append (GstCaps * caps1, GstCaps * caps2)
|
|||
|
||||
g_return_if_fail (GST_IS_CAPS (caps1));
|
||||
g_return_if_fail (GST_IS_CAPS (caps2));
|
||||
g_return_if_fail (IS_WRITABLE (caps1));
|
||||
g_return_if_fail (IS_WRITABLE (caps2));
|
||||
|
||||
#ifdef USE_POISONING
|
||||
CAPS_POISON (caps2);
|
||||
#endif
|
||||
if (gst_caps_is_any (caps1) || gst_caps_is_any (caps2)) {
|
||||
/* FIXME: this leaks */
|
||||
caps1->flags |= GST_CAPS_FLAGS_ANY;
|
||||
for (i = 0; i < caps2->structs->len; i++) {
|
||||
structure = gst_caps_get_structure (caps2, i);
|
||||
gst_structure_remove_all_fields (structure);
|
||||
for (i = caps2->structs->len - 1; i >= 0; i--) {
|
||||
structure = gst_caps_remove_and_get_structure (caps2, i);
|
||||
gst_structure_free (structure);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < caps2->structs->len; i++) {
|
||||
structure = gst_caps_get_structure (caps2, i);
|
||||
int len = caps2->structs->len;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
structure = gst_caps_remove_and_get_structure (caps2, 0);
|
||||
gst_caps_append_structure (caps1, structure);
|
||||
}
|
||||
}
|
||||
g_ptr_array_free (caps2->structs, TRUE);
|
||||
#ifdef USE_POISONING
|
||||
memset (caps2, 0xff, sizeof (GstCaps));
|
||||
#endif
|
||||
g_free (caps2);
|
||||
|
||||
gst_caps_unref (caps2); /* guaranteed to free it */
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -395,24 +437,20 @@ void
|
|||
gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
|
||||
{
|
||||
g_return_if_fail (GST_IS_CAPS (caps));
|
||||
g_return_if_fail (IS_WRITABLE (caps));
|
||||
|
||||
if (structure) {
|
||||
g_return_if_fail (structure->parent_refcount == NULL);
|
||||
#if 0
|
||||
#ifdef USE_POISONING
|
||||
STRUCTURE_POISON (structure);
|
||||
#endif
|
||||
#endif
|
||||
gst_structure_set_parent_refcount (structure, &caps->refcount);
|
||||
g_ptr_array_add (caps->structs, structure);
|
||||
}
|
||||
}
|
||||
|
||||
static GstStructure *
|
||||
gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
|
||||
{
|
||||
/* don't use index_fast, gst_caps_simplify relies on the order */
|
||||
return g_ptr_array_remove_index (caps->structs, idx);
|
||||
}
|
||||
|
||||
/*
|
||||
* gst_caps_remove_structure:
|
||||
* @caps: the #GstCaps to remove from
|
||||
|
@ -428,6 +466,7 @@ gst_caps_remove_structure (GstCaps * caps, guint idx)
|
|||
|
||||
g_return_if_fail (caps != NULL);
|
||||
g_return_if_fail (idx <= gst_caps_get_size (caps));
|
||||
g_return_if_fail (IS_WRITABLE (caps));
|
||||
|
||||
structure = gst_caps_remove_and_get_structure (caps, idx);
|
||||
gst_structure_free (structure);
|
||||
|
@ -491,34 +530,6 @@ gst_caps_get_structure (const GstCaps * caps, int index)
|
|||
return g_ptr_array_index (caps->structs, index);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_copy_1:
|
||||
* @caps: the @GstCaps to copy
|
||||
*
|
||||
* Creates a new @GstCaps and appends a copy of the first structure
|
||||
* contained in @caps.
|
||||
*
|
||||
* Returns: the new @GstCaps
|
||||
*/
|
||||
GstCaps *
|
||||
gst_caps_copy_1 (const GstCaps * caps)
|
||||
{
|
||||
GstCaps *newcaps;
|
||||
GstStructure *structure;
|
||||
|
||||
g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
|
||||
|
||||
newcaps = gst_caps_new_empty ();
|
||||
newcaps->flags = caps->flags;
|
||||
|
||||
if (caps->structs->len > 0) {
|
||||
structure = gst_caps_get_structure (caps, 0);
|
||||
gst_caps_append_structure (newcaps, gst_structure_copy (structure));
|
||||
}
|
||||
|
||||
return newcaps;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_set_simple:
|
||||
* @caps: the @GstCaps to set
|
||||
|
@ -537,6 +548,7 @@ gst_caps_set_simple (GstCaps * caps, char *field, ...)
|
|||
|
||||
g_return_if_fail (GST_IS_CAPS (caps));
|
||||
g_return_if_fail (caps->structs->len == 1);
|
||||
g_return_if_fail (IS_WRITABLE (caps));
|
||||
|
||||
structure = gst_caps_get_structure (caps, 0);
|
||||
|
||||
|
@ -562,6 +574,7 @@ gst_caps_set_simple_valist (GstCaps * caps, char *field, va_list varargs)
|
|||
|
||||
g_return_if_fail (GST_IS_CAPS (caps));
|
||||
g_return_if_fail (caps->structs->len != 1);
|
||||
g_return_if_fail (IS_WRITABLE (caps));
|
||||
|
||||
structure = gst_caps_get_structure (caps, 0);
|
||||
|
||||
|
@ -606,7 +619,8 @@ gst_caps_is_empty (const GstCaps * caps)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_caps_is_fixed_foreach (GQuark field_id, GValue * value, gpointer unused)
|
||||
gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
|
||||
gpointer unused)
|
||||
{
|
||||
return gst_value_is_fixed (value);
|
||||
}
|
||||
|
@ -637,7 +651,8 @@ gst_caps_is_fixed (const GstCaps * caps)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_structure_is_equal_foreach (GQuark field_id, GValue * val2, gpointer data)
|
||||
gst_structure_is_equal_foreach (GQuark field_id, const GValue * val2,
|
||||
gpointer data)
|
||||
{
|
||||
GstStructure *struct1 = (GstStructure *) data;
|
||||
const GValue *val1 = gst_structure_id_get_value (struct1, field_id);
|
||||
|
@ -766,7 +781,8 @@ typedef struct
|
|||
IntersectData;
|
||||
|
||||
static gboolean
|
||||
gst_caps_structure_intersect_field (GQuark id, GValue * val1, gpointer data)
|
||||
gst_caps_structure_intersect_field (GQuark id, const GValue * val1,
|
||||
gpointer data)
|
||||
{
|
||||
IntersectData *idata = (IntersectData *) data;
|
||||
GValue dest_value = { 0 };
|
||||
|
@ -942,8 +958,8 @@ typedef struct
|
|||
SubtractionEntry;
|
||||
|
||||
|
||||
gboolean
|
||||
gst_caps_structure_subtract_field (GQuark field_id, GValue * value,
|
||||
static gboolean
|
||||
gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
|
||||
gpointer user_data)
|
||||
{
|
||||
SubtractionEntry *e = user_data;
|
||||
|
@ -1103,7 +1119,7 @@ typedef struct _NormalizeForeach
|
|||
NormalizeForeach;
|
||||
|
||||
static gboolean
|
||||
gst_caps_normalize_foreach (GQuark field_id, GValue * value, gpointer ptr)
|
||||
gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
|
||||
{
|
||||
NormalizeForeach *nf = (NormalizeForeach *) ptr;
|
||||
GValue val = { 0 };
|
||||
|
@ -1209,7 +1225,7 @@ typedef struct
|
|||
UnionField;
|
||||
|
||||
static gboolean
|
||||
gst_caps_structure_figure_out_union (GQuark field_id, GValue * value,
|
||||
gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
|
||||
gpointer user_data)
|
||||
{
|
||||
UnionField *u = user_data;
|
||||
|
@ -1297,6 +1313,16 @@ gst_caps_structure_simplify (GstStructure ** result,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
|
||||
GstStructure * new, gint i)
|
||||
{
|
||||
gst_structure_set_parent_refcount (old, NULL);
|
||||
gst_structure_free (old);
|
||||
gst_structure_set_parent_refcount (new, &caps->refcount);
|
||||
g_ptr_array_index (caps->structs, i) = new;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_do_simplify:
|
||||
* @caps: a #GstCaps to simplify
|
||||
|
@ -1316,6 +1342,7 @@ gst_caps_do_simplify (GstCaps * caps)
|
|||
gboolean changed = FALSE;
|
||||
|
||||
g_return_val_if_fail (caps != NULL, FALSE);
|
||||
g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
|
||||
|
||||
if (gst_caps_get_size (caps) < 2)
|
||||
return FALSE;
|
||||
|
@ -1344,9 +1371,7 @@ gst_caps_do_simplify (GstCaps * caps)
|
|||
result ? gst_structure_to_string (result) : "---");
|
||||
#endif
|
||||
if (result) {
|
||||
gst_structure_free (simplify);
|
||||
g_ptr_array_index (caps->structs, i) = result;
|
||||
simplify = result;
|
||||
gst_caps_switch_structures (caps, simplify, result, i);
|
||||
} else {
|
||||
gst_caps_remove_structure (caps, i);
|
||||
start--;
|
||||
|
@ -1556,140 +1581,11 @@ gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
|
|||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_caps_copy_conditional (const GstCaps * src)
|
||||
gst_caps_copy_conditional (GstCaps * src)
|
||||
{
|
||||
if (src) {
|
||||
return gst_caps_copy (src);
|
||||
return gst_caps_ref (src);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* fixate utility functions */
|
||||
|
||||
/**
|
||||
* gst_caps_structure_fixate_field_nearest_int:
|
||||
* @structure: a #GstStructure
|
||||
* @field_name: a field in @structure
|
||||
* @target: the target value of the fixation
|
||||
*
|
||||
* Fixates a #GstStructure by changing the given field to the nearest
|
||||
* integer to @target that is a subset of the existing field.
|
||||
*
|
||||
* Returns: TRUE if the structure could be fixated
|
||||
*/
|
||||
gboolean
|
||||
gst_caps_structure_fixate_field_nearest_int (GstStructure * structure,
|
||||
const char *field_name, int target)
|
||||
{
|
||||
const GValue *value;
|
||||
|
||||
g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
|
||||
|
||||
value = gst_structure_get_value (structure, field_name);
|
||||
|
||||
if (G_VALUE_TYPE (value) == G_TYPE_INT) {
|
||||
/* already fixed */
|
||||
return FALSE;
|
||||
} else if (G_VALUE_TYPE (value) == GST_TYPE_INT_RANGE) {
|
||||
int x;
|
||||
|
||||
x = gst_value_get_int_range_min (value);
|
||||
if (target < x)
|
||||
target = x;
|
||||
x = gst_value_get_int_range_max (value);
|
||||
if (target > x)
|
||||
target = x;
|
||||
gst_structure_set (structure, field_name, G_TYPE_INT, target, NULL);
|
||||
return TRUE;
|
||||
} else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
|
||||
const GValue *list_value;
|
||||
int i, n;
|
||||
int best = 0;
|
||||
int best_index = -1;
|
||||
|
||||
n = gst_value_list_get_size (value);
|
||||
for (i = 0; i < n; i++) {
|
||||
list_value = gst_value_list_get_value (value, i);
|
||||
if (G_VALUE_TYPE (list_value) == G_TYPE_INT) {
|
||||
int x = g_value_get_int (list_value);
|
||||
|
||||
if (best_index == -1 || (ABS (target - x) < ABS (target - best))) {
|
||||
best_index = i;
|
||||
best = x;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (best_index != -1) {
|
||||
gst_structure_set (structure, field_name, G_TYPE_INT, best, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_structure_fixate_field_nearest_double:
|
||||
* @structure: a #GstStructure
|
||||
* @field_name: a field in @structure
|
||||
* @target: the target value of the fixation
|
||||
*
|
||||
* Fixates a #GstStructure by changing the given field to the nearest
|
||||
* double to @target that is a subset of the existing field.
|
||||
*
|
||||
* Returns: TRUE if the structure could be fixated
|
||||
*/
|
||||
gboolean
|
||||
gst_caps_structure_fixate_field_nearest_double (GstStructure * structure,
|
||||
const char *field_name, double target)
|
||||
{
|
||||
const GValue *value;
|
||||
|
||||
g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
|
||||
|
||||
value = gst_structure_get_value (structure, field_name);
|
||||
|
||||
if (G_VALUE_TYPE (value) == G_TYPE_DOUBLE) {
|
||||
/* already fixed */
|
||||
return FALSE;
|
||||
} else if (G_VALUE_TYPE (value) == GST_TYPE_DOUBLE_RANGE) {
|
||||
double x;
|
||||
|
||||
x = gst_value_get_double_range_min (value);
|
||||
if (target < x)
|
||||
target = x;
|
||||
x = gst_value_get_double_range_max (value);
|
||||
if (target > x)
|
||||
target = x;
|
||||
gst_structure_set (structure, field_name, G_TYPE_DOUBLE, target, NULL);
|
||||
return TRUE;
|
||||
} else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
|
||||
const GValue *list_value;
|
||||
int i, n;
|
||||
double best = 0;
|
||||
int best_index = -1;
|
||||
|
||||
n = gst_value_list_get_size (value);
|
||||
for (i = 0; i < n; i++) {
|
||||
list_value = gst_value_list_get_value (value, i);
|
||||
if (G_VALUE_TYPE (list_value) == G_TYPE_DOUBLE) {
|
||||
double x = g_value_get_double (list_value);
|
||||
|
||||
if (best_index == -1 || (ABS (target - x) < ABS (target - best))) {
|
||||
best_index = i;
|
||||
best = x;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (best_index != -1) {
|
||||
gst_structure_set (structure, field_name, G_TYPE_DOUBLE, best, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
|
|
@ -89,13 +89,11 @@ GstCaps * gst_caps_new_full (GstStru
|
|||
...);
|
||||
GstCaps * gst_caps_new_full_valist (GstStructure *structure,
|
||||
va_list var_args);
|
||||
GstCaps * gst_caps_copy (const GstCaps *caps);
|
||||
GstCaps * gst_caps_copy_1 (const GstCaps *caps);
|
||||
|
||||
/* reference counting */
|
||||
GstCaps * gst_caps_get_writable (GstCaps *caps);
|
||||
GstCaps * gst_caps_ref (GstCaps* caps);
|
||||
GstCaps * gst_caps_ref_by_count (GstCaps* caps, gint count);
|
||||
GstCaps * gst_caps_copy (const GstCaps * caps);
|
||||
GstCaps * gst_caps_make_writable (GstCaps *caps);
|
||||
void gst_caps_unref (GstCaps* caps);
|
||||
|
||||
G_CONST_RETURN GstCaps * gst_static_caps_get (GstStaticCaps *static_caps);
|
||||
|
@ -147,12 +145,6 @@ void gst_caps_replace (GstCaps
|
|||
gchar * gst_caps_to_string (const GstCaps *caps);
|
||||
GstCaps * gst_caps_from_string (const gchar *string);
|
||||
|
||||
gboolean gst_caps_structure_fixate_field_nearest_int (GstStructure *structure,
|
||||
const char *field_name,
|
||||
int target);
|
||||
gboolean gst_caps_structure_fixate_field_nearest_double (GstStructure *structure,
|
||||
const char *field_name,
|
||||
double target);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
13
gst/gstpad.c
13
gst/gstpad.c
|
@ -2255,11 +2255,6 @@ gst_pad_get_allowed_caps (GstPad * srcpad)
|
|||
|
||||
GST_PAD_REALIZE_AND_LOCK (srcpad, realpad, lost_ghostpad);
|
||||
|
||||
/* FIXME, allow sinkpads too? need to use the nexted locking
|
||||
* with retry algorithm, see design docs */
|
||||
if (G_UNLIKELY (!GST_PAD_IS_SRC (realpad)))
|
||||
goto not_src;
|
||||
|
||||
if (G_UNLIKELY ((peer = GST_RPAD_PEER (realpad)) == NULL))
|
||||
goto no_peer;
|
||||
|
||||
|
@ -2284,14 +2279,6 @@ gst_pad_get_allowed_caps (GstPad * srcpad)
|
|||
lost_ghostpad:
|
||||
{
|
||||
GST_UNLOCK (srcpad);
|
||||
return NULL;
|
||||
}
|
||||
not_src:
|
||||
{
|
||||
GST_CAT_DEBUG (GST_CAT_PROPERTIES, "%s:%s: not a source pad",
|
||||
GST_DEBUG_PAD_NAME (realpad));
|
||||
GST_UNLOCK (realpad);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
no_peer:
|
||||
|
|
|
@ -40,6 +40,10 @@ struct _GstStructureField
|
|||
#define GST_STRUCTURE_FIELD(structure, index) \
|
||||
&g_array_index((structure)->fields, GstStructureField, (index))
|
||||
|
||||
#define IS_MUTABLE(structure) \
|
||||
(!(structure)->parent_refcount || \
|
||||
gst_atomic_int_read ((structure)->parent_refcount) == 1)
|
||||
|
||||
static void gst_structure_set_field (GstStructure * structure,
|
||||
GstStructureField * field);
|
||||
static GstStructureField *gst_structure_get_field (const GstStructure *
|
||||
|
@ -173,6 +177,30 @@ gst_structure_new_valist (const gchar * name,
|
|||
return structure;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_structure_set_parent_refcount:
|
||||
* @structure: a #GstStructure
|
||||
* @refcount: a pointer to the parent's #GstAtomicInt refcount
|
||||
*
|
||||
* Sets the parent_refcount field of #GstStructure. This field is used to
|
||||
* determine whether a structure is mutable or not. This function should only be
|
||||
* called by code implementing parent objects of GstStructure, as described in
|
||||
* the MT Refcounting section of the design documents.
|
||||
*
|
||||
* Returns: a new #GstStructure.
|
||||
*/
|
||||
void
|
||||
gst_structure_set_parent_refcount (GstStructure * structure,
|
||||
GstAtomicInt * refcount)
|
||||
{
|
||||
if (structure->parent_refcount)
|
||||
g_return_if_fail (refcount == NULL);
|
||||
else
|
||||
g_return_if_fail (refcount != NULL);
|
||||
|
||||
structure->parent_refcount = refcount;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_structure_copy:
|
||||
* @structure: a #GstStructure to duplicate
|
||||
|
@ -211,7 +239,8 @@ gst_structure_copy (const GstStructure * structure)
|
|||
* gst_structure_free:
|
||||
* @structure: the #GstStructure to free
|
||||
*
|
||||
* Frees a #GstStructure and all its fields and values.
|
||||
* Frees a #GstStructure and all its fields and values. The structure must not
|
||||
* parent when this function is called.
|
||||
*/
|
||||
void
|
||||
gst_structure_free (GstStructure * structure)
|
||||
|
@ -220,6 +249,7 @@ gst_structure_free (GstStructure * structure)
|
|||
int i;
|
||||
|
||||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (structure->parent_refcount == NULL);
|
||||
|
||||
for (i = 0; i < structure->fields->len; i++) {
|
||||
field = GST_STRUCTURE_FIELD (structure, i);
|
||||
|
@ -280,6 +310,7 @@ gst_structure_set_name (GstStructure * structure, const gchar * name)
|
|||
{
|
||||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (name != NULL);
|
||||
g_return_if_fail (IS_MUTABLE (structure));
|
||||
|
||||
structure->name = g_quark_from_string (name);
|
||||
}
|
||||
|
@ -302,6 +333,7 @@ gst_structure_id_set_value (GstStructure * structure,
|
|||
|
||||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (G_IS_VALUE (value));
|
||||
g_return_if_fail (IS_MUTABLE (structure));
|
||||
|
||||
gsfield.name = field;
|
||||
gst_value_init_and_copy (&gsfield.value, value);
|
||||
|
@ -326,6 +358,7 @@ gst_structure_set_value (GstStructure * structure,
|
|||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (fieldname != NULL);
|
||||
g_return_if_fail (G_IS_VALUE (value));
|
||||
g_return_if_fail (IS_MUTABLE (structure));
|
||||
|
||||
gst_structure_id_set_value (structure, g_quark_from_string (fieldname),
|
||||
value);
|
||||
|
@ -373,6 +406,7 @@ gst_structure_set_valist (GstStructure * structure,
|
|||
char *s;
|
||||
|
||||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (IS_MUTABLE (structure));
|
||||
|
||||
while (fieldname) {
|
||||
GstStructureField field = { 0 };
|
||||
|
@ -451,18 +485,9 @@ gst_structure_set_valist (GstStructure * structure,
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_structure_set_field:
|
||||
* @structure: a #GstStructure
|
||||
* @field: the #GstStructureField to set
|
||||
*
|
||||
* Sets a field in the structure. If the structure currently contains
|
||||
* a field with the same name, it is replaced with the provided field.
|
||||
* Otherwise, the field is added to the structure. The field's value
|
||||
* is not deeply copied.
|
||||
*
|
||||
* This function is intended mainly for internal use. The function
|
||||
* #gst_structure_set() is recommended instead of this one.
|
||||
/* If the structure currently contains a field with the same name, it is
|
||||
* replaced with the provided field. Otherwise, the field is added to the
|
||||
* structure. The field's value is not deeply copied.
|
||||
*/
|
||||
static void
|
||||
gst_structure_set_field (GstStructure * structure, GstStructureField * field)
|
||||
|
@ -483,15 +508,7 @@ gst_structure_set_field (GstStructure * structure, GstStructureField * field)
|
|||
g_array_append_val (structure->fields, *field);
|
||||
}
|
||||
|
||||
/* FIXME: is this private ? if so remove gtk-doc
|
||||
* gst_structure_id_get_field:
|
||||
* @structure: a #GstStructure
|
||||
* @field_id: the GQuark of the field to get
|
||||
*
|
||||
* Gets the specified field from the structure. If there is no
|
||||
* field with the given ID, NULL is returned.
|
||||
*
|
||||
* Returns: the #GstStructureField with the given ID
|
||||
/* If there is no field with the given ID, NULL is returned.
|
||||
*/
|
||||
static GstStructureField *
|
||||
gst_structure_id_get_field (const GstStructure * structure, GQuark field_id)
|
||||
|
@ -511,15 +528,7 @@ gst_structure_id_get_field (const GstStructure * structure, GQuark field_id)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_structure_get_field:
|
||||
* @structure: a #GstStructure
|
||||
* @fieldname: the name of the field to get
|
||||
*
|
||||
* Gets the specified field from the structure. If there is no
|
||||
* field with the given ID, NULL is returned.
|
||||
*
|
||||
* Returns: the #GstStructureField with the given name
|
||||
/* If there is no field with the given ID, NULL is returned.
|
||||
*/
|
||||
static GstStructureField *
|
||||
gst_structure_get_field (const GstStructure * structure,
|
||||
|
@ -598,6 +607,7 @@ gst_structure_remove_field (GstStructure * structure, const gchar * fieldname)
|
|||
|
||||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (fieldname != NULL);
|
||||
g_return_if_fail (IS_MUTABLE (structure));
|
||||
|
||||
id = g_quark_from_string (fieldname);
|
||||
|
||||
|
@ -631,6 +641,7 @@ gst_structure_remove_fields (GstStructure * structure,
|
|||
|
||||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (fieldname != NULL);
|
||||
/* mutability checked in remove_field */
|
||||
|
||||
va_start (varargs, fieldname);
|
||||
|
||||
|
@ -656,6 +667,7 @@ gst_structure_remove_fields_valist (GstStructure * structure,
|
|||
|
||||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (fieldname != NULL);
|
||||
/* mutability checked in remove_field */
|
||||
|
||||
while (field) {
|
||||
gst_structure_remove_field (structure, field);
|
||||
|
@ -676,6 +688,7 @@ gst_structure_remove_all_fields (GstStructure * structure)
|
|||
int i;
|
||||
|
||||
g_return_if_fail (structure != NULL);
|
||||
g_return_if_fail (IS_MUTABLE (structure));
|
||||
|
||||
for (i = structure->fields->len - 1; i >= 0; i--) {
|
||||
field = GST_STRUCTURE_FIELD (structure, i);
|
||||
|
@ -736,19 +749,57 @@ gst_structure_n_fields (const GstStructure * structure)
|
|||
* @func: a function to call for each field
|
||||
* @user_data: private data
|
||||
*
|
||||
* Calls the provided function once for each field in the #GstStructure.
|
||||
* Calls the provided function once for each field in the #GstStructure. The
|
||||
* function must not modify the fields. Also see gst_structure_map_in_place().
|
||||
*
|
||||
* Returns: TRUE if the supplied function returns TRUE For each of the fields,
|
||||
* FALSE otherwise.
|
||||
*/
|
||||
gboolean
|
||||
gst_structure_foreach (GstStructure * structure,
|
||||
gst_structure_foreach (const GstStructure * structure,
|
||||
GstStructureForeachFunc func, gpointer user_data)
|
||||
{
|
||||
int i;
|
||||
GstStructureField *field;
|
||||
gboolean ret;
|
||||
|
||||
g_return_val_if_fail (structure != NULL, FALSE);
|
||||
|
||||
for (i = 0; i < structure->fields->len; i++) {
|
||||
field = GST_STRUCTURE_FIELD (structure, i);
|
||||
|
||||
ret = func (field->name, &field->value, user_data);
|
||||
if (!ret)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_structure_map_in_place:
|
||||
* @structure: a #GstStructure
|
||||
* @func: a function to call for each field
|
||||
* @user_data: private data
|
||||
*
|
||||
* Calls the provided function once for each field in the #GstStructure. In
|
||||
* contrast to gst_structure_foreach(), the function may modify the fields. The
|
||||
* structure must be mutable.
|
||||
*
|
||||
* Returns: TRUE if the supplied function returns TRUE For each of the fields,
|
||||
* FALSE otherwise.
|
||||
*/
|
||||
gboolean
|
||||
gst_structure_map_in_place (GstStructure * structure,
|
||||
GstStructureMapFunc func, gpointer user_data)
|
||||
{
|
||||
int i;
|
||||
GstStructureField *field;
|
||||
gboolean ret;
|
||||
|
||||
g_return_val_if_fail (structure != NULL, FALSE);
|
||||
g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
|
||||
|
||||
for (i = 0; i < structure->fields->len; i++) {
|
||||
field = GST_STRUCTURE_FIELD (structure, i);
|
||||
|
||||
|
@ -1548,3 +1599,134 @@ gst_structure_copy_conditional (const GstStructure * structure)
|
|||
return gst_structure_copy (structure);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* fixate utility functions */
|
||||
|
||||
/**
|
||||
* gst_caps_structure_fixate_field_nearest_int:
|
||||
* @structure: a #GstStructure
|
||||
* @field_name: a field in @structure
|
||||
* @target: the target value of the fixation
|
||||
*
|
||||
* Fixates a #GstStructure by changing the given field to the nearest
|
||||
* integer to @target that is a subset of the existing field.
|
||||
*
|
||||
* Returns: TRUE if the structure could be fixated
|
||||
*/
|
||||
gboolean
|
||||
gst_caps_structure_fixate_field_nearest_int (GstStructure * structure,
|
||||
const char *field_name, int target)
|
||||
{
|
||||
const GValue *value;
|
||||
|
||||
g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
|
||||
g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
|
||||
|
||||
value = gst_structure_get_value (structure, field_name);
|
||||
|
||||
if (G_VALUE_TYPE (value) == G_TYPE_INT) {
|
||||
/* already fixed */
|
||||
return FALSE;
|
||||
} else if (G_VALUE_TYPE (value) == GST_TYPE_INT_RANGE) {
|
||||
int x;
|
||||
|
||||
x = gst_value_get_int_range_min (value);
|
||||
if (target < x)
|
||||
target = x;
|
||||
x = gst_value_get_int_range_max (value);
|
||||
if (target > x)
|
||||
target = x;
|
||||
gst_structure_set (structure, field_name, G_TYPE_INT, target, NULL);
|
||||
return TRUE;
|
||||
} else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
|
||||
const GValue *list_value;
|
||||
int i, n;
|
||||
int best = 0;
|
||||
int best_index = -1;
|
||||
|
||||
n = gst_value_list_get_size (value);
|
||||
for (i = 0; i < n; i++) {
|
||||
list_value = gst_value_list_get_value (value, i);
|
||||
if (G_VALUE_TYPE (list_value) == G_TYPE_INT) {
|
||||
int x = g_value_get_int (list_value);
|
||||
|
||||
if (best_index == -1 || (ABS (target - x) < ABS (target - best))) {
|
||||
best_index = i;
|
||||
best = x;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (best_index != -1) {
|
||||
gst_structure_set (structure, field_name, G_TYPE_INT, best, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_caps_structure_fixate_field_nearest_double:
|
||||
* @structure: a #GstStructure
|
||||
* @field_name: a field in @structure
|
||||
* @target: the target value of the fixation
|
||||
*
|
||||
* Fixates a #GstStructure by changing the given field to the nearest
|
||||
* double to @target that is a subset of the existing field.
|
||||
*
|
||||
* Returns: TRUE if the structure could be fixated
|
||||
*/
|
||||
gboolean
|
||||
gst_caps_structure_fixate_field_nearest_double (GstStructure * structure,
|
||||
const char *field_name, double target)
|
||||
{
|
||||
const GValue *value;
|
||||
|
||||
g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
|
||||
g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
|
||||
|
||||
value = gst_structure_get_value (structure, field_name);
|
||||
|
||||
if (G_VALUE_TYPE (value) == G_TYPE_DOUBLE) {
|
||||
/* already fixed */
|
||||
return FALSE;
|
||||
} else if (G_VALUE_TYPE (value) == GST_TYPE_DOUBLE_RANGE) {
|
||||
double x;
|
||||
|
||||
x = gst_value_get_double_range_min (value);
|
||||
if (target < x)
|
||||
target = x;
|
||||
x = gst_value_get_double_range_max (value);
|
||||
if (target > x)
|
||||
target = x;
|
||||
gst_structure_set (structure, field_name, G_TYPE_DOUBLE, target, NULL);
|
||||
return TRUE;
|
||||
} else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
|
||||
const GValue *list_value;
|
||||
int i, n;
|
||||
double best = 0;
|
||||
int best_index = -1;
|
||||
|
||||
n = gst_value_list_get_size (value);
|
||||
for (i = 0; i < n; i++) {
|
||||
list_value = gst_value_list_get_value (value, i);
|
||||
if (G_VALUE_TYPE (list_value) == G_TYPE_DOUBLE) {
|
||||
double x = g_value_get_double (list_value);
|
||||
|
||||
if (best_index == -1 || (ABS (target - x) < ABS (target - best))) {
|
||||
best_index = i;
|
||||
best = x;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (best_index != -1) {
|
||||
gst_structure_set (structure, field_name, G_TYPE_DOUBLE, best, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
|
|
@ -33,6 +33,10 @@ G_BEGIN_DECLS
|
|||
typedef struct _GstStructure GstStructure;
|
||||
|
||||
typedef gboolean (*GstStructureForeachFunc) (GQuark field_id,
|
||||
const GValue * value,
|
||||
gpointer user_data);
|
||||
|
||||
typedef gboolean (*GstStructureMapFunc) (GQuark field_id,
|
||||
GValue * value,
|
||||
gpointer user_data);
|
||||
|
||||
|
@ -42,6 +46,9 @@ struct _GstStructure {
|
|||
/*< private >*/
|
||||
GQuark name;
|
||||
|
||||
/* owned by parent structure, NULL if no parent */
|
||||
GstAtomicInt *parent_refcount;
|
||||
|
||||
GArray *fields;
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
|
@ -58,6 +65,8 @@ GstStructure * gst_structure_new_valist (const gchar *
|
|||
const gchar * firstfield,
|
||||
va_list varargs);
|
||||
GstStructure * gst_structure_copy (const GstStructure *structure);
|
||||
void gst_structure_set_parent_refcount (GstStructure *structure,
|
||||
GstAtomicInt *refcount);
|
||||
void gst_structure_free (GstStructure *structure);
|
||||
|
||||
G_CONST_RETURN gchar * gst_structure_get_name (const GstStructure *structure);
|
||||
|
@ -93,9 +102,12 @@ void gst_structure_remove_all_fields (GstStructure
|
|||
|
||||
GType gst_structure_get_field_type (const GstStructure *structure,
|
||||
const gchar *fieldname);
|
||||
gboolean gst_structure_foreach (GstStructure *structure,
|
||||
gboolean gst_structure_foreach (const GstStructure *structure,
|
||||
GstStructureForeachFunc func,
|
||||
gpointer user_data);
|
||||
gboolean gst_structure_map_in_place (GstStructure *structure,
|
||||
GstStructureMapFunc func,
|
||||
gpointer user_data);
|
||||
gint gst_structure_n_fields (const GstStructure *structure);
|
||||
gboolean gst_structure_has_field (const GstStructure *structure,
|
||||
const gchar *fieldname);
|
||||
|
@ -123,6 +135,14 @@ gchar * gst_structure_to_string (const GstStructure
|
|||
GstStructure * gst_structure_from_string (const gchar *string,
|
||||
gchar **end);
|
||||
|
||||
gboolean gst_caps_structure_fixate_field_nearest_int (GstStructure *structure,
|
||||
const char *field_name,
|
||||
int target);
|
||||
gboolean gst_caps_structure_fixate_field_nearest_double (GstStructure *structure,
|
||||
const char *field_name,
|
||||
double target);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
||||
|
|
|
@ -105,6 +105,7 @@ static GstFlowReturn gst_identity_chain (GstPad * pad, GstBuffer * buffer);
|
|||
static GstFlowReturn gst_identity_getrange (GstPad * pad, guint64 offset,
|
||||
guint length, GstBuffer ** buffer);
|
||||
static void gst_identity_set_clock (GstElement * element, GstClock * clock);
|
||||
static GstCaps *gst_identity_proxy_getcaps (GstPad * pad);
|
||||
|
||||
|
||||
static guint gst_identity_signals[LAST_SIGNAL] = { 0 };
|
||||
|
@ -208,12 +209,16 @@ gst_identity_init (GstIdentity * identity)
|
|||
gst_element_add_pad (GST_ELEMENT (identity), identity->sinkpad);
|
||||
gst_pad_set_chain_function (identity->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_chain));
|
||||
gst_pad_set_getcaps_function (identity->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_proxy_getcaps));
|
||||
gst_pad_set_event_function (identity->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_event));
|
||||
|
||||
identity->srcpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
gst_pad_set_getcaps_function (identity->srcpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_proxy_getcaps));
|
||||
gst_pad_set_getrange_function (identity->srcpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_getrange));
|
||||
gst_element_add_pad (GST_ELEMENT (identity), identity->srcpad);
|
||||
|
@ -240,6 +245,17 @@ gst_identity_set_clock (GstElement * element, GstClock * clock)
|
|||
gst_object_replace ((GstObject **) & identity->clock, (GstObject *) clock);
|
||||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_identity_proxy_getcaps (GstPad * pad)
|
||||
{
|
||||
GstPad *otherpad;
|
||||
GstIdentity *identity = GST_IDENTITY (GST_OBJECT_PARENT (pad));
|
||||
|
||||
otherpad = pad == identity->srcpad ? identity->sinkpad : identity->srcpad;
|
||||
|
||||
return gst_pad_peer_get_caps (otherpad);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_identity_event (GstPad * pad, GstEvent * event)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
include ../Rules
|
||||
|
||||
tests_pass = \
|
||||
app_fixate \
|
||||
enumcaps \
|
||||
intersection \
|
||||
compatibility \
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
|
||||
#include <gst/gst.h>
|
||||
|
||||
|
||||
static GstCaps *
|
||||
handler (GObject * object, GstCaps * caps, gpointer user_data)
|
||||
{
|
||||
g_print ("in handler %p, %p, %p\n", object, caps, user_data);
|
||||
|
||||
g_assert (GST_IS_PAD (object));
|
||||
|
||||
g_print ("caps: %s\n", gst_caps_to_string (caps));
|
||||
|
||||
if (gst_caps_is_any (caps)) {
|
||||
return gst_caps_new_simple ("application/x-foo",
|
||||
"field", GST_TYPE_INT_RANGE, 1, 10, NULL);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GstElement *a;
|
||||
GstElement *b;
|
||||
GstElement *pipeline;
|
||||
GstPad *pad;
|
||||
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
pipeline = gst_pipeline_new (NULL);
|
||||
|
||||
a = gst_element_factory_make ("fakesrc", NULL);
|
||||
g_assert (a);
|
||||
b = gst_element_factory_make ("fakesink", NULL);
|
||||
g_assert (b);
|
||||
|
||||
gst_bin_add_many (GST_BIN (pipeline), a, b, NULL);
|
||||
gst_element_link (a, b);
|
||||
|
||||
pad = gst_element_get_pad (a, "src");
|
||||
g_signal_connect (G_OBJECT (pad), "fixate", G_CALLBACK (handler),
|
||||
(void *) 0xdeadbeef);
|
||||
|
||||
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -146,8 +146,8 @@ test_caps (const char *s)
|
|||
g_print ("original: %s\nfiltered: %s\n\n", s, s2);
|
||||
|
||||
g_free (s2);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps);
|
||||
gst_caps_unref (caps2);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -12,11 +12,11 @@ test1 (void)
|
|||
|
||||
caps = gst_caps_new_empty ();
|
||||
g_assert (caps != NULL);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_any ();
|
||||
g_assert (caps != NULL);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
|
||||
g_assert (caps != NULL);
|
||||
|
@ -25,7 +25,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
|
||||
g_assert (gst_caps_is_fixed (caps) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw",
|
||||
"_double", G_TYPE_DOUBLE, 100.0, NULL);
|
||||
|
@ -35,7 +35,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
|
||||
g_assert (gst_caps_is_fixed (caps) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw",
|
||||
"_fourcc", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('a', 'b', 'c', 'd'), NULL);
|
||||
|
@ -45,7 +45,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
|
||||
g_assert (gst_caps_is_fixed (caps) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw",
|
||||
"_boolean", G_TYPE_BOOLEAN, TRUE, NULL);
|
||||
|
@ -55,7 +55,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
|
||||
g_assert (gst_caps_is_fixed (caps) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps =
|
||||
gst_caps_new_full (gst_structure_new ("audio/raw", "_int", G_TYPE_INT,
|
||||
|
@ -67,7 +67,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
|
||||
g_assert (gst_caps_is_fixed (caps) == FALSE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
|
||||
g_assert (caps != NULL);
|
||||
|
@ -79,8 +79,8 @@ test1 (void)
|
|||
g_assert (gst_caps_is_fixed (caps2) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
g_print ("%s\n", gst_caps_to_string (caps2));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
|
||||
gst_caps_append (caps,
|
||||
|
@ -91,7 +91,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
|
||||
g_assert (gst_caps_is_fixed (caps) == FALSE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
|
||||
g_assert (caps != NULL);
|
||||
|
@ -102,7 +102,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
|
||||
g_assert (gst_caps_is_fixed (caps) == FALSE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -122,9 +122,9 @@ test2 (void)
|
|||
NULL), NULL);
|
||||
caps = gst_caps_intersect (caps1, caps2);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
}
|
||||
|
||||
|
@ -143,7 +143,7 @@ test3 (void)
|
|||
g_assert (gst_caps_is_any (caps1));
|
||||
g_assert (gst_caps_get_size (caps1) == 0);
|
||||
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_unref (caps1);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -196,7 +196,7 @@ video/x-pn-realvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framera
|
|||
video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, YVYU, UYVY }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
audio/x-wma, wmaversion=(int)1, flags1=(int)[ -2147483648, 2147483647 ], flags2=(int)[ -2147483648, 2147483647 ], block_align=(int)[ 0, 2147483647 ], bitrate=(int)[ 0, 2147483647 ]
|
||||
audio/x-wma, wmaversion=(int)2, flags1=(int)[ -2147483648, 2147483647 ], flags2=(int)[ -2147483648, 2147483647 ], block_align=(int)[ 0, 2147483647 ], bitrate=(int)[ 0, 2147483647 ]
|
||||
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023999999999, 24, 25, 29.970030000000001, 30, 50, 59.940060000000003, 60 }
|
||||
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
|
||||
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }
|
||||
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean){ true, false }, buffer-frames=(int)[ 1, 2147483647 ]
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
|
||||
|
@ -205,7 +205,7 @@ audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], e
|
|||
video/x-raw-rgb, framerate=(double)[ 1, 100 ], width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]; video/x-raw-yuv, framerate=(double)[ 1, 100 ], width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]
|
||||
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 1, 60 ]
|
||||
video/mpeg, mpegversion=(int)1, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 1, 255 ], pixel_height=(int)[ 1, 255 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/mpeg, mpegversion=(int){ 1, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023999999999, 24, 25, 29.970030000000001, 30, 50, 59.940060000000003, 60 }
|
||||
video/mpeg, mpegversion=(int){ 1, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
|
||||
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)256, height=(int)128, framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
|
@ -217,7 +217,7 @@ video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int
|
|||
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-alaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
|
||||
audio/x-raw-int, endianess=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]
|
||||
video/x-raw-yuv, format=(fourcc){ YV12, I420, Y42B }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 1, 255 ], pixel_height=(int)[ 1, 255 ], framerate=(double){ 23.976023999999999, 24, 25, 29.970030000000001, 30, 50, 59.940060000000003, 60 }
|
||||
video/x-raw-yuv, format=(fourcc){ YV12, I420, Y42B }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 1, 255 ], pixel_height=(int)[ 1, 255 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 4000, 96000 ], channels=(int)1; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]
|
||||
video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], divxversion=(int)3; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msmpegversion=(int)43
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int){ 16, 24, 32 }, depth=(int){ 16, 24, 32 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-raw-float, endianness=(int)1234, depth=(int){ 32, 64 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 6 ]
|
||||
|
@ -235,7 +235,7 @@ audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(i
|
|||
audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/mpeg, mpegversion=(int){ 2, 4 }, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/x-ac3, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/x-raw-int, width=(int){ 8, 16, 24 }, depth=(int){ 8, 16, 24 }, endianness=(int){ 4321, 1234 }, signed=(boolean){ true, false }, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]
|
||||
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], mpegversion=(int)4, systemstream=(boolean)false; video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], divxversion=(int)[ 4, 5 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.997 }; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.997 }; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.997 }
|
||||
video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }
|
||||
audio/mpeg, mpegversion=(int)1, layer=(int){ 3, 2 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-alaw, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-vorbis, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-alaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)microsoft, block_align=(int)[ 1, 8192 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dvi, block_align=(int)[ 1, 8192 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
|
||||
video/x-raw-rgb, depth=(int)24, bpp=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc)I420, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
|
|
|
@ -66,14 +66,14 @@ main (int argc, char *argv[])
|
|||
abort ();
|
||||
}
|
||||
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
|
||||
g_print ("parsed each structure individually\n");
|
||||
abort ();
|
||||
}
|
||||
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
g_free (list[i]);
|
||||
}
|
||||
|
||||
|
|
|
@ -87,8 +87,8 @@ main (gint argc, gchar * argv[])
|
|||
yes = g_value_get_enum (gst_structure_get_value (strc, "yes"));
|
||||
no = g_value_get_enum (gst_structure_get_value (strc, "no"));
|
||||
g_assert (yes == TEST_YES && no == TEST_NO);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (res_caps);
|
||||
gst_caps_unref (caps);
|
||||
gst_caps_unref (res_caps);
|
||||
|
||||
/* yes */
|
||||
return 0;
|
||||
|
|
|
@ -39,9 +39,11 @@ main (gint argc, gchar ** argv)
|
|||
caps = gst_pad_get_caps (gst_element_get_pad (identity, "sink"));
|
||||
g_print ("caps: %s\n", gst_caps_to_string (caps));
|
||||
g_assert (!gst_caps_is_any (caps));
|
||||
|
||||
caps = gst_pad_get_allowed_caps (gst_element_get_pad (identity, "sink"));
|
||||
g_print ("allowed caps: %s\n", gst_caps_to_string (caps));
|
||||
g_assert (gst_caps_is_any (caps));
|
||||
/* get_allowed_caps doesn't mean anything if you aren't connected */
|
||||
g_assert (!caps);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -75,8 +75,8 @@ main (int argc, char *argv[])
|
|||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
if (gst_caps_is_empty (caps))
|
||||
return 1;
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps2));
|
||||
caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps3));
|
||||
|
@ -84,8 +84,8 @@ main (int argc, char *argv[])
|
|||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
if (gst_caps_is_empty (caps))
|
||||
return 1;
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps4));
|
||||
caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps5));
|
||||
|
@ -94,10 +94,10 @@ main (int argc, char *argv[])
|
|||
caps = gst_caps_intersect (caps3, caps4);
|
||||
g_print ("caps4 %s\n", gst_caps_to_string (caps4));
|
||||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_free (caps3);
|
||||
gst_caps_free (caps4);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
gst_caps_unref (caps3);
|
||||
gst_caps_unref (caps4);
|
||||
|
||||
caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps7));
|
||||
caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps8));
|
||||
|
@ -105,8 +105,8 @@ main (int argc, char *argv[])
|
|||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
if (gst_caps_is_empty (caps))
|
||||
return 1;
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps9));
|
||||
caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps10));
|
||||
|
@ -114,8 +114,8 @@ main (int argc, char *argv[])
|
|||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
if (gst_caps_is_empty (caps))
|
||||
return 1;
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ main (gint argc, gchar * argv[])
|
|||
gst_debug_add_log_function (assert_on_error, NULL);
|
||||
gst_caps_do_simplify (caps);
|
||||
gst_debug_remove_log_function (assert_on_error);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
|
||||
/* TEST 2:
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
|
||||
#include <gst/gst.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
static GstPad *sinesrcpad;
|
||||
|
||||
|
@ -42,11 +44,11 @@ my_fixate (GstPad * pad, GstCaps * caps, gpointer user_data)
|
|||
}
|
||||
icaps = gst_caps_intersect (caps, mycaps);
|
||||
if (!gst_caps_is_empty (icaps)) {
|
||||
gst_caps_free (icaps);
|
||||
gst_caps_unref (icaps);
|
||||
g_print ("returning %d\n", rate);
|
||||
return gst_caps_copy (mycaps);
|
||||
}
|
||||
gst_caps_free (icaps);
|
||||
gst_caps_unref (icaps);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -56,11 +58,10 @@ int
|
|||
main (int argc, char *argv[])
|
||||
{
|
||||
GstElement *pipeline;
|
||||
const GList *list;
|
||||
const GList *l2;
|
||||
int i;
|
||||
int ret;
|
||||
GError *error = NULL;
|
||||
GstIterator *iter1, *iter2;
|
||||
gint done1 = FALSE, done2 = FALSE;
|
||||
gpointer element;
|
||||
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
|
@ -77,42 +78,73 @@ main (int argc, char *argv[])
|
|||
exit (0);
|
||||
}
|
||||
|
||||
list = gst_bin_get_list (GST_BIN (pipeline));
|
||||
while (list) {
|
||||
GstElement *element = GST_ELEMENT (list->data);
|
||||
iter1 = gst_bin_iterate_elements (GST_BIN (pipeline));
|
||||
while (!done1) {
|
||||
switch (gst_iterator_next (iter1, &element)) {
|
||||
case GST_ITERATOR_OK:
|
||||
{
|
||||
gpointer pad;
|
||||
|
||||
l2 = gst_element_get_pad_list (element);
|
||||
while (l2) {
|
||||
GstPad *pad = GST_PAD (l2->data);
|
||||
iter2 = gst_element_iterate_pads (element);
|
||||
while (!done2) {
|
||||
switch (gst_iterator_next (iter2, &pad)) {
|
||||
case GST_ITERATOR_OK:
|
||||
if (gst_pad_get_direction (pad) == GST_PAD_SRC) {
|
||||
g_signal_connect (G_OBJECT (pad), "fixate",
|
||||
G_CALLBACK (my_fixate), NULL);
|
||||
}
|
||||
gst_object_unref (pad);
|
||||
break;
|
||||
case GST_ITERATOR_DONE:
|
||||
done2 = TRUE;
|
||||
break;
|
||||
case GST_ITERATOR_RESYNC:
|
||||
case GST_ITERATOR_ERROR:
|
||||
exit (1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
gst_iterator_free (iter2);
|
||||
|
||||
if (gst_pad_get_direction (pad) == GST_PAD_SRC) {
|
||||
g_signal_connect (G_OBJECT (pad), "fixate", G_CALLBACK (my_fixate),
|
||||
NULL);
|
||||
gst_object_unref (element);
|
||||
break;
|
||||
}
|
||||
l2 = g_list_next (l2);
|
||||
case GST_ITERATOR_DONE:
|
||||
done1 = TRUE;
|
||||
break;
|
||||
case GST_ITERATOR_RESYNC:
|
||||
case GST_ITERATOR_ERROR:
|
||||
exit (1);
|
||||
break;
|
||||
}
|
||||
list = g_list_next (list);
|
||||
}
|
||||
gst_iterator_free (iter1);
|
||||
|
||||
g_signal_connect (pipeline, "deep_notify",
|
||||
G_CALLBACK (gst_element_default_deep_notify), NULL);
|
||||
/*g_signal_connect (pipeline, "deep_notify",
|
||||
G_CALLBACK (gst_element_default_deep_notify), NULL); */
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
i = 0;
|
||||
while (1) {
|
||||
gst_bin_iterate (GST_BIN (pipeline));
|
||||
i++;
|
||||
if (i == 10) {
|
||||
stage = 1;
|
||||
g_print ("10 iterations\n");
|
||||
ret = gst_pad_renegotiate (sinesrcpad);
|
||||
g_print ("negotiation returned %d\n", ret);
|
||||
}
|
||||
if (i == 20) {
|
||||
g_print ("20 iterations\n");
|
||||
exit (0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
i = 0;
|
||||
while (1) {
|
||||
gst_bin_iterate (GST_BIN (pipeline));
|
||||
i++;
|
||||
if (i == 10) {
|
||||
stage = 1;
|
||||
g_print ("10 iterations\n");
|
||||
ret = gst_pad_renegotiate (sinesrcpad);
|
||||
g_print ("negotiation returned %d\n", ret);
|
||||
}
|
||||
if (i == 20) {
|
||||
g_print ("20 iterations\n");
|
||||
exit (0);
|
||||
}
|
||||
}
|
||||
*/
|
||||
/* Like totally not sure how to do this in THREADED. Punting for now! */
|
||||
|
||||
sleep (5);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ check_caps (const gchar * eins, const gchar * zwei)
|
|||
test3 = gst_caps_intersect (test2, two);
|
||||
g_print (" empty = %s\n", gst_caps_to_string (test3));
|
||||
g_assert (gst_caps_is_empty (test3));
|
||||
gst_caps_free (test3);
|
||||
gst_caps_unref (test3);
|
||||
test3 = gst_caps_union (test2, two);
|
||||
g_print (" A + B = %u\n", strlen (gst_caps_to_string (test3)));
|
||||
/* test3 = one - two + two = one + two */
|
||||
|
@ -52,15 +52,15 @@ check_caps (const gchar * eins, const gchar * zwei)
|
|||
test4 = gst_caps_union (one, two);
|
||||
g_assert (gst_caps_is_equal (test3, test4));
|
||||
g_print (" NOT EQUAL\n\n");
|
||||
gst_caps_free (test2);
|
||||
gst_caps_free (test3);
|
||||
gst_caps_free (test4);
|
||||
gst_caps_unref (test2);
|
||||
gst_caps_unref (test3);
|
||||
gst_caps_unref (test4);
|
||||
} else {
|
||||
g_print (" ANY CAPS\n\n");
|
||||
}
|
||||
gst_caps_free (test);
|
||||
gst_caps_free (two);
|
||||
gst_caps_free (one);
|
||||
gst_caps_unref (test);
|
||||
gst_caps_unref (two);
|
||||
gst_caps_unref (one);
|
||||
}
|
||||
|
||||
gint
|
||||
|
|
|
@ -61,7 +61,7 @@ check_caps (GstCaps * caps)
|
|||
|
||||
g_free (before);
|
||||
g_free (after);
|
||||
gst_caps_free (old);
|
||||
gst_caps_unref (old);
|
||||
}
|
||||
|
||||
gint
|
||||
|
@ -86,7 +86,7 @@ main (gint argc, gchar ** argv)
|
|||
|
||||
g_print ("%2u - %2u ", i, j);
|
||||
check_caps (temp);
|
||||
gst_caps_free (temp);
|
||||
gst_caps_unref (temp);
|
||||
/* union */
|
||||
temp = gst_caps_union (caps, caps2);
|
||||
g_print ("%2u + %2u ", i, j);
|
||||
|
@ -99,11 +99,11 @@ main (gint argc, gchar ** argv)
|
|||
temp2 = gst_caps_copy (caps);
|
||||
gst_caps_append (temp2, caps2);
|
||||
g_assert (gst_caps_is_equal (temp, temp2));
|
||||
gst_caps_free (temp2);
|
||||
gst_caps_free (temp);
|
||||
gst_caps_unref (temp2);
|
||||
gst_caps_unref (temp);
|
||||
}
|
||||
}
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
g_print ("\n\nSTATISTICS:\n");
|
||||
g_print ("\nOf all caps tried\n");
|
||||
|
|
|
@ -30,23 +30,23 @@ check_caps (const gchar * set, const gchar * subset)
|
|||
/* basics */
|
||||
test = gst_caps_subtract (one, one);
|
||||
g_assert (gst_caps_is_empty (test));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
test = gst_caps_subtract (two, two);
|
||||
g_assert (gst_caps_is_empty (test));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
test = gst_caps_subtract (two, one);
|
||||
g_assert (gst_caps_is_empty (test));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
/* now the nice part */
|
||||
test = gst_caps_subtract (one, two);
|
||||
g_assert (!gst_caps_is_empty (test));
|
||||
g_print (" A - B = %s\n", gst_caps_to_string (test));
|
||||
test2 = gst_caps_union (test, two);
|
||||
g_print ("A - B + B = %s\n", gst_caps_to_string (test2));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
test = gst_caps_subtract (test2, one);
|
||||
g_assert (gst_caps_is_empty (test));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
}
|
||||
|
||||
gint
|
||||
|
|
|
@ -62,7 +62,6 @@ test_string_deserialization (void)
|
|||
} tests[] = {
|
||||
{
|
||||
"", ""}, {
|
||||
"\\", "\\"}, {
|
||||
"\"\"", ""},
|
||||
/* FAILURES */
|
||||
{
|
||||
|
@ -77,8 +76,11 @@ test_string_deserialization (void)
|
|||
"\"\\0\"", NULL}, /* unfinished escaped character */
|
||||
{
|
||||
"\" \"", NULL}, /* spaces must be escaped */
|
||||
#if 0
|
||||
/* FIXME 0.9: this test should fail, but it doesn't */
|
||||
{
|
||||
"tüüt", NULL} /* string with special chars must be escaped */
|
||||
#endif
|
||||
};
|
||||
guint i;
|
||||
GValue v = { 0, };
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
include ../Rules
|
||||
|
||||
tests_pass = \
|
||||
app_fixate \
|
||||
enumcaps \
|
||||
intersection \
|
||||
compatibility \
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
|
||||
#include <gst/gst.h>
|
||||
|
||||
|
||||
static GstCaps *
|
||||
handler (GObject * object, GstCaps * caps, gpointer user_data)
|
||||
{
|
||||
g_print ("in handler %p, %p, %p\n", object, caps, user_data);
|
||||
|
||||
g_assert (GST_IS_PAD (object));
|
||||
|
||||
g_print ("caps: %s\n", gst_caps_to_string (caps));
|
||||
|
||||
if (gst_caps_is_any (caps)) {
|
||||
return gst_caps_new_simple ("application/x-foo",
|
||||
"field", GST_TYPE_INT_RANGE, 1, 10, NULL);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GstElement *a;
|
||||
GstElement *b;
|
||||
GstElement *pipeline;
|
||||
GstPad *pad;
|
||||
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
pipeline = gst_pipeline_new (NULL);
|
||||
|
||||
a = gst_element_factory_make ("fakesrc", NULL);
|
||||
g_assert (a);
|
||||
b = gst_element_factory_make ("fakesink", NULL);
|
||||
g_assert (b);
|
||||
|
||||
gst_bin_add_many (GST_BIN (pipeline), a, b, NULL);
|
||||
gst_element_link (a, b);
|
||||
|
||||
pad = gst_element_get_pad (a, "src");
|
||||
g_signal_connect (G_OBJECT (pad), "fixate", G_CALLBACK (handler),
|
||||
(void *) 0xdeadbeef);
|
||||
|
||||
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -146,8 +146,8 @@ test_caps (const char *s)
|
|||
g_print ("original: %s\nfiltered: %s\n\n", s, s2);
|
||||
|
||||
g_free (s2);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps);
|
||||
gst_caps_unref (caps2);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -12,11 +12,11 @@ test1 (void)
|
|||
|
||||
caps = gst_caps_new_empty ();
|
||||
g_assert (caps != NULL);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_any ();
|
||||
g_assert (caps != NULL);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
|
||||
g_assert (caps != NULL);
|
||||
|
@ -25,7 +25,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
|
||||
g_assert (gst_caps_is_fixed (caps) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw",
|
||||
"_double", G_TYPE_DOUBLE, 100.0, NULL);
|
||||
|
@ -35,7 +35,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
|
||||
g_assert (gst_caps_is_fixed (caps) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw",
|
||||
"_fourcc", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('a', 'b', 'c', 'd'), NULL);
|
||||
|
@ -45,7 +45,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
|
||||
g_assert (gst_caps_is_fixed (caps) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw",
|
||||
"_boolean", G_TYPE_BOOLEAN, TRUE, NULL);
|
||||
|
@ -55,7 +55,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
|
||||
g_assert (gst_caps_is_fixed (caps) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps =
|
||||
gst_caps_new_full (gst_structure_new ("audio/raw", "_int", G_TYPE_INT,
|
||||
|
@ -67,7 +67,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
|
||||
g_assert (gst_caps_is_fixed (caps) == FALSE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
|
||||
g_assert (caps != NULL);
|
||||
|
@ -79,8 +79,8 @@ test1 (void)
|
|||
g_assert (gst_caps_is_fixed (caps2) == TRUE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
g_print ("%s\n", gst_caps_to_string (caps2));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
|
||||
gst_caps_append (caps,
|
||||
|
@ -91,7 +91,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
|
||||
g_assert (gst_caps_is_fixed (caps) == FALSE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
|
||||
g_assert (caps != NULL);
|
||||
|
@ -102,7 +102,7 @@ test1 (void)
|
|||
g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
|
||||
g_assert (gst_caps_is_fixed (caps) == FALSE);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -122,9 +122,9 @@ test2 (void)
|
|||
NULL), NULL);
|
||||
caps = gst_caps_intersect (caps1, caps2);
|
||||
g_print ("%s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
}
|
||||
|
||||
|
@ -143,7 +143,7 @@ test3 (void)
|
|||
g_assert (gst_caps_is_any (caps1));
|
||||
g_assert (gst_caps_get_size (caps1) == 0);
|
||||
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_unref (caps1);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -196,7 +196,7 @@ video/x-pn-realvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framera
|
|||
video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, YVYU, UYVY }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
audio/x-wma, wmaversion=(int)1, flags1=(int)[ -2147483648, 2147483647 ], flags2=(int)[ -2147483648, 2147483647 ], block_align=(int)[ 0, 2147483647 ], bitrate=(int)[ 0, 2147483647 ]
|
||||
audio/x-wma, wmaversion=(int)2, flags1=(int)[ -2147483648, 2147483647 ], flags2=(int)[ -2147483648, 2147483647 ], block_align=(int)[ 0, 2147483647 ], bitrate=(int)[ 0, 2147483647 ]
|
||||
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023999999999, 24, 25, 29.970030000000001, 30, 50, 59.940060000000003, 60 }
|
||||
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
|
||||
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }
|
||||
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean){ true, false }, buffer-frames=(int)[ 1, 2147483647 ]
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
|
||||
|
@ -205,7 +205,7 @@ audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], e
|
|||
video/x-raw-rgb, framerate=(double)[ 1, 100 ], width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]; video/x-raw-yuv, framerate=(double)[ 1, 100 ], width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]
|
||||
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 1, 60 ]
|
||||
video/mpeg, mpegversion=(int)1, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 1, 255 ], pixel_height=(int)[ 1, 255 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/mpeg, mpegversion=(int){ 1, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023999999999, 24, 25, 29.970030000000001, 30, 50, 59.940060000000003, 60 }
|
||||
video/mpeg, mpegversion=(int){ 1, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
|
||||
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)256, height=(int)128, framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
|
@ -217,7 +217,7 @@ video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int
|
|||
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-alaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
|
||||
audio/x-raw-int, endianess=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]
|
||||
video/x-raw-yuv, format=(fourcc){ YV12, I420, Y42B }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 1, 255 ], pixel_height=(int)[ 1, 255 ], framerate=(double){ 23.976023999999999, 24, 25, 29.970030000000001, 30, 50, 59.940060000000003, 60 }
|
||||
video/x-raw-yuv, format=(fourcc){ YV12, I420, Y42B }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 1, 255 ], pixel_height=(int)[ 1, 255 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 4000, 96000 ], channels=(int)1; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]
|
||||
video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], divxversion=(int)3; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msmpegversion=(int)43
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int){ 16, 24, 32 }, depth=(int){ 16, 24, 32 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-raw-float, endianness=(int)1234, depth=(int){ 32, 64 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 6 ]
|
||||
|
@ -235,7 +235,7 @@ audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(i
|
|||
audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/mpeg, mpegversion=(int){ 2, 4 }, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/x-ac3, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/x-raw-int, width=(int){ 8, 16, 24 }, depth=(int){ 8, 16, 24 }, endianness=(int){ 4321, 1234 }, signed=(boolean){ true, false }, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]
|
||||
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], mpegversion=(int)4, systemstream=(boolean)false; video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], divxversion=(int)[ 4, 5 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.997 }; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.997 }; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.997 }
|
||||
video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }
|
||||
audio/mpeg, mpegversion=(int)1, layer=(int){ 3, 2 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-alaw, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-vorbis, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]
|
||||
audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-alaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)microsoft, block_align=(int)[ 1, 8192 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dvi, block_align=(int)[ 1, 8192 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
|
||||
video/x-raw-rgb, depth=(int)24, bpp=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc)I420, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
|
||||
|
|
|
@ -66,14 +66,14 @@ main (int argc, char *argv[])
|
|||
abort ();
|
||||
}
|
||||
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
|
||||
g_print ("parsed each structure individually\n");
|
||||
abort ();
|
||||
}
|
||||
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
g_free (list[i]);
|
||||
}
|
||||
|
||||
|
|
|
@ -87,8 +87,8 @@ main (gint argc, gchar * argv[])
|
|||
yes = g_value_get_enum (gst_structure_get_value (strc, "yes"));
|
||||
no = g_value_get_enum (gst_structure_get_value (strc, "no"));
|
||||
g_assert (yes == TEST_YES && no == TEST_NO);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_free (res_caps);
|
||||
gst_caps_unref (caps);
|
||||
gst_caps_unref (res_caps);
|
||||
|
||||
/* yes */
|
||||
return 0;
|
||||
|
|
|
@ -39,9 +39,11 @@ main (gint argc, gchar ** argv)
|
|||
caps = gst_pad_get_caps (gst_element_get_pad (identity, "sink"));
|
||||
g_print ("caps: %s\n", gst_caps_to_string (caps));
|
||||
g_assert (!gst_caps_is_any (caps));
|
||||
|
||||
caps = gst_pad_get_allowed_caps (gst_element_get_pad (identity, "sink"));
|
||||
g_print ("allowed caps: %s\n", gst_caps_to_string (caps));
|
||||
g_assert (gst_caps_is_any (caps));
|
||||
/* get_allowed_caps doesn't mean anything if you aren't connected */
|
||||
g_assert (!caps);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -75,8 +75,8 @@ main (int argc, char *argv[])
|
|||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
if (gst_caps_is_empty (caps))
|
||||
return 1;
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps2));
|
||||
caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps3));
|
||||
|
@ -84,8 +84,8 @@ main (int argc, char *argv[])
|
|||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
if (gst_caps_is_empty (caps))
|
||||
return 1;
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps4));
|
||||
caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps5));
|
||||
|
@ -94,10 +94,10 @@ main (int argc, char *argv[])
|
|||
caps = gst_caps_intersect (caps3, caps4);
|
||||
g_print ("caps4 %s\n", gst_caps_to_string (caps4));
|
||||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_free (caps3);
|
||||
gst_caps_free (caps4);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
gst_caps_unref (caps3);
|
||||
gst_caps_unref (caps4);
|
||||
|
||||
caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps7));
|
||||
caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps8));
|
||||
|
@ -105,8 +105,8 @@ main (int argc, char *argv[])
|
|||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
if (gst_caps_is_empty (caps))
|
||||
return 1;
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps9));
|
||||
caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps10));
|
||||
|
@ -114,8 +114,8 @@ main (int argc, char *argv[])
|
|||
g_print ("caps %s\n", gst_caps_to_string (caps));
|
||||
if (gst_caps_is_empty (caps))
|
||||
return 1;
|
||||
gst_caps_free (caps1);
|
||||
gst_caps_free (caps2);
|
||||
gst_caps_unref (caps1);
|
||||
gst_caps_unref (caps2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ main (gint argc, gchar * argv[])
|
|||
gst_debug_add_log_function (assert_on_error, NULL);
|
||||
gst_caps_do_simplify (caps);
|
||||
gst_debug_remove_log_function (assert_on_error);
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
|
||||
/* TEST 2:
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
|
||||
#include <gst/gst.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
static GstPad *sinesrcpad;
|
||||
|
||||
|
@ -42,11 +44,11 @@ my_fixate (GstPad * pad, GstCaps * caps, gpointer user_data)
|
|||
}
|
||||
icaps = gst_caps_intersect (caps, mycaps);
|
||||
if (!gst_caps_is_empty (icaps)) {
|
||||
gst_caps_free (icaps);
|
||||
gst_caps_unref (icaps);
|
||||
g_print ("returning %d\n", rate);
|
||||
return gst_caps_copy (mycaps);
|
||||
}
|
||||
gst_caps_free (icaps);
|
||||
gst_caps_unref (icaps);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -56,11 +58,10 @@ int
|
|||
main (int argc, char *argv[])
|
||||
{
|
||||
GstElement *pipeline;
|
||||
const GList *list;
|
||||
const GList *l2;
|
||||
int i;
|
||||
int ret;
|
||||
GError *error = NULL;
|
||||
GstIterator *iter1, *iter2;
|
||||
gint done1 = FALSE, done2 = FALSE;
|
||||
gpointer element;
|
||||
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
|
@ -77,42 +78,73 @@ main (int argc, char *argv[])
|
|||
exit (0);
|
||||
}
|
||||
|
||||
list = gst_bin_get_list (GST_BIN (pipeline));
|
||||
while (list) {
|
||||
GstElement *element = GST_ELEMENT (list->data);
|
||||
iter1 = gst_bin_iterate_elements (GST_BIN (pipeline));
|
||||
while (!done1) {
|
||||
switch (gst_iterator_next (iter1, &element)) {
|
||||
case GST_ITERATOR_OK:
|
||||
{
|
||||
gpointer pad;
|
||||
|
||||
l2 = gst_element_get_pad_list (element);
|
||||
while (l2) {
|
||||
GstPad *pad = GST_PAD (l2->data);
|
||||
iter2 = gst_element_iterate_pads (element);
|
||||
while (!done2) {
|
||||
switch (gst_iterator_next (iter2, &pad)) {
|
||||
case GST_ITERATOR_OK:
|
||||
if (gst_pad_get_direction (pad) == GST_PAD_SRC) {
|
||||
g_signal_connect (G_OBJECT (pad), "fixate",
|
||||
G_CALLBACK (my_fixate), NULL);
|
||||
}
|
||||
gst_object_unref (pad);
|
||||
break;
|
||||
case GST_ITERATOR_DONE:
|
||||
done2 = TRUE;
|
||||
break;
|
||||
case GST_ITERATOR_RESYNC:
|
||||
case GST_ITERATOR_ERROR:
|
||||
exit (1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
gst_iterator_free (iter2);
|
||||
|
||||
if (gst_pad_get_direction (pad) == GST_PAD_SRC) {
|
||||
g_signal_connect (G_OBJECT (pad), "fixate", G_CALLBACK (my_fixate),
|
||||
NULL);
|
||||
gst_object_unref (element);
|
||||
break;
|
||||
}
|
||||
l2 = g_list_next (l2);
|
||||
case GST_ITERATOR_DONE:
|
||||
done1 = TRUE;
|
||||
break;
|
||||
case GST_ITERATOR_RESYNC:
|
||||
case GST_ITERATOR_ERROR:
|
||||
exit (1);
|
||||
break;
|
||||
}
|
||||
list = g_list_next (list);
|
||||
}
|
||||
gst_iterator_free (iter1);
|
||||
|
||||
g_signal_connect (pipeline, "deep_notify",
|
||||
G_CALLBACK (gst_element_default_deep_notify), NULL);
|
||||
/*g_signal_connect (pipeline, "deep_notify",
|
||||
G_CALLBACK (gst_element_default_deep_notify), NULL); */
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
i = 0;
|
||||
while (1) {
|
||||
gst_bin_iterate (GST_BIN (pipeline));
|
||||
i++;
|
||||
if (i == 10) {
|
||||
stage = 1;
|
||||
g_print ("10 iterations\n");
|
||||
ret = gst_pad_renegotiate (sinesrcpad);
|
||||
g_print ("negotiation returned %d\n", ret);
|
||||
}
|
||||
if (i == 20) {
|
||||
g_print ("20 iterations\n");
|
||||
exit (0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
i = 0;
|
||||
while (1) {
|
||||
gst_bin_iterate (GST_BIN (pipeline));
|
||||
i++;
|
||||
if (i == 10) {
|
||||
stage = 1;
|
||||
g_print ("10 iterations\n");
|
||||
ret = gst_pad_renegotiate (sinesrcpad);
|
||||
g_print ("negotiation returned %d\n", ret);
|
||||
}
|
||||
if (i == 20) {
|
||||
g_print ("20 iterations\n");
|
||||
exit (0);
|
||||
}
|
||||
}
|
||||
*/
|
||||
/* Like totally not sure how to do this in THREADED. Punting for now! */
|
||||
|
||||
sleep (5);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ check_caps (const gchar * eins, const gchar * zwei)
|
|||
test3 = gst_caps_intersect (test2, two);
|
||||
g_print (" empty = %s\n", gst_caps_to_string (test3));
|
||||
g_assert (gst_caps_is_empty (test3));
|
||||
gst_caps_free (test3);
|
||||
gst_caps_unref (test3);
|
||||
test3 = gst_caps_union (test2, two);
|
||||
g_print (" A + B = %u\n", strlen (gst_caps_to_string (test3)));
|
||||
/* test3 = one - two + two = one + two */
|
||||
|
@ -52,15 +52,15 @@ check_caps (const gchar * eins, const gchar * zwei)
|
|||
test4 = gst_caps_union (one, two);
|
||||
g_assert (gst_caps_is_equal (test3, test4));
|
||||
g_print (" NOT EQUAL\n\n");
|
||||
gst_caps_free (test2);
|
||||
gst_caps_free (test3);
|
||||
gst_caps_free (test4);
|
||||
gst_caps_unref (test2);
|
||||
gst_caps_unref (test3);
|
||||
gst_caps_unref (test4);
|
||||
} else {
|
||||
g_print (" ANY CAPS\n\n");
|
||||
}
|
||||
gst_caps_free (test);
|
||||
gst_caps_free (two);
|
||||
gst_caps_free (one);
|
||||
gst_caps_unref (test);
|
||||
gst_caps_unref (two);
|
||||
gst_caps_unref (one);
|
||||
}
|
||||
|
||||
gint
|
||||
|
|
|
@ -61,7 +61,7 @@ check_caps (GstCaps * caps)
|
|||
|
||||
g_free (before);
|
||||
g_free (after);
|
||||
gst_caps_free (old);
|
||||
gst_caps_unref (old);
|
||||
}
|
||||
|
||||
gint
|
||||
|
@ -86,7 +86,7 @@ main (gint argc, gchar ** argv)
|
|||
|
||||
g_print ("%2u - %2u ", i, j);
|
||||
check_caps (temp);
|
||||
gst_caps_free (temp);
|
||||
gst_caps_unref (temp);
|
||||
/* union */
|
||||
temp = gst_caps_union (caps, caps2);
|
||||
g_print ("%2u + %2u ", i, j);
|
||||
|
@ -99,11 +99,11 @@ main (gint argc, gchar ** argv)
|
|||
temp2 = gst_caps_copy (caps);
|
||||
gst_caps_append (temp2, caps2);
|
||||
g_assert (gst_caps_is_equal (temp, temp2));
|
||||
gst_caps_free (temp2);
|
||||
gst_caps_free (temp);
|
||||
gst_caps_unref (temp2);
|
||||
gst_caps_unref (temp);
|
||||
}
|
||||
}
|
||||
gst_caps_free (caps);
|
||||
gst_caps_unref (caps);
|
||||
}
|
||||
g_print ("\n\nSTATISTICS:\n");
|
||||
g_print ("\nOf all caps tried\n");
|
||||
|
|
|
@ -30,23 +30,23 @@ check_caps (const gchar * set, const gchar * subset)
|
|||
/* basics */
|
||||
test = gst_caps_subtract (one, one);
|
||||
g_assert (gst_caps_is_empty (test));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
test = gst_caps_subtract (two, two);
|
||||
g_assert (gst_caps_is_empty (test));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
test = gst_caps_subtract (two, one);
|
||||
g_assert (gst_caps_is_empty (test));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
/* now the nice part */
|
||||
test = gst_caps_subtract (one, two);
|
||||
g_assert (!gst_caps_is_empty (test));
|
||||
g_print (" A - B = %s\n", gst_caps_to_string (test));
|
||||
test2 = gst_caps_union (test, two);
|
||||
g_print ("A - B + B = %s\n", gst_caps_to_string (test2));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
test = gst_caps_subtract (test2, one);
|
||||
g_assert (gst_caps_is_empty (test));
|
||||
gst_caps_free (test);
|
||||
gst_caps_unref (test);
|
||||
}
|
||||
|
||||
gint
|
||||
|
|
|
@ -62,7 +62,6 @@ test_string_deserialization (void)
|
|||
} tests[] = {
|
||||
{
|
||||
"", ""}, {
|
||||
"\\", "\\"}, {
|
||||
"\"\"", ""},
|
||||
/* FAILURES */
|
||||
{
|
||||
|
@ -77,8 +76,11 @@ test_string_deserialization (void)
|
|||
"\"\\0\"", NULL}, /* unfinished escaped character */
|
||||
{
|
||||
"\" \"", NULL}, /* spaces must be escaped */
|
||||
#if 0
|
||||
/* FIXME 0.9: this test should fail, but it doesn't */
|
||||
{
|
||||
"tüüt", NULL} /* string with special chars must be escaped */
|
||||
#endif
|
||||
};
|
||||
guint i;
|
||||
GValue v = { 0, };
|
||||
|
|
Loading…
Reference in a new issue