|
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 } |