gecko/content/media/StreamBuffer.cpp
Robert O'Callahan 925835b996 Bug 779715. Part 1: Add basic support for ProcessedMediaStreams. r=jesup
The main thing this patch does is to add ProcessedMediaStream objects and
MediaInputPorts connecting streams. ProcessedMediaStreams are an abstract
class that doesn't constrain what processing is actually performed, except
that for now we assume a stream's processing depends only on its inputs
window of data between mCurrentTime and mStateComputedTime.
This patch reorganizes the way the blocking status of each stream is computed.
The streams are partitioned into groups so that every stream which can affect
the blocking status of another stream is in the same group as that other stream.
We also add a pass to order the streams by dependency so we can process the streams
in order of dependency; this pass also identifies the streams that form part of a
cycle.

--HG--
extra : rebase_source : c45c931a264e73f295642a934500bbeaa6448774
2012-08-01 00:17:21 +12:00

61 lines
1.5 KiB
C++

/* -*- 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 "StreamBuffer.h"
namespace mozilla {
StreamTime
StreamBuffer::GetEnd() const
{
StreamTime t = mTracksKnownTime;
for (PRUint32 i = 0; i < mTracks.Length(); ++i) {
Track* track = mTracks[i];
if (!track->IsEnded()) {
t = NS_MIN(t, track->GetEndTimeRoundDown());
}
}
return t;
}
StreamBuffer::Track*
StreamBuffer::FindTrack(TrackID aID)
{
if (aID == TRACK_NONE)
return nullptr;
for (PRUint32 i = 0; i < mTracks.Length(); ++i) {
Track* track = mTracks[i];
if (track->GetID() == aID) {
return track;
}
}
return nullptr;
}
void
StreamBuffer::ForgetUpTo(StreamTime aTime)
{
// Round to nearest 50ms so we don't spend too much time pruning segments.
const MediaTime roundTo = MillisecondsToMediaTime(50);
StreamTime forget = (aTime/roundTo)*roundTo;
if (forget <= mForgottenTime) {
return;
}
mForgottenTime = forget;
for (PRUint32 i = 0; i < mTracks.Length(); ++i) {
Track* track = mTracks[i];
if (track->IsEnded() && track->GetEndTimeRoundDown() <= forget) {
mTracks.RemoveElementAt(i);
--i;
continue;
}
TrackTicks forgetTo = NS_MIN(track->GetEnd() - 1, track->TimeToTicksRoundDown(forget));
track->ForgetUpTo(forgetTo);
}
}
}