summaryrefslogtreecommitdiffstats
path: root/dom/media/FrameStatistics.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/FrameStatistics.h')
-rw-r--r--dom/media/FrameStatistics.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/dom/media/FrameStatistics.h b/dom/media/FrameStatistics.h
new file mode 100644
index 000000000..e7d382629
--- /dev/null
+++ b/dom/media/FrameStatistics.h
@@ -0,0 +1,143 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+#ifndef FrameStatistics_h_
+#define FrameStatistics_h_
+
+#include "mozilla/ReentrantMonitor.h"
+
+namespace mozilla {
+
+struct FrameStatisticsData
+{
+ // Number of frames parsed and demuxed from media.
+ // Access protected by mReentrantMonitor.
+ uint64_t mParsedFrames = 0;
+
+ // Number of parsed frames which were actually decoded.
+ // Access protected by mReentrantMonitor.
+ uint64_t mDecodedFrames = 0;
+
+ // Number of decoded frames which were actually sent down the rendering
+ // pipeline to be painted ("presented"). Access protected by mReentrantMonitor.
+ uint64_t mPresentedFrames = 0;
+
+ // Number of frames that have been skipped because they have missed their
+ // composition deadline.
+ uint64_t mDroppedFrames = 0;
+
+ // Sum of all inter-keyframe segment durations, in microseconds.
+ // Dividing by count will give the average inter-keyframe time.
+ uint64_t mInterKeyframeSum_us = 0;
+ // Number of inter-keyframe segments summed so far.
+ size_t mInterKeyframeCount = 0;
+
+ // Maximum inter-keyframe segment duration, in microseconds.
+ uint64_t mInterKeyFrameMax_us = 0;
+
+ FrameStatisticsData() = default;
+ FrameStatisticsData(uint64_t aParsed, uint64_t aDecoded, uint64_t aDropped)
+ : mParsedFrames(aParsed)
+ , mDecodedFrames(aDecoded)
+ , mDroppedFrames(aDropped)
+ {}
+
+ void
+ Accumulate(const FrameStatisticsData& aStats)
+ {
+ mParsedFrames += aStats.mParsedFrames;
+ mDecodedFrames += aStats.mDecodedFrames;
+ mPresentedFrames += aStats.mPresentedFrames;
+ mDroppedFrames += aStats.mDroppedFrames;
+ mInterKeyframeSum_us += aStats.mInterKeyframeSum_us;
+ mInterKeyframeCount += aStats.mInterKeyframeCount;
+ // It doesn't make sense to add max numbers, instead keep the bigger one.
+ if (mInterKeyFrameMax_us < aStats.mInterKeyFrameMax_us) {
+ mInterKeyFrameMax_us = aStats.mInterKeyFrameMax_us;
+ }
+ }
+};
+
+// Frame decoding/painting related performance counters.
+// Threadsafe.
+class FrameStatistics
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(FrameStatistics);
+
+ FrameStatistics()
+ : mReentrantMonitor("FrameStats")
+ {}
+
+ // Returns a copy of all frame statistics data.
+ // Can be called on any thread.
+ FrameStatisticsData GetFrameStatisticsData() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData;
+ }
+
+ // Returns number of frames which have been parsed from the media.
+ // Can be called on any thread.
+ uint64_t GetParsedFrames() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData.mParsedFrames;
+ }
+
+ // Returns the number of parsed frames which have been decoded.
+ // Can be called on any thread.
+ uint64_t GetDecodedFrames() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData.mDecodedFrames;
+ }
+
+ // Returns the number of decoded frames which have been sent to the rendering
+ // pipeline for painting ("presented").
+ // Can be called on any thread.
+ uint64_t GetPresentedFrames() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData.mPresentedFrames;
+ }
+
+ // Returns the number of frames that have been skipped because they have
+ // missed their composition deadline.
+ uint64_t GetDroppedFrames() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData.mDroppedFrames;
+ }
+
+ // Increments the parsed and decoded frame counters by the passed in counts.
+ // Can be called on any thread.
+ void NotifyDecodedFrames(const FrameStatisticsData& aStats)
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ mFrameStatisticsData.Accumulate(aStats);
+ }
+
+ // Increments the presented frame counters.
+ // Can be called on any thread.
+ void NotifyPresentedFrame()
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ ++mFrameStatisticsData.mPresentedFrames;
+ }
+
+private:
+ ~FrameStatistics() {}
+
+ // ReentrantMonitor to protect access of playback statistics.
+ mutable ReentrantMonitor mReentrantMonitor;
+
+ FrameStatisticsData mFrameStatisticsData;
+};
+
+} // namespace mozilla
+
+#endif // FrameStatistics_h_