From 9f0aad7b2e6ee80bd25296156a92232c32c9ee9e Mon Sep 17 00:00:00 2001 From: Chris Pearce Date: Wed, 4 Oct 2017 16:30:32 +0200 Subject: [PATCH] Bug 1405697 - Move MediaChannelStatistics to its own file. r=jwwang It currently resides in MediaResource.h, but it's only used in a ChannelMediaDecoder and ChannelMediaResource, so it doesn't need to be in the abstract header. MozReview-Commit-ID: GskE5mjMav1 --HG-- extra : rebase_source : b42321ddcb1966d4de7203f04852c14f6d271acd --- dom/media/ChannelMediaDecoder.h | 1 + dom/media/ChannelMediaResource.h | 1 + dom/media/MediaChannelStatistics.h | 90 ++++++++++++++++++++++++++++++ dom/media/MediaResource.h | 79 -------------------------- 4 files changed, 92 insertions(+), 79 deletions(-) create mode 100644 dom/media/MediaChannelStatistics.h diff --git a/dom/media/ChannelMediaDecoder.h b/dom/media/ChannelMediaDecoder.h index ce17b5abbe09..ee124dc7ed06 100644 --- a/dom/media/ChannelMediaDecoder.h +++ b/dom/media/ChannelMediaDecoder.h @@ -9,6 +9,7 @@ #include "MediaDecoder.h" #include "MediaResourceCallback.h" +#include "MediaChannelStatistics.h" class nsIChannel; class nsIStreamListener; diff --git a/dom/media/ChannelMediaResource.h b/dom/media/ChannelMediaResource.h index f8ee12248d16..c2aba575efa4 100644 --- a/dom/media/ChannelMediaResource.h +++ b/dom/media/ChannelMediaResource.h @@ -7,6 +7,7 @@ #define mozilla_dom_media_ChannelMediaResource_h #include "MediaResource.h" +#include "MediaChannelStatistics.h" namespace mozilla { diff --git a/dom/media/MediaChannelStatistics.h b/dom/media/MediaChannelStatistics.h new file mode 100644 index 000000000000..44ffcf8af942 --- /dev/null +++ b/dom/media/MediaChannelStatistics.h @@ -0,0 +1,90 @@ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* 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/. */ + +#if !defined(MediaChannelStatistics_h_) +#define MediaChannelStatistics_h_ + +namespace mozilla { + +// Number of bytes we have accumulated before we assume the connection download +// rate can be reliably calculated. 57 Segments at IW=3 allows slow start to +// reach a CWND of 30 (See bug 831998) +static const int64_t RELIABLE_DATA_THRESHOLD = 57 * 1460; + +/** + * This class is useful for estimating rates of data passing through + * some channel. The idea is that activity on the channel "starts" + * and "stops" over time. At certain times data passes through the + * channel (usually while the channel is active; data passing through + * an inactive channel is ignored). The GetRate() function computes + * an estimate of the "current rate" of the channel, which is some + * kind of average of the data passing through over the time the + * channel is active. + * + * All methods take "now" as a parameter so the user of this class can + * control the timeline used. + */ +class MediaChannelStatistics { +public: + MediaChannelStatistics() = default; + + MediaChannelStatistics(const MediaChannelStatistics&) = default; + + void Reset() { + mLastStartTime = TimeStamp(); + mAccumulatedTime = TimeDuration(0); + mAccumulatedBytes = 0; + mIsStarted = false; + } + void Start() { + if (mIsStarted) + return; + mLastStartTime = TimeStamp::Now(); + mIsStarted = true; + } + void Stop() { + if (!mIsStarted) + return; + mAccumulatedTime += TimeStamp::Now() - mLastStartTime; + mIsStarted = false; + } + void AddBytes(int64_t aBytes) { + if (!mIsStarted) { + // ignore this data, it may be related to seeking or some other + // operation we don't care about + return; + } + mAccumulatedBytes += aBytes; + } + double GetRateAtLastStop(bool* aReliable) { + double seconds = mAccumulatedTime.ToSeconds(); + *aReliable = (seconds >= 1.0) || + (mAccumulatedBytes >= RELIABLE_DATA_THRESHOLD); + if (seconds <= 0.0) + return 0.0; + return static_cast(mAccumulatedBytes)/seconds; + } + double GetRate(bool* aReliable) { + TimeDuration time = mAccumulatedTime; + if (mIsStarted) { + time += TimeStamp::Now() - mLastStartTime; + } + double seconds = time.ToSeconds(); + *aReliable = (seconds >= 3.0) || + (mAccumulatedBytes >= RELIABLE_DATA_THRESHOLD); + if (seconds <= 0.0) + return 0.0; + return static_cast(mAccumulatedBytes)/seconds; + } +private: + int64_t mAccumulatedBytes = 0; + TimeDuration mAccumulatedTime; + TimeStamp mLastStartTime; + bool mIsStarted = false; +}; + +} // namespace mozilla + +#endif // MediaChannelStatistics_h_ diff --git a/dom/media/MediaResource.h b/dom/media/MediaResource.h index bceec3814511..a47db3cc1d1e 100644 --- a/dom/media/MediaResource.h +++ b/dom/media/MediaResource.h @@ -38,90 +38,11 @@ static const int64_t SEEK_VS_READ_THRESHOLD = 1 * 1024 * 1024; static const uint32_t HTTP_REQUESTED_RANGE_NOT_SATISFIABLE_CODE = 416; -// Number of bytes we have accumulated before we assume the connection download -// rate can be reliably calculated. 57 Segments at IW=3 allows slow start to -// reach a CWND of 30 (See bug 831998) -static const int64_t RELIABLE_DATA_THRESHOLD = 57 * 1460; - class nsIHttpChannel; class nsIPrincipal; namespace mozilla { -class MediaChannelStatistics; - -/** - * This class is useful for estimating rates of data passing through - * some channel. The idea is that activity on the channel "starts" - * and "stops" over time. At certain times data passes through the - * channel (usually while the channel is active; data passing through - * an inactive channel is ignored). The GetRate() function computes - * an estimate of the "current rate" of the channel, which is some - * kind of average of the data passing through over the time the - * channel is active. - * - * All methods take "now" as a parameter so the user of this class can - * control the timeline used. - */ -class MediaChannelStatistics { -public: - MediaChannelStatistics() = default; - - MediaChannelStatistics(const MediaChannelStatistics&) = default; - - void Reset() { - mLastStartTime = TimeStamp(); - mAccumulatedTime = TimeDuration(0); - mAccumulatedBytes = 0; - mIsStarted = false; - } - void Start() { - if (mIsStarted) - return; - mLastStartTime = TimeStamp::Now(); - mIsStarted = true; - } - void Stop() { - if (!mIsStarted) - return; - mAccumulatedTime += TimeStamp::Now() - mLastStartTime; - mIsStarted = false; - } - void AddBytes(int64_t aBytes) { - if (!mIsStarted) { - // ignore this data, it may be related to seeking or some other - // operation we don't care about - return; - } - mAccumulatedBytes += aBytes; - } - double GetRateAtLastStop(bool* aReliable) { - double seconds = mAccumulatedTime.ToSeconds(); - *aReliable = (seconds >= 1.0) || - (mAccumulatedBytes >= RELIABLE_DATA_THRESHOLD); - if (seconds <= 0.0) - return 0.0; - return static_cast(mAccumulatedBytes)/seconds; - } - double GetRate(bool* aReliable) { - TimeDuration time = mAccumulatedTime; - if (mIsStarted) { - time += TimeStamp::Now() - mLastStartTime; - } - double seconds = time.ToSeconds(); - *aReliable = (seconds >= 3.0) || - (mAccumulatedBytes >= RELIABLE_DATA_THRESHOLD); - if (seconds <= 0.0) - return 0.0; - return static_cast(mAccumulatedBytes)/seconds; - } -private: - int64_t mAccumulatedBytes = 0; - TimeDuration mAccumulatedTime; - TimeStamp mLastStartTime; - bool mIsStarted = false; -}; - // Represents a section of contiguous media, with a start and end offset. // Used to denote ranges of data which are cached.