mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
gst/__init__.py: Added __eq__ method to fractions so we can check if two fractions are equal.
Original commit message from CVS: * gst/__init__.py: Added __eq__ method to fractions so we can check if two fractions are equal. * gst/pygstvalue.c: (my_gcd), (pygst_value_from_pyobject): Attempt to simplify gst.Fraction before filling in a GValue. Fixes #381243 * testsuite/test_caps.py: * testsuite/test_struct.py: Minor beauty fixes. framerates are fractions, not floats.
This commit is contained in:
parent
78dc74984d
commit
34f77d7db3
5 changed files with 50 additions and 5 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2007-03-01 Edward Hervey <edward@fluendo.com>
|
||||||
|
|
||||||
|
* gst/__init__.py:
|
||||||
|
Added __eq__ method to fractions so we can check if two fractions are
|
||||||
|
equal.
|
||||||
|
* gst/pygstvalue.c: (my_gcd), (pygst_value_from_pyobject):
|
||||||
|
Attempt to simplify gst.Fraction before filling in a GValue.
|
||||||
|
Fixes #381243
|
||||||
|
* testsuite/test_caps.py:
|
||||||
|
* testsuite/test_struct.py:
|
||||||
|
Minor beauty fixes. framerates are fractions, not floats.
|
||||||
|
|
||||||
2007-03-01 Jan Schmidt <thaytan@mad.scientist.com>
|
2007-03-01 Jan Schmidt <thaytan@mad.scientist.com>
|
||||||
|
|
||||||
reviewed by: Edward Hervey <edward@fluendo.com>
|
reviewed by: Edward Hervey <edward@fluendo.com>
|
||||||
|
|
|
@ -80,6 +80,11 @@ class Fraction(Value):
|
||||||
Value.__init__(self, 'fraction')
|
Value.__init__(self, 'fraction')
|
||||||
self.num = num
|
self.num = num
|
||||||
self.denom = denom
|
self.denom = denom
|
||||||
|
def __eq__(self, other):
|
||||||
|
if isinstance(other, Fraction):
|
||||||
|
return self.num * other.denom == other.num * self.denom
|
||||||
|
return False
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<gst.Fraction %d/%d>' % (self.num, self.denom)
|
return '<gst.Fraction %d/%d>' % (self.num, self.denom)
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,24 @@ static PyObject *gstdoublerange_class = NULL;
|
||||||
static PyObject *gstfraction_class = NULL;
|
static PyObject *gstfraction_class = NULL;
|
||||||
static PyObject *gstfractionrange_class = NULL;
|
static PyObject *gstfractionrange_class = NULL;
|
||||||
|
|
||||||
|
/* helper function */
|
||||||
|
|
||||||
|
/* Finds the greatest common divisor.
|
||||||
|
* Returns 1 if none other found.
|
||||||
|
* This is Euclid's algorithm. */
|
||||||
|
static long
|
||||||
|
my_gcd(long num, long denom)
|
||||||
|
{
|
||||||
|
while (denom != 0) {
|
||||||
|
long temp = num;
|
||||||
|
|
||||||
|
num = denom;
|
||||||
|
denom = temp % denom;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ABS (num);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pygst_value_as_pyobject:
|
* pygst_value_as_pyobject:
|
||||||
* @value: the GValue object.
|
* @value: the GValue object.
|
||||||
|
@ -225,14 +243,24 @@ pygst_value_from_pyobject (GValue *value, PyObject *obj)
|
||||||
} else if (PyObject_IsInstance (obj, gstfraction_class)) {
|
} else if (PyObject_IsInstance (obj, gstfraction_class)) {
|
||||||
PyObject *pyval;
|
PyObject *pyval;
|
||||||
long num, denom;
|
long num, denom;
|
||||||
|
long gcd = 0;
|
||||||
VALUE_TYPE_CHECK (value, GST_TYPE_FRACTION);
|
VALUE_TYPE_CHECK (value, GST_TYPE_FRACTION);
|
||||||
if (!(pyval = PyObject_GetAttrString (obj, "num")))
|
if (!(pyval = PyObject_GetAttrString (obj, "num")))
|
||||||
return -1;
|
return -1;
|
||||||
num = PyInt_AsLong (pyval);
|
num = PyInt_AsLong (pyval);
|
||||||
|
if ((num == -1) && PyErr_Occurred())
|
||||||
|
return -1;
|
||||||
g_assert (G_MININT <= num && num <= G_MAXINT);
|
g_assert (G_MININT <= num && num <= G_MAXINT);
|
||||||
if (!(pyval = PyObject_GetAttrString (obj, "denom")))
|
if (!(pyval = PyObject_GetAttrString (obj, "denom")))
|
||||||
return -1;
|
return -1;
|
||||||
denom = PyInt_AsLong (pyval);
|
denom = PyInt_AsLong (pyval);
|
||||||
|
if ((denom == -1) && PyErr_Occurred())
|
||||||
|
return -1;
|
||||||
|
/* we need to reduce the values to be smaller than MAXINT */
|
||||||
|
if ((gcd = my_gcd(num, denom))) {
|
||||||
|
num /= gcd;
|
||||||
|
denom /= gcd;
|
||||||
|
}
|
||||||
g_assert (G_MININT <= denom && denom <= G_MAXINT);
|
g_assert (G_MININT <= denom && denom <= G_MAXINT);
|
||||||
gst_value_set_fraction (value, (int)num, (int)denom);
|
gst_value_set_fraction (value, (int)num, (int)denom);
|
||||||
} else if (PyObject_IsInstance (obj, gstfractionrange_class)) {
|
} else if (PyObject_IsInstance (obj, gstfractionrange_class)) {
|
||||||
|
|
|
@ -26,7 +26,7 @@ from common import gst, unittest, TestCase
|
||||||
class CapsTest(TestCase):
|
class CapsTest(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
TestCase.setUp(self)
|
TestCase.setUp(self)
|
||||||
self.caps = gst.caps_from_string('video/x-raw-yuv,width=10,framerate=5.0;video/x-raw-rgb,width=15,framerate=10.0')
|
self.caps = gst.caps_from_string('video/x-raw-yuv,width=10,framerate=5/1;video/x-raw-rgb,width=15,framerate=10/1')
|
||||||
self.assertEquals(self.caps.__refcount__, 1)
|
self.assertEquals(self.caps.__refcount__, 1)
|
||||||
self.structure = self.caps[0]
|
self.structure = self.caps[0]
|
||||||
self.any = gst.Caps("ANY")
|
self.any = gst.Caps("ANY")
|
||||||
|
|
|
@ -26,7 +26,7 @@ from common import gst, unittest, TestCase
|
||||||
class StructureTest(TestCase):
|
class StructureTest(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
TestCase.setUp(self)
|
TestCase.setUp(self)
|
||||||
self.struct = gst.structure_from_string('video/x-raw-yuv,width=10,foo="bar",pixel-aspect-ratio=1/2,framerate=5.0,boolean=(boolean)true')
|
self.struct = gst.structure_from_string('video/x-raw-yuv,width=10,foo="bar",pixel-aspect-ratio=1/2,framerate=5/1,boolean=(boolean)true')
|
||||||
|
|
||||||
def testName(self):
|
def testName(self):
|
||||||
assert self.struct.get_name() == 'video/x-raw-yuv'
|
assert self.struct.get_name() == 'video/x-raw-yuv'
|
||||||
|
@ -102,9 +102,9 @@ class StructureTest(TestCase):
|
||||||
assert s['rlist'] == [([(['a', 'b'], ['c', 'd']),'e'], ['f', 'g']), 'h']
|
assert s['rlist'] == [([(['a', 'b'], ['c', 'd']),'e'], ['f', 'g']), 'h']
|
||||||
|
|
||||||
def testStructureChange(self):
|
def testStructureChange(self):
|
||||||
assert self.struct['framerate'] == 5.0
|
assert self.struct['framerate'] == gst.Fraction(5, 1)
|
||||||
self.struct['framerate'] = 10.0
|
self.struct['framerate'] = gst.Fraction(10, 1)
|
||||||
assert self.struct['framerate'] == 10.0
|
assert self.struct['framerate'] == gst.Fraction(10, 1)
|
||||||
self.struct['pixel-aspect-ratio'] = gst.Fraction(4, 2)
|
self.struct['pixel-aspect-ratio'] = gst.Fraction(4, 2)
|
||||||
assert self.struct['pixel-aspect-ratio'].num == 2
|
assert self.struct['pixel-aspect-ratio'].num == 2
|
||||||
assert self.struct['pixel-aspect-ratio'].denom == 1
|
assert self.struct['pixel-aspect-ratio'].denom == 1
|
||||||
|
|
Loading…
Reference in a new issue