gst_value_collect_int_range (GValue * value, guint n_collect_values,
GTypeCValue * collect_values, guint collect_flags)
{
+ if (n_collect_values != 2)
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[0].v_int >= collect_values[1].v_int)
+ return g_strdup_printf ("range start is not smaller than end for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
value->data[0].v_int = collect_values[0].v_int;
value->data[1].v_int = collect_values[1].v_int;
gst_value_collect_double_range (GValue * value, guint n_collect_values,
GTypeCValue * collect_values, guint collect_flags)
{
+ if (n_collect_values != 2)
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[0].v_double >= collect_values[1].v_double)
+ return g_strdup_printf ("range start is not smaller than end for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
value->data[0].v_double = collect_values[0].v_double;
value->data[1].v_double = collect_values[1].v_double;
if (n_collect_values != 4)
return g_strdup_printf ("not enough value locations for `%s' passed",
G_VALUE_TYPE_NAME (value));
+ if (collect_values[1].v_int == 0)
+ return g_strdup_printf ("passed '0' as first denominator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[3].v_int == 0)
+ return g_strdup_printf ("passed '0' as second denominator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if ((((gdouble) collect_values[0].v_int) /
+ ((gdouble) collect_values[1].v_int)) >=
+ (((gdouble) collect_values[2].v_int) /
+ ((gdouble) collect_values[3].v_int)))
+ return g_strdup_printf ("range start is not smaller than end for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
if (vals == NULL) {
gst_value_init_fraction_range (value);
vals = value->data[0].v_pointer;
GValue *vals;
g_return_if_fail (GST_VALUE_HOLDS_FRACTION_RANGE (value));
+ g_return_if_fail (GST_VALUE_HOLDS_FRACTION (start));
+ g_return_if_fail (GST_VALUE_HOLDS_FRACTION (end));
+ g_return_if_fail (((gdouble) start->data[0].v_int) /
+ ((gdouble) start->data[1].v_int) <
+ ((gdouble) end->data[0].v_int) / ((gdouble) end->data[1].v_int));
vals = (GValue *) value->data[0].v_pointer;
if (vals == NULL) {
g_return_if_fail (value != NULL);
g_return_if_fail (denominator_start != 0);
g_return_if_fail (denominator_end != 0);
+ g_return_if_fail (((gdouble) numerator_start) /
+ ((gdouble) denominator_start) <
+ ((gdouble) numerator_end) / ((gdouble) denominator_end));
g_value_init (&start, GST_TYPE_FRACTION);
g_value_init (&end, GST_TYPE_FRACTION);
gst_value_collect_fraction (GValue * value, guint n_collect_values,
GTypeCValue * collect_values, guint collect_flags)
{
+ if (n_collect_values != 2)
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[1].v_int == 0)
+ return g_strdup_printf ("passed '0' as denominator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[0].v_int < -G_MAXINT)
+ return
+ g_strdup_printf
+ ("passed value smaller than -G_MAXINT as numerator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[1].v_int < -G_MAXINT)
+ return
+ g_strdup_printf
+ ("passed value smaller than -G_MAXINT as denominator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
gst_value_set_fraction (value,
collect_values[0].v_int, collect_values[1].v_int);
gint n1, n2, d1, d2;
gint res_n, res_d;
+ g_return_val_if_fail (product != NULL, FALSE);
g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (factor1), FALSE);
g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (factor2), FALSE);
gint n1, n2, d1, d2;
gint res_n, res_d;
+ g_return_val_if_fail (dest != NULL, FALSE);
g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (minuend), FALSE);
g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (subtrahend), FALSE);
if (sscanf (s, "%d/%d%n", &num, &den, &num_chars) >= 2) {
if (s[num_chars] != 0)
return FALSE;
+ if (den == 0)
+ return FALSE;
+
gst_value_set_fraction (dest, num, den);
return TRUE;
} else if (g_ascii_strcasecmp (s, "1/max") == 0) {