Audio::Timestamp VideoDecoder::FixedRateVideoTrack::getFrameTime(uint frame) const { // Try to get as accurate as possible, considering we have a fractional frame rate // (which Audio::Timestamp doesn't support). Common::Rational frameRate = getFrameRate(); // Try to keep it in terms of the frame rate, if the frame rate is a whole // number. if (frameRate.getDenominator() == 1) return Audio::Timestamp(0, frame, frameRate.toInt()); // Convert as best as possible Common::Rational time = frameRate.getInverse() * frame; return Audio::Timestamp(0, time.getNumerator(), time.getDenominator()); }
void Movie::setTime(const TimeValue time, const TimeScale scale) { if (_video) { // Don't go past the ends of the movie Common::Rational timeFrac = Common::Rational(time, ((scale == 0) ? getScale() : scale)); if (timeFrac < Common::Rational(_startTime, _startScale)) timeFrac = Common::Rational(_startTime, _startScale); else if (timeFrac >= Common::Rational(_stopTime, _stopScale)) return; _video->seek(Audio::Timestamp(0, timeFrac.getNumerator(), timeFrac.getDenominator())); _time = timeFrac; _lastMillis = 0; } }