/* 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 _RTCRtpReceiver_h_ #define _RTCRtpReceiver_h_ #include "nsISupports.h" #include "nsWrapperCache.h" #include "mozilla/RefPtr.h" #include "mozilla/StateMirroring.h" #include "mozilla/Maybe.h" #include "js/RootingAPI.h" #include "libwebrtcglue/MediaConduitInterface.h" #include "libwebrtcglue/RtpRtcpConfig.h" #include "nsTArray.h" #include "mozilla/dom/RTCStatsReportBinding.h" #include "PerformanceRecorder.h" #include "RTCStatsReport.h" #include class nsPIDOMWindowInner; namespace mozilla { class MediaPipelineReceive; class MediaSessionConduit; class MediaTransportHandler; class JsepTransceiver; class PeerConnectionImpl; namespace dom { class MediaStreamTrack; class Promise; class RTCDtlsTransport; struct RTCRtpContributingSource; struct RTCRtpSynchronizationSource; class RTCRtpTransceiver; class RTCRtpReceiver : public nsISupports, public nsWrapperCache { public: RTCRtpReceiver(nsPIDOMWindowInner* aWindow, bool aPrivacyNeeded, PeerConnectionImpl* aPc, MediaTransportHandler* aTransportHandler, AbstractThread* aCallThread, nsISerialEventTarget* aStsThread, MediaSessionConduit* aConduit, RTCRtpTransceiver* aTransceiver, const TrackingId& aTrackingId); // nsISupports NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(RTCRtpReceiver) JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; // webidl MediaStreamTrack* Track() const { return mTrack; } RTCDtlsTransport* GetTransport() const; already_AddRefed GetStats(ErrorResult& aError); void GetContributingSources( nsTArray& aSources); void GetSynchronizationSources( nsTArray& aSources); // test-only: insert fake CSRCs and audio levels for testing void MozInsertAudioLevelForContributingSource( const uint32_t aSource, const DOMHighResTimeStamp aTimestamp, const uint32_t aRtpTimestamp, const bool aHasLevel, const uint8_t aLevel); nsPIDOMWindowInner* GetParentObject() const; nsTArray> GetStatsInternal( bool aSkipIceStats = false); void Shutdown(); void BreakCycles(); void Stop(); void Start(); bool HasTrack(const dom::MediaStreamTrack* aTrack) const; void SyncToJsep(JsepTransceiver& aJsepTransceiver) const; void SyncFromJsep(const JsepTransceiver& aJsepTransceiver); const std::vector& GetStreamIds() const { return mStreamIds; } struct StreamAssociation { RefPtr mTrack; std::string mStreamId; }; struct TrackEventInfo { RefPtr mReceiver; std::vector mStreamIds; }; struct StreamAssociationChanges { std::vector> mTracksToMute; std::vector mStreamAssociationsRemoved; std::vector mStreamAssociationsAdded; std::vector mTrackEvents; }; // This is called when we set an answer (ie; when the transport is finalized). void UpdateTransport(); void UpdateConduit(); // This is called when we set a remote description; may be an offer or answer. void UpdateStreams(StreamAssociationChanges* aChanges); void OnRtcpBye(); void OnRtcpTimeout(); void SetReceiveTrackMuted(bool aMuted); AbstractCanonical* CanonicalSsrc() { return &mSsrc; } AbstractCanonical* CanonicalVideoRtxSsrc() { return &mVideoRtxSsrc; } AbstractCanonical* CanonicalLocalRtpExtensions() { return &mLocalRtpExtensions; } AbstractCanonical>* CanonicalAudioCodecs() { return &mAudioCodecs; } AbstractCanonical>* CanonicalVideoCodecs() { return &mVideoCodecs; } AbstractCanonical>* CanonicalVideoRtpRtcpConfig() { return &mVideoRtpRtcpConfig; } AbstractCanonical* CanonicalReceiving() { return &mReceiving; } private: virtual ~RTCRtpReceiver(); void UpdateVideoConduit(); void UpdateAudioConduit(); std::string GetMid() const; JsepTransceiver& GetJsepTransceiver(); const JsepTransceiver& GetJsepTransceiver() const; nsCOMPtr mWindow; RefPtr mPc; bool mHaveStartedReceiving = false; bool mHaveSetupTransport = false; RefPtr mCallThread; nsCOMPtr mStsThread; RefPtr mTrack; RefPtr mPipeline; RefPtr mTransportHandler; RefPtr mTransceiver; // This is [[AssociatedRemoteMediaStreams]], basically. We do not keep the // streams themselves here, because that would require this object to know // where the stream list for the whole RTCPeerConnection lives.. std::vector mStreamIds; bool mRemoteSetSendBit = false; MediaEventListener mRtcpByeListener; MediaEventListener mRtcpTimeoutListener; Canonical mSsrc; Canonical mVideoRtxSsrc; Canonical mLocalRtpExtensions; Canonical> mAudioCodecs; Canonical> mVideoCodecs; Canonical> mVideoRtpRtcpConfig; Canonical mReceiving; }; } // namespace dom } // namespace mozilla #endif // _RTCRtpReceiver_h_