mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 14:56:36 +00:00
gstvalue: add stepped ranges
int and int64 ranges can now have an optional step (defaulting to 1). Members of the range are those values within the min and max bounds which are a multiple of this step. https://bugzilla.gnome.org/show_bug.cgi?id=665294
This commit is contained in:
parent
7319b52a2e
commit
39533f4364
4 changed files with 673 additions and 145 deletions
|
@ -1900,8 +1900,9 @@ gst_structure_parse_range (gchar * s, gchar ** after, GValue * value,
|
|||
{
|
||||
GValue value1 = { 0 };
|
||||
GValue value2 = { 0 };
|
||||
GValue value3 = { 0 };
|
||||
GType range_type;
|
||||
gboolean ret;
|
||||
gboolean ret, have_step = FALSE;
|
||||
|
||||
if (*s != '[')
|
||||
return FALSE;
|
||||
|
@ -1928,12 +1929,34 @@ gst_structure_parse_range (gchar * s, gchar ** after, GValue * value,
|
|||
while (g_ascii_isspace (*s))
|
||||
s++;
|
||||
|
||||
/* optional step for int and int64 */
|
||||
if (G_VALUE_TYPE (&value1) == G_TYPE_INT
|
||||
|| G_VALUE_TYPE (&value1) == G_TYPE_INT64) {
|
||||
if (*s == ',') {
|
||||
s++;
|
||||
|
||||
while (g_ascii_isspace (*s))
|
||||
s++;
|
||||
|
||||
ret = gst_structure_parse_value (s, &s, &value3, type);
|
||||
if (ret == FALSE)
|
||||
return FALSE;
|
||||
|
||||
while (g_ascii_isspace (*s))
|
||||
s++;
|
||||
|
||||
have_step = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (*s != ']')
|
||||
return FALSE;
|
||||
s++;
|
||||
|
||||
if (G_VALUE_TYPE (&value1) != G_VALUE_TYPE (&value2))
|
||||
return FALSE;
|
||||
if (have_step && G_VALUE_TYPE (&value1) != G_VALUE_TYPE (&value3))
|
||||
return FALSE;
|
||||
|
||||
if (G_VALUE_TYPE (&value1) == G_TYPE_DOUBLE) {
|
||||
range_type = GST_TYPE_DOUBLE_RANGE;
|
||||
|
@ -1944,13 +1967,26 @@ gst_structure_parse_range (gchar * s, gchar ** after, GValue * value,
|
|||
} else if (G_VALUE_TYPE (&value1) == G_TYPE_INT) {
|
||||
range_type = GST_TYPE_INT_RANGE;
|
||||
g_value_init (value, range_type);
|
||||
gst_value_set_int_range (value, gst_g_value_get_int_unchecked (&value1),
|
||||
gst_g_value_get_int_unchecked (&value2));
|
||||
if (have_step)
|
||||
gst_value_set_int_range_step (value,
|
||||
gst_g_value_get_int_unchecked (&value1),
|
||||
gst_g_value_get_int_unchecked (&value2),
|
||||
gst_g_value_get_int_unchecked (&value3));
|
||||
else
|
||||
gst_value_set_int_range (value, gst_g_value_get_int_unchecked (&value1),
|
||||
gst_g_value_get_int_unchecked (&value2));
|
||||
} else if (G_VALUE_TYPE (&value1) == G_TYPE_INT64) {
|
||||
range_type = GST_TYPE_INT64_RANGE;
|
||||
g_value_init (value, range_type);
|
||||
gst_value_set_int64_range (value, gst_g_value_get_int64_unchecked (&value1),
|
||||
gst_g_value_get_int64_unchecked (&value2));
|
||||
if (have_step)
|
||||
gst_value_set_int64_range_step (value,
|
||||
gst_g_value_get_int64_unchecked (&value1),
|
||||
gst_g_value_get_int64_unchecked (&value2),
|
||||
gst_g_value_get_int64_unchecked (&value3));
|
||||
else
|
||||
gst_value_set_int64_range (value,
|
||||
gst_g_value_get_int64_unchecked (&value1),
|
||||
gst_g_value_get_int64_unchecked (&value2));
|
||||
} else if (G_VALUE_TYPE (&value1) == GST_TYPE_FRACTION) {
|
||||
range_type = GST_TYPE_FRACTION_RANGE;
|
||||
g_value_init (value, range_type);
|
||||
|
@ -3132,32 +3168,7 @@ gst_caps_structure_is_subset_field (GQuark field_id, const GValue * value,
|
|||
if (comparison != GST_VALUE_UNORDERED)
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
* 1 - [1,2] = empty
|
||||
* -> !subset
|
||||
*
|
||||
* [1,2] - 1 = 2
|
||||
* -> 1 - [1,2] = empty
|
||||
* -> subset
|
||||
*
|
||||
* [1,3] - [1,2] = 3
|
||||
* -> [1,2] - [1,3] = empty
|
||||
* -> subset
|
||||
*
|
||||
* {1,2} - {1,3} = 2
|
||||
* -> {1,3} - {1,2} = 3
|
||||
* -> !subset
|
||||
*
|
||||
* First caps subtraction needs to return a non-empty set, second
|
||||
* subtractions needs to give en empty set.
|
||||
* Both substractions are switched below, as it's faster that way.
|
||||
*/
|
||||
if (!gst_value_subtract (NULL, value, other)) {
|
||||
if (gst_value_subtract (NULL, other, value)) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
return gst_value_is_subset (value, other);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
726
gst/gstvalue.c
726
gst/gstvalue.c
File diff suppressed because it is too large
Load diff
|
@ -476,15 +476,25 @@ const GValue * gst_value_array_get_value (const GValue *value,
|
|||
void gst_value_set_int_range (GValue *value,
|
||||
gint start,
|
||||
gint end);
|
||||
void gst_value_set_int_range_step (GValue *value,
|
||||
gint start,
|
||||
gint end,
|
||||
gint step);
|
||||
gint gst_value_get_int_range_min (const GValue *value);
|
||||
gint gst_value_get_int_range_max (const GValue *value);
|
||||
gint gst_value_get_int_range_step (const GValue *value);
|
||||
|
||||
/* int64 range */
|
||||
void gst_value_set_int64_range (GValue *value,
|
||||
gint64 start,
|
||||
gint64 end);
|
||||
void gst_value_set_int64_range_step (GValue *value,
|
||||
gint64 start,
|
||||
gint64 end,
|
||||
gint64 step);
|
||||
gint64 gst_value_get_int64_range_min (const GValue *value);
|
||||
gint64 gst_value_get_int64_range_max (const GValue *value);
|
||||
gint64 gst_value_get_int64_range_step (const GValue *value);
|
||||
|
||||
/* double range */
|
||||
void gst_value_set_double_range (GValue *value,
|
||||
|
@ -539,6 +549,9 @@ gint gst_value_compare (const GValue *value1,
|
|||
const GValue *value2);
|
||||
gboolean gst_value_can_compare (const GValue *value1,
|
||||
const GValue *value2);
|
||||
gboolean gst_value_is_subset (const GValue *value1,
|
||||
const GValue *value2);
|
||||
|
||||
/* union */
|
||||
gboolean gst_value_union (GValue *dest,
|
||||
const GValue *value1,
|
||||
|
|
|
@ -1155,6 +1155,7 @@ EXPORTS
|
|||
gst_util_gdouble_to_guint64
|
||||
gst_util_get_timestamp
|
||||
gst_util_greatest_common_divisor
|
||||
gst_util_greatest_common_divisor_int64
|
||||
gst_util_guint64_to_gdouble
|
||||
gst_util_seqnum_compare
|
||||
gst_util_seqnum_next
|
||||
|
@ -1190,12 +1191,15 @@ EXPORTS
|
|||
gst_value_get_fraction_range_min
|
||||
gst_value_get_int64_range_max
|
||||
gst_value_get_int64_range_min
|
||||
gst_value_get_int64_range_step
|
||||
gst_value_get_int_range_max
|
||||
gst_value_get_int_range_min
|
||||
gst_value_get_int_range_step
|
||||
gst_value_get_structure
|
||||
gst_value_init_and_copy
|
||||
gst_value_intersect
|
||||
gst_value_is_fixed
|
||||
gst_value_is_subset
|
||||
gst_value_list_append_value
|
||||
gst_value_list_concat
|
||||
gst_value_list_get_size
|
||||
|
@ -1215,7 +1219,9 @@ EXPORTS
|
|||
gst_value_set_fraction_range
|
||||
gst_value_set_fraction_range_full
|
||||
gst_value_set_int64_range
|
||||
gst_value_set_int64_range_step
|
||||
gst_value_set_int_range
|
||||
gst_value_set_int_range_step
|
||||
gst_value_set_structure
|
||||
gst_value_subtract
|
||||
gst_value_union
|
||||
|
|
Loading…
Reference in a new issue