diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /dom/media/StreamTracks.cpp | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'dom/media/StreamTracks.cpp')
-rw-r--r-- | dom/media/StreamTracks.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/dom/media/StreamTracks.cpp b/dom/media/StreamTracks.cpp new file mode 100644 index 000000000..b05d14a12 --- /dev/null +++ b/dom/media/StreamTracks.cpp @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "StreamTracks.h" +#include "mozilla/Logging.h" +#include <algorithm> + +namespace mozilla { + +extern LazyLogModule gMediaStreamGraphLog; +#define STREAM_LOG(type, msg) MOZ_LOG(gMediaStreamGraphLog, type, msg) + +#ifdef DEBUG +void +StreamTracks::DumpTrackInfo() const +{ + STREAM_LOG(LogLevel::Info, ("DumpTracks: mTracksKnownTime %lld", mTracksKnownTime)); + for (uint32_t i = 0; i < mTracks.Length(); ++i) { + Track* track = mTracks[i]; + if (track->IsEnded()) { + STREAM_LOG(LogLevel::Info, ("Track[%d] %d: ended", i, track->GetID())); + } else { + STREAM_LOG(LogLevel::Info, ("Track[%d] %d: %lld", i, track->GetID(), + track->GetEnd())); + } + } +} +#endif + +StreamTime +StreamTracks::GetEnd() const +{ + StreamTime t = mTracksKnownTime; + for (uint32_t i = 0; i < mTracks.Length(); ++i) { + Track* track = mTracks[i]; + if (!track->IsEnded()) { + t = std::min(t, track->GetEnd()); + } + } + return t; +} + +StreamTime +StreamTracks::GetAllTracksEnd() const +{ + if (mTracksKnownTime < STREAM_TIME_MAX) { + // A track might be added. + return STREAM_TIME_MAX; + } + StreamTime t = 0; + for (uint32_t i = 0; i < mTracks.Length(); ++i) { + Track* track = mTracks[i]; + if (!track->IsEnded()) { + return STREAM_TIME_MAX; + } + t = std::max(t, track->GetEnd()); + } + return t; +} + +StreamTracks::Track* +StreamTracks::FindTrack(TrackID aID) +{ + if (aID == TRACK_NONE || mTracks.IsEmpty()) { + return nullptr; + } + + // The tracks are sorted by ID. We can use a binary search. + + uint32_t left = 0, right = mTracks.Length() - 1; + while (left <= right) { + uint32_t middle = (left + right) / 2; + if (mTracks[middle]->GetID() == aID) { + return mTracks[middle]; + } + + if (mTracks[middle]->GetID() > aID) { + if (middle == 0) { + break; + } + + right = middle - 1; + } else { + left = middle + 1; + } + } + + return nullptr; +} + +void +StreamTracks::ForgetUpTo(StreamTime aTime) +{ + // Only prune if there is a reasonable chunk (50ms @ 48kHz) to forget, so we + // don't spend too much time pruning segments. + const StreamTime minChunkSize = 2400; + if (aTime < mForgottenTime + minChunkSize) { + return; + } + mForgottenTime = aTime; + + for (uint32_t i = 0; i < mTracks.Length(); ++i) { + Track* track = mTracks[i]; + StreamTime forgetTo = std::min(track->GetEnd() - 1, aTime); + track->ForgetUpTo(forgetTo); + } +} + +void +StreamTracks::Clear() +{ + mTracks.Clear(); +} + +} // namespace mozilla |