mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
AUDIO: Forbid adding timestamps with differing framerate
We used to allow this, but the result is a timestamp with a framerate potentially different from that of both original timestamps, which can lead to completely unexpected behavior. For example, consider this code snippet: a = a + b; a = a.addFrames(1); // frame rate changed! svn-id: r55840
This commit is contained in:
+2
-32
@@ -148,21 +148,9 @@ Timestamp Timestamp::addMsecs(int ms) const {
|
||||
}
|
||||
|
||||
void Timestamp::addIntern(const Timestamp &ts) {
|
||||
assert(_framerate == ts._framerate);
|
||||
_secs += ts._secs;
|
||||
|
||||
if (_framerate == ts._framerate) {
|
||||
_numFrames += ts._numFrames;
|
||||
} else {
|
||||
// We need to multiply by the quotient of the two framerates.
|
||||
// We cancel the GCD in this fraction to reduce the risk of
|
||||
// overflows.
|
||||
const uint g = Common::gcd(_framerate, ts._framerate);
|
||||
const uint p = _framerate / g;
|
||||
const uint q = ts._framerate / g;
|
||||
|
||||
_framerate *= q;
|
||||
_numFrames = _numFrames * q + ts._numFrames * p;
|
||||
}
|
||||
_numFrames += ts._numFrames;
|
||||
|
||||
normalize();
|
||||
}
|
||||
@@ -187,24 +175,6 @@ Timestamp Timestamp::operator-(const Timestamp &ts) const {
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
Timestamp &Timestamp::operator+=(const Timestamp &ts) {
|
||||
addIntern(ts);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Timestamp &Timestamp::operator-=(const Timestamp &ts) {
|
||||
addIntern(-ts);
|
||||
return *this;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
int Timestamp::frameDiff(const Timestamp &ts) const {
|
||||
return (*this - ts).totalNumberOfFrames();
|
||||
}
|
||||
*/
|
||||
|
||||
int Timestamp::frameDiff(const Timestamp &ts) const {
|
||||
|
||||
int delta = 0;
|
||||
|
||||
+9
-3
@@ -126,11 +126,17 @@ public:
|
||||
// unary minus
|
||||
Timestamp operator-() const;
|
||||
|
||||
/**
|
||||
* Compute the sum of two timestamps. This is only
|
||||
* allowed if they use the same framerate.
|
||||
*/
|
||||
Timestamp operator+(const Timestamp &ts) const;
|
||||
Timestamp operator-(const Timestamp &ts) const;
|
||||
|
||||
// Timestamp &operator+=(const Timestamp &ts);
|
||||
// Timestamp &operator-=(const Timestamp &ts);
|
||||
/**
|
||||
* Compute the difference between two timestamps. This is only
|
||||
* allowed if they use the same framerate.
|
||||
*/
|
||||
Timestamp operator-(const Timestamp &ts) const;
|
||||
|
||||
/**
|
||||
* Computes the number of frames between this timestamp and ts.
|
||||
|
||||
Reference in New Issue
Block a user