int64_t WaveReader::TimeToBytes(double aTime) const { MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(aTime >= 0.0f, "Must be >= 0"); return RoundDownToFrame(int64_t(aTime * mSampleRate * mFrameSize)); }
nsresult WaveReader::Seek(int64_t aTarget, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) { NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); LOG(PR_LOG_DEBUG, ("%p About to seek to %lld", mDecoder, aTarget)); if (NS_FAILED(ResetDecode())) { return NS_ERROR_FAILURE; } double d = BytesToTime(GetDataLength()); NS_ASSERTION(d < INT64_MAX / USECS_PER_S, "Duration overflow"); int64_t duration = static_cast<int64_t>(d * USECS_PER_S); double seekTime = NS_MIN(aTarget, duration) / static_cast<double>(USECS_PER_S); int64_t position = RoundDownToFrame(static_cast<int64_t>(TimeToBytes(seekTime))); NS_ASSERTION(INT64_MAX - mWavePCMOffset > position, "Integer overflow during wave seek"); position += mWavePCMOffset; return mDecoder->GetResource()->Seek(nsISeekableStream::NS_SEEK_SET, position); }
nsRefPtr<MediaDecoderReader::SeekPromise> WaveReader::Seek(int64_t aTarget, int64_t aEndTime) { MOZ_ASSERT(OnTaskQueue()); LOG(LogLevel::Debug, ("%p About to seek to %lld", mDecoder, aTarget)); if (NS_FAILED(ResetDecode())) { return SeekPromise::CreateAndReject(NS_ERROR_FAILURE, __func__); } double d = BytesToTime(GetDataLength()); NS_ASSERTION(d < INT64_MAX / USECS_PER_S, "Duration overflow"); int64_t duration = static_cast<int64_t>(d * USECS_PER_S); double seekTime = std::min(aTarget, duration) / static_cast<double>(USECS_PER_S); int64_t position = RoundDownToFrame(static_cast<int64_t>(TimeToBytes(seekTime))); NS_ASSERTION(INT64_MAX - mWavePCMOffset > position, "Integer overflow during wave seek"); position += mWavePCMOffset; nsresult res = mDecoder->GetResource()->Seek(nsISeekableStream::NS_SEEK_SET, position); if (NS_FAILED(res)) { return SeekPromise::CreateAndReject(res, __func__); } else { return SeekPromise::CreateAndResolve(aTarget, __func__); } }
int64_t WaveReader::TimeToBytes(double aTime) const { NS_ABORT_IF_FALSE(aTime >= 0.0f, "Must be >= 0"); return RoundDownToFrame(int64_t(aTime * mSampleRate * mFrameSize)); }