1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/media/StreamBuffer.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,104 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.7 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "StreamBuffer.h" 1.10 +#include "prlog.h" 1.11 +#include <algorithm> 1.12 + 1.13 +namespace mozilla { 1.14 + 1.15 +#ifdef PR_LOGGING 1.16 +extern PRLogModuleInfo* gMediaStreamGraphLog; 1.17 +#define STREAM_LOG(type, msg) PR_LOG(gMediaStreamGraphLog, type, msg) 1.18 +#else 1.19 +#define STREAM_LOG(type, msg) 1.20 +#endif 1.21 + 1.22 +#ifdef DEBUG 1.23 +void 1.24 +StreamBuffer::DumpTrackInfo() const 1.25 +{ 1.26 + STREAM_LOG(PR_LOG_ALWAYS, ("DumpTracks: mTracksKnownTime %lld", mTracksKnownTime)); 1.27 + for (uint32_t i = 0; i < mTracks.Length(); ++i) { 1.28 + Track* track = mTracks[i]; 1.29 + if (track->IsEnded()) { 1.30 + STREAM_LOG(PR_LOG_ALWAYS, ("Track[%d] %d: ended", i, track->GetID())); 1.31 + } else { 1.32 + STREAM_LOG(PR_LOG_ALWAYS, ("Track[%d] %d: %lld", i, track->GetID(), 1.33 + track->GetEndTimeRoundDown())); 1.34 + } 1.35 + } 1.36 +} 1.37 +#endif 1.38 + 1.39 +StreamTime 1.40 +StreamBuffer::GetEnd() const 1.41 +{ 1.42 + StreamTime t = mTracksKnownTime; 1.43 + for (uint32_t i = 0; i < mTracks.Length(); ++i) { 1.44 + Track* track = mTracks[i]; 1.45 + if (!track->IsEnded()) { 1.46 + t = std::min(t, track->GetEndTimeRoundDown()); 1.47 + } 1.48 + } 1.49 + return t; 1.50 +} 1.51 + 1.52 +StreamTime 1.53 +StreamBuffer::GetAllTracksEnd() const 1.54 +{ 1.55 + if (mTracksKnownTime < STREAM_TIME_MAX) { 1.56 + // A track might be added. 1.57 + return STREAM_TIME_MAX; 1.58 + } 1.59 + StreamTime t = 0; 1.60 + for (uint32_t i = 0; i < mTracks.Length(); ++i) { 1.61 + Track* track = mTracks[i]; 1.62 + if (!track->IsEnded()) { 1.63 + return STREAM_TIME_MAX; 1.64 + } 1.65 + t = std::max(t, track->GetEndTimeRoundDown()); 1.66 + } 1.67 + return t; 1.68 +} 1.69 + 1.70 +StreamBuffer::Track* 1.71 +StreamBuffer::FindTrack(TrackID aID) 1.72 +{ 1.73 + if (aID == TRACK_NONE) 1.74 + return nullptr; 1.75 + for (uint32_t i = 0; i < mTracks.Length(); ++i) { 1.76 + Track* track = mTracks[i]; 1.77 + if (track->GetID() == aID) { 1.78 + return track; 1.79 + } 1.80 + } 1.81 + return nullptr; 1.82 +} 1.83 + 1.84 +void 1.85 +StreamBuffer::ForgetUpTo(StreamTime aTime) 1.86 +{ 1.87 + // Round to nearest 50ms so we don't spend too much time pruning segments. 1.88 + const MediaTime roundTo = MillisecondsToMediaTime(50); 1.89 + StreamTime forget = (aTime/roundTo)*roundTo; 1.90 + if (forget <= mForgottenTime) { 1.91 + return; 1.92 + } 1.93 + mForgottenTime = forget; 1.94 + 1.95 + for (uint32_t i = 0; i < mTracks.Length(); ++i) { 1.96 + Track* track = mTracks[i]; 1.97 + if (track->IsEnded() && track->GetEndTimeRoundDown() <= forget) { 1.98 + mTracks.RemoveElementAt(i); 1.99 + --i; 1.100 + continue; 1.101 + } 1.102 + TrackTicks forgetTo = std::min(track->GetEnd() - 1, track->TimeToTicksRoundDown(forget)); 1.103 + track->ForgetUpTo(forgetTo); 1.104 + } 1.105 +} 1.106 + 1.107 +}