content/media/StreamBuffer.cpp

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:a7822701593e
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/. */
5
6 #include "StreamBuffer.h"
7 #include "prlog.h"
8 #include <algorithm>
9
10 namespace mozilla {
11
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
18
19 #ifdef DEBUG
20 void
21 StreamBuffer::DumpTrackInfo() const
22 {
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()));
31 }
32 }
33 }
34 #endif
35
36 StreamTime
37 StreamBuffer::GetEnd() const
38 {
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());
44 }
45 }
46 return t;
47 }
48
49 StreamTime
50 StreamBuffer::GetAllTracksEnd() const
51 {
52 if (mTracksKnownTime < STREAM_TIME_MAX) {
53 // A track might be added.
54 return STREAM_TIME_MAX;
55 }
56 StreamTime t = 0;
57 for (uint32_t i = 0; i < mTracks.Length(); ++i) {
58 Track* track = mTracks[i];
59 if (!track->IsEnded()) {
60 return STREAM_TIME_MAX;
61 }
62 t = std::max(t, track->GetEndTimeRoundDown());
63 }
64 return t;
65 }
66
67 StreamBuffer::Track*
68 StreamBuffer::FindTrack(TrackID aID)
69 {
70 if (aID == TRACK_NONE)
71 return nullptr;
72 for (uint32_t i = 0; i < mTracks.Length(); ++i) {
73 Track* track = mTracks[i];
74 if (track->GetID() == aID) {
75 return track;
76 }
77 }
78 return nullptr;
79 }
80
81 void
82 StreamBuffer::ForgetUpTo(StreamTime aTime)
83 {
84 // Round to nearest 50ms so we don't spend too much time pruning segments.
85 const MediaTime roundTo = MillisecondsToMediaTime(50);
86 StreamTime forget = (aTime/roundTo)*roundTo;
87 if (forget <= mForgottenTime) {
88 return;
89 }
90 mForgottenTime = forget;
91
92 for (uint32_t i = 0; i < mTracks.Length(); ++i) {
93 Track* track = mTracks[i];
94 if (track->IsEnded() && track->GetEndTimeRoundDown() <= forget) {
95 mTracks.RemoveElementAt(i);
96 --i;
97 continue;
98 }
99 TrackTicks forgetTo = std::min(track->GetEnd() - 1, track->TimeToTicksRoundDown(forget));
100 track->ForgetUpTo(forgetTo);
101 }
102 }
103
104 }

mercurial