CVS Root: /home/cvs/gstreamer Module: gstreamer Changes by: company Date: Fri Jul 16 2004 11:17:05 EST Log message: * gst/gstvalue.c: (gst_greatest_common_divisor): use ints and return ints, fractions only use ints, too, so this avoids accidently casting multiplications to unsigned (gst_value_lcopy_fraction): it's ints, not uint32 (gst_value_set_fraction): disallow minint, multiplying and negation are broken with it (gst_value_fraction_multiply): fix to make large numbers work and get rid of the assumption that the multiplication of two ints fits an int64 - dunno if that's true for all systems * testsuite/caps/Makefile.am: * testsuite/caps/fraction-multiply-and-zero.c: (check_multiplication), (check_equal), (zero_test), (main): add tests for all the stuff above * testsuite/caps/value_compare.c: (test1): fix comment * tests/.cvsignore: * testsuite/caps/.cvsignore: * testsuite/debug/.cvsignore: * testsuite/dlopen/.cvsignore: * testsuite/states/.cvsignore: get up to date Modified files: . : ChangeLog gst : gstvalue.c tests : .cvsignore testsuite/caps : .cvsignore Makefile.am value_compare.c testsuite/debug : .cvsignore testsuite/states: .cvsignore Added files: testsuite/caps : fraction-multiply-and-zero.c testsuite/dlopen: .cvsignore Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.684&r2=1.685 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstvalue.c.diff?r1=1.40&r2=1.41 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/tests/.cvsignore.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/testsuite/caps/.cvsignore.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/testsuite/caps/Makefile.am.diff?r1=1.26&r2=1.27 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/testsuite/caps/fraction-multiply-and-zero.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/testsuite/caps/value_compare.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/testsuite/debug/.cvsignore.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/testsuite/dlopen/.cvsignore?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/testsuite/states/.cvsignore.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.684 retrieving revision 1.685 diff -u -d -r1.684 -r1.685 --- ChangeLog 16 Jul 2004 00:43:57 -0000 1.684 +++ ChangeLog 16 Jul 2004 01:16:52 -0000 1.685 @@ -1,3 +1,27 @@ +2004-07-16 Benjamin Otte <ot...@gn...> + + * gst/gstvalue.c: (gst_greatest_common_divisor): + use ints and return ints, fractions only use ints, too, so this + avoids accidently casting multiplications to unsigned + (gst_value_lcopy_fraction): it's ints, not uint32 + (gst_value_set_fraction): disallow minint, multiplying and negation + are broken with it + (gst_value_fraction_multiply): fix to make large numbers work and get + rid of the assumption that the multiplication of two ints fits an + int64 - dunno if that's true for all systems + * testsuite/caps/Makefile.am: + * testsuite/caps/fraction-multiply-and-zero.c: + (check_multiplication), (check_equal), (zero_test), (main): + add tests for all the stuff above + * testsuite/caps/value_compare.c: (test1): + fix comment + * tests/.cvsignore: + * testsuite/caps/.cvsignore: + * testsuite/debug/.cvsignore: + * testsuite/dlopen/.cvsignore: + * testsuite/states/.cvsignore: + get up to date 2004-07-16 Zaheer Abbas Merali <zaheerabbas at merali dot org> * docs/manual/bins-api.xml: Index: gstvalue.c RCS file: /home/cvs/gstreamer/gstreamer/gst/gstvalue.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- gstvalue.c 15 Jul 2004 20:27:20 -0000 1.40 +++ gstvalue.c 16 Jul 2004 01:16:53 -0000 1.41 @@ -2298,8 +2298,8 @@ /* Finds the greatest common divisor. * Returns 1 if none other found. * This is Euclid's algorithm. */ -static guint -gst_greatest_common_divisor (gint64 a, gint64 b) +static gint +gst_greatest_common_divisor (gint a, gint b) { while (b != 0) { int temp = a; @@ -2308,9 +2308,7 @@ b = temp % b; } - g_return_val_if_fail (a < G_MAXINT, 1); - g_return_val_if_fail (a > G_MININT, 1); - return ABS ((gint) a); + return ABS (a); } static void @@ -2341,8 +2339,8 @@ gst_value_lcopy_fraction (const GValue * value, guint n_collect_values, GTypeCValue * collect_values, guint collect_flags) - guint32 *numerator = collect_values[0].v_pointer; - guint32 *denominator = collect_values[1].v_pointer; + gint *numerator = collect_values[0].v_pointer; + gint *denominator = collect_values[1].v_pointer; if (!numerator) return g_strdup_printf ("numerator for `%s' passed as NULL", @@ -2370,9 +2368,12 @@ void gst_value_set_fraction (GValue * value, gint numerator, gint denominator) + gint gcd = 0; g_return_if_fail (GST_VALUE_HOLDS_FRACTION (value)); g_return_if_fail (denominator != 0); - gint gcd = 0; + g_return_if_fail (denominator >= -G_MAXINT); + g_return_if_fail (numerator >= -G_MAXINT); /* normalize sign */ if (denominator < 0) { @@ -2437,10 +2438,7 @@ gst_value_fraction_multiply (GValue * product, const GValue * factor1, const GValue * factor2) - gint64 n, d; - guint gcd; - - gint n1, n2, d1, d2; + gint gcd, n1, n2, d1, d2; g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (factor1), FALSE); g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (factor2), FALSE); @@ -2450,19 +2448,17 @@ d1 = factor1->data[1].v_int; d2 = factor2->data[1].v_int; - n = n1 * n2; - d = d1 * d2; - gcd = gst_greatest_common_divisor (n, d); - n /= gcd; - d /= gcd; + gcd = gst_greatest_common_divisor (n1, d2); + n1 /= gcd; + d2 /= gcd; + gcd = gst_greatest_common_divisor (n2, d1); + n2 /= gcd; + d1 /= gcd; - g_return_val_if_fail (n < G_MAXINT, FALSE); - g_return_val_if_fail (n > G_MININT, FALSE); - g_return_val_if_fail (d < G_MAXINT, FALSE); - g_return_val_if_fail (d > G_MININT, FALSE); + g_return_val_if_fail (n1 == 0 || G_MAXINT / ABS (n1) >= ABS (n2), FALSE); + g_return_val_if_fail (G_MAXINT / ABS (d1) >= ABS (d2), FALSE); - gst_value_set_fraction (product, n, d); + gst_value_set_fraction (product, n1 * n2, d1 * d2); return TRUE; Index: .cvsignore RCS file: /home/cvs/gstreamer/gstreamer/testsuite/caps/.cvsignore,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- .cvsignore 22 Apr 2004 04:47:20 -0000 1.7 +++ .cvsignore 16 Jul 2004 01:16:53 -0000 1.8 @@ -13,12 +13,16 @@ audioscale caps compatibility -erathostenes +deserialize +eratosthenes filtercaps fixed +fraction-multiply-and-zero intersect2 intersection normalisation +random +renegotiate union simplify sets Index: Makefile.am RCS file: /home/cvs/gstreamer/gstreamer/testsuite/caps/Makefile.am,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- Makefile.am 15 Jul 2004 23:25:11 -0000 1.26 +++ Makefile.am 16 Jul 2004 01:16:53 -0000 1.27 @@ -10,6 +10,7 @@ union \ string-conversions \ fixed \ + fraction-multiply-and-zero \ intersect2 \ caps \ value_compare \ --- NEW FILE: fraction-multiply-and-zero.c --- /* GStreamer * * fraction.c: test for all GstFraction operations * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org> * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include <gst/gst.h> #include <glib.h> static void check_multiplication (int num1, int den1, int num2, int den2, int num_result, int den_result) { GValue value1 = { 0 }; GValue value2 = { 0 }; GValue value3 = { 0 }; g_value_init (&value1, GST_TYPE_FRACTION); g_value_init (&value2, GST_TYPE_FRACTION); g_value_init (&value3, GST_TYPE_FRACTION); gst_value_set_fraction (&value1, num1, den1); gst_value_set_fraction (&value2, num2, den2); g_print ("%d/%d * %d/%d = ", num1, den1, num2, den2); gst_value_fraction_multiply (&value3, &value1, &value2); g_print ("%d/%d (should be %d/%d)\n", gst_value_get_fraction_numerator (&value3), gst_value_get_fraction_denominator (&value3), num_result, den_result); g_assert (gst_value_get_fraction_numerator (&value3) == num_result); g_assert (gst_value_get_fraction_denominator (&value3) == den_result); g_value_unset (&value1); g_value_unset (&value2); g_value_unset (&value3); } check_equal (int num1, int den1, int num2, int den2) g_print ("%d/%d == %d/%d ? ", num1, den1, num2, den2); g_assert (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL); g_print ("yes\n"); zero_test (void) /* fractions are initialized at 0 */ g_assert (gst_value_get_fraction_numerator (&value1) == 0); g_assert (gst_value_get_fraction_denominator (&value1) == 1); /* every zero value is set to 0/1 */ gst_value_set_fraction (&value1, 0, 235); gst_value_set_fraction (&value1, 0, -G_MAXINT); int main (int argc, char *argv[]) gst_init (&argc, &argv); /*** zeroes ***/ /* basic zero tests */ zero_test (); /* check all zeroes are zeroes */ check_equal (0, 1, 0, 12345); check_equal (0, 1, 0, -1); /* check multiplying with zeroes results in zeroes */ check_multiplication (0, 1, 17, 18, 0, 1); check_multiplication (0, -13, -G_MAXINT, 2736, 0, 1); /*** large numbers ***/ /* check multiplying large numbers works */ check_multiplication (G_MAXINT, 1, G_MAXINT - 1, G_MAXINT, G_MAXINT - 1, 1); check_multiplication (-G_MAXINT, 1, -G_MAXINT + 1, -G_MAXINT, -G_MAXINT + 1, 1); check_multiplication (G_MAXINT / 28, 459, -28, -G_MAXINT / 459, G_MAXINT / 28 * 28, G_MAXINT / 459 * 459); check_multiplication (3117 * 13, -17, 3117 * 17, 13, -3117 * 3117, 1); return 0; Index: value_compare.c RCS file: /home/cvs/gstreamer/gstreamer/testsuite/caps/value_compare.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- value_compare.c 15 Jul 2004 20:27:20 -0000 1.3 +++ value_compare.c 16 Jul 2004 01:16:53 -0000 1.4 @@ -72,7 +72,7 @@ g_value_unset (&value1); g_value_unset (&value2); - /* comparing 10/100 with 20/2000 */ + /* comparing 10/100 with 200/2000 */ g_value_init (&value1, GST_TYPE_FRACTION); gst_value_set_fraction (&value1, 10, 100); g_value_init (&value2, GST_TYPE_FRACTION); RCS file: /home/cvs/gstreamer/gstreamer/tests/.cvsignore,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- .cvsignore 2 Jul 2004 03:26:44 -0000 1.16 +++ .cvsignore 16 Jul 2004 01:16:53 -0000 1.17 @@ -38,6 +38,7 @@ events lat mass_elements +spidey_bench *.bb *.bbg *.da RCS file: /home/cvs/gstreamer/gstreamer/testsuite/debug/.cvsignore,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- .cvsignore 15 Mar 2004 17:26:29 -0000 1.1 +++ .cvsignore 16 Jul 2004 01:16:53 -0000 1.2 @@ -1,4 +1,5 @@ category commandline +global output printf_extension --- NEW FILE: .cvsignore --- dlopen_gst RCS file: /home/cvs/gstreamer/gstreamer/testsuite/states/.cvsignore,v --- .cvsignore 25 Mar 2003 19:41:15 -0000 1.1 @@ -5,4 +5,6 @@ *.la .deps .libs locked +parent |