Source code

Revision control

Copy as Markdown

Other Tools

/* 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 _WEBRTC_GLOBAL_H_
#define _WEBRTC_GLOBAL_H_
#include "WebrtcIPCTraits.h"
#include "ipc/EnumSerializer.h"
#include "ipc/IPCMessageUtilsSpecializations.h"
#include "mozilla/dom/BindingIPCUtils.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/dom/RTCDataChannelBinding.h"
#include "mozilla/dom/RTCStatsReportBinding.h"
#include "mozilla/UniquePtr.h"
typedef mozilla::dom::RTCStatsReportInternal StatsReport;
typedef nsTArray<mozilla::UniquePtr<StatsReport>> RTCReports;
typedef mozilla::dom::Sequence<nsString> WebrtcGlobalLog;
namespace mozilla {
namespace dom {
// Calls aFunction with all public members of aStats.
// Typical usage would have aFunction take a parameter pack.
// To avoid inconsistencies, this should be the only explicit list of the
// public RTCStatscollection members in C++.
template <typename Collection, typename Function>
static auto ForAllPublicRTCStatsCollectionMembers(Collection& aStats,
Function aFunction) {
static_assert(std::is_same_v<typename std::remove_const<Collection>::type,
RTCStatsCollection>,
"aStats must be a const or non-const RTCStatsCollection");
return aFunction(
aStats.mInboundRtpStreamStats, aStats.mOutboundRtpStreamStats,
aStats.mRemoteInboundRtpStreamStats, aStats.mRemoteOutboundRtpStreamStats,
aStats.mMediaSourceStats, aStats.mVideoSourceStats,
aStats.mPeerConnectionStats, aStats.mRtpContributingSourceStats,
aStats.mIceCandidatePairStats, aStats.mIceCandidateStats,
aStats.mTrickledIceCandidateStats, aStats.mDataChannelStats,
aStats.mCodecStats);
}
// Calls aFunction with all members of aStats, including internal ones.
// Typical usage would have aFunction take a parameter pack.
// To avoid inconsistencies, this should be the only explicit list of the
// internal RTCStatscollection members in C++.
template <typename Collection, typename Function>
static auto ForAllRTCStatsCollectionMembers(Collection& aStats,
Function aFunction) {
static_assert(std::is_same_v<typename std::remove_const<Collection>::type,
RTCStatsCollection>,
"aStats must be a const or non-const RTCStatsCollection");
return ForAllPublicRTCStatsCollectionMembers(aStats, [&](auto&... aMember) {
return aFunction(aMember..., aStats.mRawLocalCandidates,
aStats.mRawRemoteCandidates, aStats.mVideoFrameHistories,
aStats.mBandwidthEstimations);
});
}
} // namespace dom
} // namespace mozilla
namespace IPC {
template <>
struct ParamTraits<mozilla::dom::RTCStatsType>
: public mozilla::dom::WebIDLEnumSerializer<mozilla::dom::RTCStatsType> {};
template <>
struct ParamTraits<mozilla::dom::RTCStatsIceCandidatePairState>
: public mozilla::dom::WebIDLEnumSerializer<
mozilla::dom::RTCStatsIceCandidatePairState> {};
template <>
struct ParamTraits<mozilla::dom::RTCIceCandidateType>
: public mozilla::dom::WebIDLEnumSerializer<
mozilla::dom::RTCIceCandidateType> {};
template <>
struct ParamTraits<mozilla::dom::RTCBundlePolicy>
: public mozilla::dom::WebIDLEnumSerializer<mozilla::dom::RTCBundlePolicy> {
};
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCIceServerInternal, mUrls,
mCredentialProvided, mUserNameProvided);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCConfigurationInternal,
mBundlePolicy, mCertificatesProvided,
mIceServers, mIceTransportPolicy,
mPeerIdentityProvided, mSdpSemantics);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCSdpParsingErrorInternal,
mLineNumber, mError);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCSdpHistoryEntryInternal,
mTimestamp, mIsLocal, mSdp, mErrors);
template <>
struct ParamTraits<mozilla::dom::RTCStatsCollection> {
static void Write(MessageWriter* aWriter,
const mozilla::dom::RTCStatsCollection& aParam) {
mozilla::dom::ForAllRTCStatsCollectionMembers(
aParam,
[&](const auto&... aMember) { WriteParams(aWriter, aMember...); });
}
static bool Read(MessageReader* aReader,
mozilla::dom::RTCStatsCollection* aResult) {
return mozilla::dom::ForAllRTCStatsCollectionMembers(
*aResult,
[&](auto&... aMember) { return ReadParams(aReader, aMember...); });
}
};
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCStatsReportInternal, mozilla::dom::RTCStatsCollection,
mClosed, mSdpHistory, mPcid, mBrowserId, mTimestamp, mCallDurationMs,
mIceRestarts, mIceRollbacks, mOfferer, mConfiguration);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCStats, mId, mTimestamp,
mType);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCIceCandidatePairStats, mozilla::dom::RTCStats,
mTransportId, mLocalCandidateId, mPriority, mNominated, mWritable,
mReadable, mRemoteCandidateId, mSelected, mComponentId, mState, mBytesSent,
mBytesReceived, mLastPacketSentTimestamp, mLastPacketReceivedTimestamp);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCIceCandidateStats, mozilla::dom::RTCStats, mCandidateType,
mPriority, mTransportId, mAddress, mRelayProtocol, mPort, mProtocol,
mProxied);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCReceivedRtpStreamStats, mozilla::dom::RTCRtpStreamStats,
mPacketsReceived, mPacketsLost, mJitter, mDiscardedPackets,
mPacketsDiscarded);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCInboundRtpStreamStats,
mozilla::dom::RTCReceivedRtpStreamStats, mTrackIdentifier, mRemoteId,
mFramesDecoded, mFramesDropped, mFrameWidth, mFrameHeight, mFramesPerSecond,
mQpSum, mTotalDecodeTime, mTotalInterFrameDelay,
mTotalSquaredInterFrameDelay, mLastPacketReceivedTimestamp,
mHeaderBytesReceived, mFecPacketsReceived, mFecPacketsDiscarded,
mBytesReceived, mNackCount, mFirCount, mPliCount, mTotalProcessingDelay,
// Always missing from libwebrtc stats
// mEstimatedPlayoutTimestamp,
mFramesReceived, mJitterBufferDelay, mJitterBufferEmittedCount,
mTotalSamplesReceived, mConcealedSamples, mSilentConcealedSamples,
mConcealmentEvents, mInsertedSamplesForDeceleration,
mRemovedSamplesForAcceleration, mAudioLevel, mTotalAudioEnergy,
mTotalSamplesDuration);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCRtpStreamStats, mozilla::dom::RTCStats, mSsrc, mKind,
mMediaType, mTransportId, mCodecId);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCSentRtpStreamStats, mozilla::dom::RTCRtpStreamStats,
mPacketsSent, mBytesSent);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCOutboundRtpStreamStats,
mozilla::dom::RTCSentRtpStreamStats, mRemoteId, mFramesEncoded, mQpSum,
mNackCount, mFirCount, mPliCount, mHeaderBytesSent,
mRetransmittedPacketsSent, mRetransmittedBytesSent,
mTotalEncodedBytesTarget, mFrameWidth, mFrameHeight, mFramesPerSecond,
mFramesSent, mHugeFramesSent, mTotalEncodeTime);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCRemoteInboundRtpStreamStats,
mozilla::dom::RTCReceivedRtpStreamStats, mLocalId, mRoundTripTime,
mTotalRoundTripTime, mFractionLost, mRoundTripTimeMeasurements);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCRemoteOutboundRtpStreamStats,
mozilla::dom::RTCSentRtpStreamStats, mLocalId, mRemoteTimestamp);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCMediaSourceStats, mId,
mTimestamp, mType, mTrackIdentifier, mKind);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCVideoSourceStats, mozilla::dom::RTCMediaSourceStats,
mWidth, mHeight, mFrames, mFramesPerSecond);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCRTPContributingSourceStats, mozilla::dom::RTCStats,
mContributorSsrc, mInboundRtpStreamId);
DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS(
mozilla::dom::RTCPeerConnectionStats, mozilla::dom::RTCStats,
mDataChannelsOpened, mDataChannelsClosed);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(
mozilla::dom::RTCVideoFrameHistoryEntryInternal, mWidth, mHeight,
mRotationAngle, mFirstFrameTimestamp, mLastFrameTimestamp,
mConsecutiveFrames, mLocalSsrc, mRemoteSsrc);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCVideoFrameHistoryInternal,
mTrackIdentifier, mEntries);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCBandwidthEstimationInternal,
mTrackIdentifier, mSendBandwidthBps,
mMaxPaddingBps, mReceiveBandwidthBps,
mPacerDelayMs, mRttMs);
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCDataChannelStats, mId,
mTimestamp, mType, mLabel, mProtocol,
mDataChannelIdentifier, mState, mMessagesSent,
mBytesSent, mMessagesReceived, mBytesReceived)
template <>
struct ParamTraits<mozilla::dom::RTCDataChannelState>
: public mozilla::dom::WebIDLEnumSerializer<
mozilla::dom::RTCDataChannelState> {};
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCCodecStats, mTimestamp,
mType, mId, mPayloadType, mCodecType,
mTransportId, mMimeType, mClockRate,
mChannels, mSdpFmtpLine)
template <>
struct ParamTraits<mozilla::dom::RTCCodecType>
: public mozilla::dom::WebIDLEnumSerializer<mozilla::dom::RTCCodecType> {};
} // namespace IPC
#endif // _WEBRTC_GLOBAL_H_