[WTF] Add a multiplication operator (and a few others) to MediaTime
[WebKit-https.git] / Source / WTF / wtf / MediaTime.cpp
index 4b2eee84ce897edf08bb60514c633b8adcb96e17..5821123275131139821922351c56e43b87865c87 100644 (file)
@@ -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())