}
/**
+ * gst_clear_structure: (skip)
+ * @structure_ptr: a pointer to a #GstStructure reference
+ *
+ * Clears a reference to a #GstStructure.
+ *
+ * @structure_ptr must not be %NULL.
+ *
+ * If the reference is %NULL then this function does nothing.
+ * Otherwise, the structure is free'd using gst_structure_free() and the
+ * pointer is set to %NULL.
+ *
+ * A macro is also included that allows this function to be used without
+ * pointer casts.
+ *
+ * Since: 1.16
+ **/
+#undef gst_clear_structure
+void
+gst_clear_structure (GstStructure ** structure_ptr)
+{
+ g_clear_pointer (structure_ptr, gst_structure_free);
+}
+
+/**
* gst_structure_get_name:
* @structure: a #GstStructure
*
G_VALUE_COLLECT_INIT (&field.value, type, varargs, 0, &err);
if (G_UNLIKELY (err)) {
g_critical ("%s", err);
+ g_free (err);
return;
}
gst_structure_set_field (structure, &field);
G_VALUE_COLLECT_INIT (&field.value, type, varargs, 0, &err);
if (G_UNLIKELY (err)) {
g_critical ("%s", err);
+ g_free (err);
return;
}
gst_structure_set_field (structure, &field);
*
* Get the value of the field with name @fieldname.
*
- * Returns: the #GValue corresponding to the field with the given name.
+ * Returns: (nullable): the #GValue corresponding to the field with the given
+ * name.
*/
const GValue *
gst_structure_get_value (const GstStructure * structure,
*
* Get the value of the field with GQuark @field.
*
- * Returns: the #GValue corresponding to the field with the given name
- * identifier.
+ * Returns: (nullable): the #GValue corresponding to the field with the given
+ * name identifier.
*/
const GValue *
gst_structure_id_get_value (const GstStructure * structure, GQuark field)
if (t) {
g_string_append (s, t);
g_free (t);
+ } else if (G_TYPE_CHECK_VALUE_TYPE (&field->value, G_TYPE_POINTER)) {
+ gpointer ptr = g_value_get_pointer (&field->value);
+
+ if (!ptr)
+ g_string_append (s, "NULL");
+ else
+ g_string_append_printf (s, "%p", ptr);
} else {
- if (!G_TYPE_CHECK_VALUE_TYPE (&field->value, G_TYPE_STRING) &&
- !(G_TYPE_CHECK_VALUE_TYPE (&field->value, G_TYPE_POINTER) &&
- g_value_get_pointer (&field->value) == NULL))
+ if (!G_TYPE_CHECK_VALUE_TYPE (&field->value, G_TYPE_STRING))
GST_WARNING ("No value transform to serialize field '%s' of type '%s'",
g_quark_to_string (field->name),
_priv_gst_value_gtype_to_abbr (type));
+ /* TODO(ensonic): don't print NULL if field->value is not empty */
g_string_append (s, "NULL");
}
}
/* already fixed */
return FALSE;
} else if (G_VALUE_TYPE (value) == GST_TYPE_INT_RANGE) {
- int x;
+ int min, max, step;
+
+ min = gst_value_get_int_range_min (value);
+ max = gst_value_get_int_range_max (value);
+ step = gst_value_get_int_range_step (value);
+
+ target = CLAMP (target, min, max);
+ if (G_UNLIKELY (step != 1)) {
+ gint rem = target % step;
+ target -= rem;
+ if (rem > step / 2)
+ target += step;
+ }
- 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) {
*
* Intersects @struct1 and @struct2 and returns the intersection.
*
- * Returns: Intersection of @struct1 and @struct2
+ * Returns: (nullable): Intersection of @struct1 and @struct2
*/
GstStructure *
gst_structure_intersect (const GstStructure * struct1,
* @array: (out): a pointer to a #GValueArray
*
* This is useful in language bindings where unknown #GValue types are not
- * supported. This function will convert the %GST_TYPE_ARRAY and
- * %GST_TYPE_LIST into a newly allocated #GValueArray and return it through
- * @array. Be aware that this is slower then getting the #GValue directly.
+ * supported. This function will convert the %GST_TYPE_ARRAY into a newly
+ * allocated #GValueArray and return it through @array. Be aware that this is
+ * slower then getting the #GValue directly.
*
* Returns: %TRUE if the value could be set correctly. If there was no field
- * with @fieldname or the existing field did not contain an int, this function
- * returns %FALSE.
+ * with @fieldname or the existing field did not contain a %GST_TYPE_ARRAY,
+ * this function returns %FALSE.
*/
gboolean
gst_structure_get_array (GstStructure * structure, const gchar * fieldname,
* @array: (out): a pointer to a #GValueArray
*
* This is useful in language bindings where unknown #GValue types are not
- * supported. This function will convert the %GST_TYPE_ARRAY and
- * %GST_TYPE_LIST into a newly allocated GValueArray and return it through
- * @array. Be aware that this is slower then getting the #GValue directly.
+ * supported. This function will convert the %GST_TYPE_LIST into a newly
+ * allocated GValueArray and return it through @array. Be aware that this is
+ * slower then getting the #GValue directly.
*
* Returns: %TRUE if the value could be set correctly. If there was no field
- * with @fieldname or the existing field did not contain an int, this function
- * returns %FALSE.
+ * with @fieldname or the existing field did not contain a %GST_TYPE_LIST, this
+ * function returns %FALSE.
*
- * Since 1.12
+ * Since: 1.12
*/
gboolean
gst_structure_get_list (GstStructure * structure, const gchar * fieldname,
* the field specified by @fieldname. Be aware that this is slower then using
* %GST_TYPE_ARRAY in a #GValue directly.
*
- * Since 1.12
+ * Since: 1.12
*/
void
gst_structure_set_array (GstStructure * structure, const gchar * fieldname,
* @array: a pointer to a #GValueArray
*
* This is useful in language bindings where unknown GValue types are not
- * supported. This function will convert a @array to %GST_TYPE_ARRAY and set
+ * supported. This function will convert a @array to %GST_TYPE_LIST and set
* the field specified by @fieldname. Be aware that this is slower then using
- * %GST_TYPE_ARRAY in a #GValue directly.
+ * %GST_TYPE_LIST in a #GValue directly.
*
- * Since 1.12
+ * Since: 1.12
*/
void
gst_structure_set_list (GstStructure * structure, const gchar * fieldname,