diff options
Diffstat (limited to 'dom/media/Latency.h')
-rw-r--r-- | dom/media/Latency.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/dom/media/Latency.h b/dom/media/Latency.h new file mode 100644 index 000000000..b86ee7b54 --- /dev/null +++ b/dom/media/Latency.h @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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/. */ + +#ifndef MOZILLA_LATENCY_H +#define MOZILLA_LATENCY_H + +#include "mozilla/TimeStamp.h" +#include "mozilla/Logging.h" +#include "nsCOMPtr.h" +#include "nsIThread.h" +#include "mozilla/Monitor.h" +#include "nsISupportsImpl.h" +#include "nsIObserver.h" + +class AsyncLatencyLogger; + +mozilla::LogModule* GetLatencyLog(); + +// This class is a singleton. It is refcounted. +class AsyncLatencyLogger : public nsIObserver +{ + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_NSIOBSERVER + +public: + + enum LatencyLogIndex { + AudioMediaStreamTrack = 0, + VideoMediaStreamTrack, + Cubeb, + AudioStream, + NetEQ, + AudioCaptureBase, // base time for capturing an audio stream + AudioCapture, // records number of samples captured and the time + AudioTrackInsertion, // # of samples inserted into a mediastreamtrack and the time + MediaPipelineAudioInsertion, // Timestamp and time of timestamp + AudioTransmit, // Timestamp and socket send time + AudioReceive, // Timestamp and receive time + MediaPipelineAudioPlayout, // Timestamp and playout into MST time + MediaStreamCreate, // Source and TrackUnion streams + AudioStreamCreate, // TrackUnion stream and AudioStream + AudioSendRTP, + AudioRecvRTP, + _MAX_INDEX + }; + // Log with a null timestamp + void Log(LatencyLogIndex index, uint64_t aID, int64_t aValue); + // Log with a timestamp + void Log(LatencyLogIndex index, uint64_t aID, int64_t aValue, + mozilla::TimeStamp &aTime); + // Write a log message to NSPR + void WriteLog(LatencyLogIndex index, uint64_t aID, int64_t aValue, + mozilla::TimeStamp timestamp); + // Get the base time used by the logger for delta calculations + void GetStartTime(mozilla::TimeStamp &aStart); + + static AsyncLatencyLogger* Get(bool aStartTimer = false); + static void InitializeStatics(); + // After this is called, the global log object may go away + static void ShutdownLogger(); +private: + AsyncLatencyLogger(); + virtual ~AsyncLatencyLogger(); + int64_t GetTimeStamp(); + void Init(); + // Shut down the thread associated with this, and make sure it doesn't + // start up again. + void Shutdown(); + // The thread on which the IO happens + nsCOMPtr<nsIThread> mThread; + // This can be initialized on multiple threads, but is protected by a + // monitor. After the initialization phase, it is accessed on the log + // thread only. + mozilla::TimeStamp mStart; + // This monitor protects mStart and mMediaLatencyLog for the + // initialization sequence. It is initialized at layout startup, and + // destroyed at layout shutdown. + mozilla::Mutex mMutex; +}; + +// need uint32_t versions for access from webrtc/trunk code +// Log without a time delta +void LogLatency(AsyncLatencyLogger::LatencyLogIndex index, uint64_t aID, int64_t aValue); +void LogLatency(uint32_t index, uint64_t aID, int64_t aValue); +// Log TimeStamp::Now() (as delta) +void LogTime(AsyncLatencyLogger::LatencyLogIndex index, uint64_t aID, int64_t aValue); +void LogTime(uint32_t index, uint64_t aID, int64_t aValue); +// Log the specified time (as delta) +void LogTime(AsyncLatencyLogger::LatencyLogIndex index, uint64_t aID, int64_t aValue, + mozilla::TimeStamp &aTime); + +// For generating unique-ish ids for logged sources +#define LATENCY_STREAM_ID(source, trackID) \ + ((((uint64_t) (source)) & ~0x0F) | (trackID)) + +#endif |