Backed out 35 changesets (bug 941158, bug 972518, bug 959520, bug 986063, bug 948895...
[gecko.git] / content / media / StreamBuffer.cpp
blob51d5f0d2ffd43258b707e92912c457e7fcb888f6
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
4 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "StreamBuffer.h"
7 #include "prlog.h"
8 #include <algorithm>
10 namespace mozilla {
12 #ifdef PR_LOGGING
13 extern PRLogModuleInfo* gMediaStreamGraphLog;
14 #define STREAM_LOG(type, msg) PR_LOG(gMediaStreamGraphLog, type, msg)
15 #else
16 #define STREAM_LOG(type, msg)
17 #endif
19 #ifdef DEBUG
20 void
21 StreamBuffer::DumpTrackInfo() const
23 STREAM_LOG(PR_LOG_ALWAYS, ("DumpTracks: mTracksKnownTime %lld", mTracksKnownTime));
24 for (uint32_t i = 0; i < mTracks.Length(); ++i) {
25 Track* track = mTracks[i];
26 if (track->IsEnded()) {
27 STREAM_LOG(PR_LOG_ALWAYS, ("Track[%d] %d: ended", i, track->GetID()));
28 } else {
29 STREAM_LOG(PR_LOG_ALWAYS, ("Track[%d] %d: %lld", i, track->GetID(),
30 track->GetEndTimeRoundDown()));
34 #endif
36 StreamTime
37 StreamBuffer::GetEnd() const
39 StreamTime t = mTracksKnownTime;
40 for (uint32_t i = 0; i < mTracks.Length(); ++i) {
41 Track* track = mTracks[i];
42 if (!track->IsEnded()) {
43 t = std::min(t, track->GetEndTimeRoundDown());
46 return t;
49 StreamBuffer::Track*
50 StreamBuffer::FindTrack(TrackID aID)
52 if (aID == TRACK_NONE)
53 return nullptr;
54 for (uint32_t i = 0; i < mTracks.Length(); ++i) {
55 Track* track = mTracks[i];
56 if (track->GetID() == aID) {
57 return track;
60 return nullptr;
63 void
64 StreamBuffer::ForgetUpTo(StreamTime aTime)
66 // Round to nearest 50ms so we don't spend too much time pruning segments.
67 const MediaTime roundTo = MillisecondsToMediaTime(50);
68 StreamTime forget = (aTime/roundTo)*roundTo;
69 if (forget <= mForgottenTime) {
70 return;
72 mForgottenTime = forget;
74 for (uint32_t i = 0; i < mTracks.Length(); ++i) {
75 Track* track = mTracks[i];
76 if (track->IsEnded() && track->GetEndTimeRoundDown() <= forget) {
77 mTracks.RemoveElementAt(i);
78 --i;
79 continue;
81 TrackTicks forgetTo = std::min(track->GetEnd() - 1, track->TimeToTicksRoundDown(forget));
82 track->ForgetUpTo(forgetTo);