From 83c3dc91904a0c0aed75168456fa65f7e99c8bfa Mon Sep 17 00:00:00 2001 From: "jer.noble@apple.com" Date: Fri, 25 Oct 2013 07:13:59 +0000 Subject: [PATCH] [WTF] Add a multiplication operator (and a few others) to MediaTime https://bugs.webkit.org/show_bug.cgi?id=123137 Reviewed by Eric Carlson. Source/WTF: Add a multiplication operator and an inequality operator to the MediaTime class for use by MSE. * wtf/MediaTime.cpp: (WTF::signum): Moved to top of file. (WTF::MediaTime::operator*): Added. (WTF::MediaTime::operator!=): Added. * wtf/MediaTime.h: (WTF::operator*): Added non-class version of operator*. Tools: Add tests for new MediaTime operators. * TestWebKitAPI/Tests/WTF/MediaTime.cpp: (TestWebKitAPI::TEST): git-svn-id: https://svn.webkit.org/repository/webkit/trunk@157992 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Source/WTF/ChangeLog | 17 +++++++ Source/WTF/wtf/MediaTime.cpp | 49 ++++++++++++++++++--- Source/WTF/wtf/MediaTime.h | 10 ++++- Tools/ChangeLog | 12 +++++ Tools/TestWebKitAPI/Tests/WTF/MediaTime.cpp | 23 ++++++++++ 5 files changed, 104 insertions(+), 7 deletions(-) diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog index b3c57db50b81..716ab3aba7d6 100644 --- a/Source/WTF/ChangeLog +++ b/Source/WTF/ChangeLog @@ -1,3 +1,20 @@ +2013-10-25 Jer Noble + + [WTF] Add a multiplication operator (and a few others) to MediaTime + https://bugs.webkit.org/show_bug.cgi?id=123137 + + Reviewed by Eric Carlson. + + Add a multiplication operator and an inequality operator to the + MediaTime class for use by MSE. + + * wtf/MediaTime.cpp: + (WTF::signum): Moved to top of file. + (WTF::MediaTime::operator*): Added. + (WTF::MediaTime::operator!=): Added. + * wtf/MediaTime.h: + (WTF::operator*): Added non-class version of operator*. + 2013-10-24 Jer Noble [Mac] Add helper methods to convert CMTime <--> MediaTime diff --git a/Source/WTF/wtf/MediaTime.cpp b/Source/WTF/wtf/MediaTime.cpp index 4b2eee84ce89..582112327513 100644 --- a/Source/WTF/wtf/MediaTime.cpp +++ b/Source/WTF/wtf/MediaTime.cpp @@ -54,6 +54,11 @@ static int32_t leastCommonMultiple(int32_t a, int32_t b, int32_t &result) return safeMultiply(a, b / greatestCommonDivisor(a, b), result); } +static int32_t signum(int64_t val) +{ + return (0 < val) - (val < 0); +} + const int32_t MediaTime::MaximumTimeScale = 0x7fffffffL; MediaTime::MediaTime() @@ -215,6 +220,40 @@ MediaTime MediaTime::operator-(const MediaTime& rhs) const return a; } +MediaTime MediaTime::operator*(int32_t rhs) const +{ + if (isInvalid()) + return invalidTime(); + + if (isIndefinite()) + return indefiniteTime(); + + if (!rhs) + return zeroTime(); + + if (isPositiveInfinite()) { + if (rhs > 0) + return positiveInfiniteTime(); + return negativeInfiniteTime(); + } + + if (isNegativeInfinite()) { + if (rhs > 0) + return negativeInfiniteTime(); + return positiveInfiniteTime(); + } + + MediaTime a = *this; + + while (!safeMultiply(a.m_timeValue, rhs, a.m_timeValue)) { + if (a.m_timeScale == 1) + return signum(a.m_timeValue) == signum(rhs) ? positiveInfiniteTime() : negativeInfiniteTime(); + a.setTimeScale(a.m_timeScale / 2); + } + + return a; +} + bool MediaTime::operator<(const MediaTime& rhs) const { return compare(rhs) == LessThan; @@ -225,6 +264,11 @@ bool MediaTime::operator>(const MediaTime& rhs) const return compare(rhs) == GreaterThan; } +bool MediaTime::operator!=(const MediaTime& rhs) const +{ + return compare(rhs) != EqualTo; +} + bool MediaTime::operator==(const MediaTime& rhs) const { return compare(rhs) == EqualTo; @@ -332,11 +376,6 @@ void MediaTime::setTimeScale(int32_t timeScale) m_timeScale = timeScale; } -static int32_t signum(int64_t val) -{ - return (0 < val) - (val < 0); -} - MediaTime abs(const MediaTime& rhs) { if (rhs.isInvalid()) diff --git a/Source/WTF/wtf/MediaTime.h b/Source/WTF/wtf/MediaTime.h index 48af164d985c..36764ad9e4d4 100644 --- a/Source/WTF/wtf/MediaTime.h +++ b/Source/WTF/wtf/MediaTime.h @@ -26,8 +26,8 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef MediaTime_h -#define MediaTime_h +#ifndef WTF_MediaTime_h +#define WTF_MediaTime_h #include @@ -61,10 +61,14 @@ public: double toDouble() const; MediaTime& operator=(const MediaTime& rhs); + MediaTime& operator+=(const MediaTime& rhs) { return *this = *this + rhs; } + MediaTime& operator-=(const MediaTime& rhs) { return *this = *this - rhs; } MediaTime operator+(const MediaTime& rhs) const; MediaTime operator-(const MediaTime& rhs) const; + MediaTime operator*(int32_t) const; bool operator<(const MediaTime& rhs) const; bool operator>(const MediaTime& rhs) const; + bool operator!=(const MediaTime& rhs) const; bool operator==(const MediaTime& rhs) const; bool operator>=(const MediaTime& rhs) const; bool operator<=(const MediaTime& rhs) const; @@ -105,6 +109,8 @@ private: uint32_t m_timeFlags; }; +inline MediaTime operator*(int32_t lhs, const MediaTime& rhs) { return rhs.operator*(lhs); } + WTF_EXPORT_PRIVATE extern MediaTime abs(const MediaTime& rhs); } diff --git a/Tools/ChangeLog b/Tools/ChangeLog index 03cbb5e713d3..662aa435de3e 100644 --- a/Tools/ChangeLog +++ b/Tools/ChangeLog @@ -1,3 +1,15 @@ +2013-10-25 Jer Noble + + [WTF] Add a multiplication operator (and a few others) to MediaTime + https://bugs.webkit.org/show_bug.cgi?id=123137 + + Reviewed by Eric Carlson. + + Add tests for new MediaTime operators. + + * TestWebKitAPI/Tests/WTF/MediaTime.cpp: + (TestWebKitAPI::TEST): + 2013-10-24 Mark Rowe Remove references to OS X 10.7 from Xcode configuration settings. diff --git a/Tools/TestWebKitAPI/Tests/WTF/MediaTime.cpp b/Tools/TestWebKitAPI/Tests/WTF/MediaTime.cpp index d6d48fc610ca..2dfcae82a3d0 100644 --- a/Tools/TestWebKitAPI/Tests/WTF/MediaTime.cpp +++ b/Tools/TestWebKitAPI/Tests/WTF/MediaTime.cpp @@ -71,12 +71,17 @@ TEST(WTF, MediaTime) EXPECT_EQ(MediaTime::negativeInfiniteTime() < MediaTime::positiveInfiniteTime(), true); EXPECT_EQ(MediaTime::negativeInfiniteTime() == MediaTime::negativeInfiniteTime(), true); EXPECT_EQ(MediaTime::positiveInfiniteTime() == MediaTime::positiveInfiniteTime(), true); + EXPECT_EQ(MediaTime::positiveInfiniteTime() != MediaTime::negativeInfiniteTime(), true); EXPECT_EQ(MediaTime::invalidTime() == MediaTime::invalidTime(), true); + EXPECT_EQ(MediaTime::invalidTime() != MediaTime::invalidTime(), false); + EXPECT_EQ(MediaTime::invalidTime() != MediaTime::zeroTime(), true); EXPECT_EQ(MediaTime::invalidTime() > MediaTime::negativeInfiniteTime(), true); EXPECT_EQ(MediaTime::invalidTime() > MediaTime::positiveInfiniteTime(), true); EXPECT_EQ(MediaTime::negativeInfiniteTime() < MediaTime::invalidTime(), true); EXPECT_EQ(MediaTime::positiveInfiniteTime() < MediaTime::invalidTime(), true); EXPECT_EQ(MediaTime::indefiniteTime() == MediaTime::indefiniteTime(), true); + EXPECT_EQ(MediaTime::indefiniteTime() != MediaTime::indefiniteTime(), false); + EXPECT_EQ(MediaTime::indefiniteTime() != MediaTime::zeroTime(), true); EXPECT_EQ(MediaTime::indefiniteTime() > MediaTime::negativeInfiniteTime(), true); EXPECT_EQ(MediaTime::indefiniteTime() < MediaTime::positiveInfiniteTime(), true); EXPECT_EQ(MediaTime::negativeInfiniteTime() < MediaTime::indefiniteTime(), true); @@ -85,6 +90,7 @@ TEST(WTF, MediaTime) EXPECT_EQ(MediaTime::indefiniteTime() > MediaTime(1, 1), true); EXPECT_EQ(MediaTime(1, 1) < MediaTime(2, 1), true); EXPECT_EQ(MediaTime(2, 1) > MediaTime(1, 1), true); + EXPECT_EQ(MediaTime(1, 1) != MediaTime(2, 1), true); EXPECT_EQ(MediaTime(2, 1) == MediaTime(2, 1), true); EXPECT_EQ(MediaTime(2, 1) == MediaTime(4, 2), true); @@ -122,6 +128,23 @@ TEST(WTF, MediaTime) EXPECT_EQ(MediaTime(1, 2) - MediaTime(1, 3), MediaTime(1, 6)); EXPECT_EQ(MediaTime(2, numeric_limits::max()-1) - MediaTime(1, numeric_limits::max()-2), MediaTime(1, numeric_limits::max())); + // Multiplication Operators + EXPECT_EQ(MediaTime::positiveInfiniteTime(), MediaTime::positiveInfiniteTime() * 2); + EXPECT_EQ(MediaTime::negativeInfiniteTime(), MediaTime::negativeInfiniteTime() * 2); + EXPECT_EQ(MediaTime::negativeInfiniteTime(), MediaTime::positiveInfiniteTime() * -2); + EXPECT_EQ(MediaTime::positiveInfiniteTime(), MediaTime::negativeInfiniteTime() * -2); + EXPECT_EQ(MediaTime::invalidTime(), MediaTime::invalidTime() * 2); + EXPECT_EQ(MediaTime::invalidTime(), MediaTime::invalidTime() * -2); + EXPECT_EQ(MediaTime::indefiniteTime(), MediaTime::indefiniteTime() * 2); + EXPECT_EQ(MediaTime::indefiniteTime(), MediaTime::indefiniteTime() * -2); + EXPECT_EQ(MediaTime(6, 1), MediaTime(3, 1) * 2); + EXPECT_EQ(MediaTime(0, 1), MediaTime(0, 1) * 2); + EXPECT_EQ(MediaTime(int64_t(1) << 60, 1), MediaTime(int64_t(1) << 60, 2) * 2); + EXPECT_EQ(MediaTime::positiveInfiniteTime(), MediaTime(numeric_limits::max(), 1) * 2); + EXPECT_EQ(MediaTime::positiveInfiniteTime(), MediaTime(numeric_limits::min(), 1) * -2); + EXPECT_EQ(MediaTime::negativeInfiniteTime(), MediaTime(numeric_limits::max(), 1) * -2); + EXPECT_EQ(MediaTime::negativeInfiniteTime(), MediaTime(numeric_limits::min(), 1) * 2); + // Constants EXPECT_EQ(MediaTime::zeroTime(), MediaTime(0, 1)); EXPECT_EQ(MediaTime::invalidTime(), MediaTime(-1, 1, 0)); -- 2.36.0