diff options
Diffstat (limited to 'sound/timestamp.cpp')
-rw-r--r-- | sound/timestamp.cpp | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/sound/timestamp.cpp b/sound/timestamp.cpp index ad13d75c9f..3d9178da2b 100644 --- a/sound/timestamp.cpp +++ b/sound/timestamp.cpp @@ -36,17 +36,23 @@ static uint gcd(uint a, uint b) { return b; } -Timestamp::Timestamp(uint32 m, int framerate) : - _msecs(m), _framerate(framerate), _numberOfFrames(0) { - assert(_framerate > 0); +Timestamp::Timestamp(uint32 ms, int framerate) { + assert(framerate > 0); + + _secs = ms / 1000; + _framerateFactor = 1000 / gcd(1000, framerate); + _framerate = framerate * _framerateFactor; + + _numberOfFrames = (ms % 1000) * _framerate / 1000; } Timestamp Timestamp::convertToFramerate(int newFramerate) const { Timestamp ts(*this); - if (ts._framerate != newFramerate) { - ts._framerate = newFramerate; + if (ts.getFramerate() != newFramerate) { + ts._framerateFactor = 1000 / gcd(1000, newFramerate); + ts._framerate = newFramerate * ts._framerateFactor; const uint g = gcd(_framerate, ts._framerate); const uint p = _framerate / g; @@ -58,7 +64,7 @@ Timestamp Timestamp::convertToFramerate(int newFramerate) const { // round trip conversions. ts._numberOfFrames = (ts._numberOfFrames * q + p/2) / p; - ts._msecs += (ts._numberOfFrames / ts._framerate) * 1000; + ts._secs += (ts._numberOfFrames / ts._framerate); ts._numberOfFrames %= ts._framerate; } @@ -66,8 +72,8 @@ Timestamp Timestamp::convertToFramerate(int newFramerate) const { } bool Timestamp::operator==(const Timestamp &ts) const { - // TODO: Improve this - return (ts.msecs() == msecs()) && !frameDiff(ts); + return (ts._secs == _secs) && + (ts._numberOfFrames * _framerate == _numberOfFrames * ts._framerate); } bool Timestamp::operator!=(const Timestamp &ts) const { @@ -77,16 +83,19 @@ bool Timestamp::operator!=(const Timestamp &ts) const { Timestamp Timestamp::addFrames(int frames) const { Timestamp ts(*this); - ts._numberOfFrames += frames; + + // The frames are given in the original framerate, so we have to + // adjust by _framerateFactor accordingly. + ts._numberOfFrames += frames * _framerateFactor; if (ts._numberOfFrames < 0) { int secsub = 1 + (-ts._numberOfFrames / ts._framerate); ts._numberOfFrames += ts._framerate * secsub; - ts._msecs -= secsub * 1000; + ts._secs -= secsub; } - ts._msecs += (ts._numberOfFrames / ts._framerate) * 1000; + ts._secs += (ts._numberOfFrames / ts._framerate); ts._numberOfFrames %= ts._framerate; return ts; @@ -94,15 +103,16 @@ Timestamp Timestamp::addFrames(int frames) const { Timestamp Timestamp::addMsecs(int ms) const { Timestamp ts(*this); - ts._msecs += ms; - return ts; + ts._secs += ms / 1000; + // Add the remaining frames. Note that _framerate is always divisible by 1000. + return ts.addFrames((ms % 1000) * (_framerate / 1000)); } int Timestamp::frameDiff(const Timestamp &ts) const { int delta = 0; - if (_msecs != ts._msecs) - delta = (long(_msecs) - long(ts._msecs)) * _framerate / 1000; + if (_secs != ts._secs) + delta = (long(_secs) - long(ts._secs)) * _framerate; delta += _numberOfFrames; @@ -119,7 +129,7 @@ int Timestamp::frameDiff(const Timestamp &ts) const { delta -= (ts._numberOfFrames * p + q/2) / q; } - return delta; + return delta / _framerateFactor; } int Timestamp::msecsDiff(const Timestamp &ts) const { @@ -127,7 +137,7 @@ int Timestamp::msecsDiff(const Timestamp &ts) const { } uint32 Timestamp::msecs() const { - return _msecs + _numberOfFrames * 1000L / _framerate; + return _secs * 1000 + _numberOfFrames / (_framerate / 1000); } |