RTCRtpSender.h (11266B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #ifndef _RTCRtpSender_h_ 6 #define _RTCRtpSender_h_ 7 8 #include "RTCStatsReport.h" 9 #include "js/RootingAPI.h" 10 #include "jsep/JsepTrack.h" 11 #include "libwebrtcglue/RtpRtcpConfig.h" 12 #include "mozilla/Maybe.h" 13 #include "mozilla/RefPtr.h" 14 #include "mozilla/StateMirroring.h" 15 #include "mozilla/dom/RTCRtpCapabilitiesBinding.h" 16 #include "mozilla/dom/RTCRtpParametersBinding.h" 17 #include "mozilla/dom/RTCStatsReportBinding.h" 18 #include "nsISupports.h" 19 #include "nsTArray.h" 20 #include "nsWrapperCache.h" 21 #include "transportbridge/MediaPipeline.h" 22 23 class nsPIDOMWindowInner; 24 25 namespace mozilla { 26 class MediaSessionConduit; 27 class MediaTransportHandler; 28 class JsepTransceiver; 29 class PeerConnectionImpl; 30 class DOMMediaStream; 31 32 namespace dom { 33 class MediaStreamTrack; 34 class Promise; 35 class RTCDtlsTransport; 36 class RTCDTMFSender; 37 struct RTCRtpCapabilities; 38 class RTCRtpTransceiver; 39 class RTCRtpScriptTransform; 40 41 enum class MatchGetCapabilities { 42 NO, 43 YES, 44 }; 45 46 bool DoesCodecParameterMatchCodec(const RTCRtpCodec& aCodec1, 47 const RTCRtpCodec& aCodec2, 48 const bool aIgnoreLevels = false); 49 50 class RTCRtpSender : public nsISupports, 51 public nsWrapperCache, 52 public MediaPipelineTransmitControlInterface { 53 public: 54 RTCRtpSender(nsPIDOMWindowInner* aWindow, PeerConnectionImpl* aPc, 55 MediaTransportHandler* aTransportHandler, 56 AbstractThread* aCallThread, nsISerialEventTarget* aStsThread, 57 MediaSessionConduit* aConduit, dom::MediaStreamTrack* aTrack, 58 const Sequence<RTCRtpEncodingParameters>& aEncodings, 59 RTCRtpTransceiver* aTransceiver); 60 61 // nsISupports 62 NS_DECL_CYCLE_COLLECTING_ISUPPORTS 63 NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(RTCRtpSender) 64 65 JSObject* WrapObject(JSContext* aCx, 66 JS::Handle<JSObject*> aGivenProto) override; 67 68 // webidl 69 MediaStreamTrack* GetTrack() const { return mSenderTrack; } 70 RTCDtlsTransport* GetTransport() const; 71 RTCDTMFSender* GetDtmf() const; 72 MOZ_CAN_RUN_SCRIPT 73 already_AddRefed<Promise> ReplaceTrack(MediaStreamTrack* aWithTrack, 74 ErrorResult& aError); 75 already_AddRefed<Promise> GetStats(ErrorResult& aError); 76 static void GetCapabilities(const GlobalObject&, const nsAString& kind, 77 Nullable<dom::RTCRtpCapabilities>& result); 78 already_AddRefed<Promise> SetParameters( 79 const dom::RTCRtpSendParameters& aParameters, ErrorResult& aError); 80 // Not a simple getter, so not const 81 // See https://w3c.github.io/webrtc-pc/#dom-rtcrtpsender-getparameters 82 void GetParameters(RTCRtpSendParameters& aParameters); 83 84 static void CheckAndRectifyEncodings( 85 Sequence<RTCRtpEncodingParameters>& aEncodings, bool aVideo, 86 const Optional<Sequence<RTCRtpCodecParameters>>& aCodecs, 87 const bool aIgnoreLevels, const bool aCodecErasure, 88 const MatchGetCapabilities aMatchGetCapabilities, ErrorResult& aRv); 89 90 RTCRtpScriptTransform* GetTransform() const { return mTransform; } 91 92 void SetTransform(RTCRtpScriptTransform* aTransform, ErrorResult& aError); 93 bool GenerateKeyFrame(const Maybe<std::string>& aRid); 94 95 nsPIDOMWindowInner* GetParentObject() const; 96 nsTArray<RefPtr<RTCStatsPromise>> GetStatsInternal( 97 bool aSkipIceStats = false); 98 99 void SetStreams(const Sequence<OwningNonNull<DOMMediaStream>>& aStreams, 100 ErrorResult& aRv); 101 // ChromeOnly webidl 102 void GetStreams(nsTArray<RefPtr<DOMMediaStream>>& aStreams); 103 // ChromeOnly webidl 104 void SetStreamsImpl(const Sequence<OwningNonNull<DOMMediaStream>>& aStreams); 105 // ChromeOnly webidl 106 void SetTrack(const RefPtr<MediaStreamTrack>& aTrack); 107 void Shutdown(); 108 void BreakCycles(); 109 void Unlink(); 110 // Terminal state, reached through stopping RTCRtpTransceiver. 111 void Stop(); 112 bool HasTrack(const dom::MediaStreamTrack* aTrack) const; 113 bool IsMyPc(const PeerConnectionImpl* aPc) const { return mPc.get() == aPc; } 114 RefPtr<MediaPipelineTransmit> GetPipeline() const; 115 already_AddRefed<dom::Promise> MakePromise(ErrorResult& aError) const; 116 bool SeamlessTrackSwitch(const RefPtr<MediaStreamTrack>& aWithTrack); 117 bool SetSenderTrackWithClosedCheck(const RefPtr<MediaStreamTrack>& aTrack); 118 119 // This is called when we set an answer (ie; when the transport is finalized). 120 void UpdateTransport(); 121 void SyncToJsep(JsepTransceiver& aJsepTransceiver) const; 122 void SyncFromJsep(const JsepTransceiver& aJsepTransceiver); 123 void MaybeUpdateConduit(); 124 125 Canonical<Ssrcs>& CanonicalSsrcs() { return mSsrcs; } 126 Canonical<Ssrcs>& CanonicalVideoRtxSsrcs() { return mVideoRtxSsrcs; } 127 Canonical<RtpExtList>& CanonicalLocalRtpExtensions() { 128 return mLocalRtpExtensions; 129 } 130 131 Canonical<Maybe<AudioCodecConfig>>& CanonicalAudioCodec() { 132 return mAudioCodec; 133 } 134 135 Canonical<Maybe<VideoCodecConfig>>& CanonicalVideoCodec() { 136 return mVideoCodec; 137 } 138 Canonical<Maybe<RtpRtcpConfig>>& CanonicalVideoRtpRtcpConfig() { 139 return mVideoRtpRtcpConfig; 140 } 141 Canonical<webrtc::VideoCodecMode>& CanonicalVideoCodecMode() { 142 return mVideoCodecMode; 143 } 144 Canonical<std::string>& CanonicalCname() { return mCname; } 145 Canonical<bool>& CanonicalTransmitting() override { return mTransmitting; } 146 147 Canonical<RefPtr<FrameTransformerProxy>>& CanonicalFrameTransformerProxy() { 148 return mFrameTransformerProxy; 149 } 150 151 Canonical<webrtc::DegradationPreference>& 152 CanonicalVideoDegradationPreference() { 153 return mVideoDegradationPreference; 154 } 155 156 bool HasPendingSetParameters() const { return mPendingParameters.isSome(); } 157 void InvalidateLastReturnedParameters() { 158 mLastReturnedParameters = Nothing(); 159 } 160 161 private: 162 virtual ~RTCRtpSender(); 163 164 std::string GetMid() const; 165 JsepTransceiver& GetJsepTransceiver(); 166 static void ApplyJsEncodingToConduitEncoding( 167 const RTCRtpEncodingParameters& aJsEncoding, 168 VideoCodecConfig::Encoding* aConduitEncoding); 169 void UpdateRestorableEncodings( 170 const Sequence<RTCRtpEncodingParameters>& aEncodings); 171 Sequence<RTCRtpEncodingParameters> GetMatchingEncodings( 172 const std::vector<std::string>& aRids) const; 173 Sequence<RTCRtpEncodingParameters> ToSendEncodings( 174 const std::vector<std::string>& aRids) const; 175 void MaybeGetJsepRids(); 176 void UpdateDtmfSender(); 177 178 void WarnAboutBadSetParameters(const nsCString& aError); 179 nsCString GetEffectiveTLDPlus1() const; 180 181 WatchManager<RTCRtpSender> mWatchManager; 182 nsCOMPtr<nsPIDOMWindowInner> mWindow; 183 RefPtr<PeerConnectionImpl> mPc; 184 RefPtr<dom::MediaStreamTrack> mSenderTrack; 185 bool mSenderTrackSetByAddTrack = false; 186 // Houses [[SendEncodings]] and [[SendCodecs]] 187 RTCRtpSendParameters mParameters; 188 Maybe<RTCRtpSendParameters> mPendingParameters; 189 uint32_t mNumSetParametersCalls = 0; 190 // When JSEP goes from simulcast to unicast without a rid, and we started out 191 // as unicast without a rid, we are supposed to restore that unicast encoding 192 // from before. 193 Maybe<RTCRtpEncodingParameters> mUnicastEncoding; 194 bool mSimulcastEnvelopeSet = false; 195 bool mSimulcastEnvelopeSetByJSEP = false; 196 bool mPendingRidChangeFromCompatMode = false; 197 Maybe<RTCRtpSendParameters> mLastReturnedParameters; 198 RefPtr<MediaPipelineTransmit> mPipeline; 199 RefPtr<MediaTransportHandler> mTransportHandler; 200 RefPtr<RTCRtpTransceiver> mTransceiver; 201 nsTArray<RefPtr<DOMMediaStream>> mStreams; 202 RefPtr<RTCRtpScriptTransform> mTransform; 203 bool mHaveSetupTransport = false; 204 // TODO(bug 1803388): Remove this stuff once it is no longer needed. 205 bool mAllowOldSetParameters = false; 206 207 // TODO(bug 1803388): Remove the glean warnings once they are no longer needed 208 bool mHaveWarnedBecauseNoGetParameters = false; 209 bool mHaveWarnedBecauseEncodingCountChange = false; 210 bool mHaveWarnedBecauseNoTransactionId = false; 211 // TODO(bug 1803389): Remove the glean errors once they are no longer needed. 212 bool mHaveFailedBecauseNoGetParameters = false; 213 bool mHaveFailedBecauseEncodingCountChange = false; 214 bool mHaveFailedBecauseRidChange = false; 215 bool mHaveFailedBecauseNoTransactionId = false; 216 bool mHaveFailedBecauseStaleTransactionId = false; 217 bool mHaveFailedBecauseNoEncodings = false; 218 bool mHaveFailedBecauseOtherError = false; 219 220 // Limits logging of codec information 221 bool mHaveLoggedUlpfecInfo = false; 222 bool mHaveLoggedOtherFec = false; 223 bool mHaveLoggedVideoPreferredCodec = false; 224 bool mHaveLoggedAudioPreferredCodec = false; 225 // Used to detect cases where getParameters is called too long after 226 // setParameters, and log a better warning. 227 Maybe<nsString> mLastTransactionId; 228 229 RefPtr<dom::RTCDTMFSender> mDtmf; 230 231 class BaseConfig { 232 public: 233 // TODO(bug 1744116): Use = default here 234 bool operator==(const BaseConfig& aOther) const { 235 return mSsrcs == aOther.mSsrcs && 236 mLocalRtpExtensions == aOther.mLocalRtpExtensions && 237 mCname == aOther.mCname && mTransmitting == aOther.mTransmitting; 238 } 239 Ssrcs mSsrcs; 240 RtpExtList mLocalRtpExtensions; 241 std::string mCname; 242 bool mTransmitting = false; 243 }; 244 245 class VideoConfig : public BaseConfig { 246 public: 247 // TODO(bug 1744116): Use = default here 248 bool operator==(const VideoConfig& aOther) const { 249 return BaseConfig::operator==(aOther) && 250 mVideoRtxSsrcs == aOther.mVideoRtxSsrcs && 251 mVideoCodec == aOther.mVideoCodec && 252 mVideoRtpRtcpConfig == aOther.mVideoRtpRtcpConfig && 253 mVideoCodecMode == aOther.mVideoCodecMode; 254 } 255 Ssrcs mVideoRtxSsrcs; 256 Maybe<VideoCodecConfig> mVideoCodec; 257 Maybe<RtpRtcpConfig> mVideoRtpRtcpConfig; 258 webrtc::VideoCodecMode mVideoCodecMode = 259 webrtc::VideoCodecMode::kRealtimeVideo; 260 }; 261 262 class AudioConfig : public BaseConfig { 263 public: 264 // TODO(bug 1744116): Use = default here 265 bool operator==(const AudioConfig& aOther) const { 266 return BaseConfig::operator==(aOther) && 267 mAudioCodec == aOther.mAudioCodec && mDtmfPt == aOther.mDtmfPt && 268 mDtmfFreq == aOther.mDtmfFreq; 269 } 270 Maybe<AudioCodecConfig> mAudioCodec; 271 int32_t mDtmfPt = -1; 272 int32_t mDtmfFreq = 0; 273 }; 274 275 Maybe<VideoConfig> GetNewVideoConfig(); 276 Maybe<AudioConfig> GetNewAudioConfig(); 277 void UpdateBaseConfig(BaseConfig* aConfig); 278 void ApplyVideoConfig(const VideoConfig& aConfig); 279 void ApplyAudioConfig(const AudioConfig& aConfig); 280 void UpdateParametersCodecs(); 281 282 Canonical<Ssrcs> mSsrcs; 283 Canonical<Ssrcs> mVideoRtxSsrcs; 284 Canonical<RtpExtList> mLocalRtpExtensions; 285 286 Canonical<Maybe<AudioCodecConfig>> mAudioCodec; 287 Canonical<Maybe<VideoCodecConfig>> mVideoCodec; 288 Canonical<Maybe<RtpRtcpConfig>> mVideoRtpRtcpConfig; 289 Canonical<webrtc::VideoCodecMode> mVideoCodecMode; 290 Canonical<std::string> mCname; 291 Canonical<bool> mTransmitting; 292 Canonical<RefPtr<FrameTransformerProxy>> mFrameTransformerProxy; 293 Canonical<webrtc::DegradationPreference> mVideoDegradationPreference; 294 }; 295 296 } // namespace dom 297 } // namespace mozilla 298 #endif // _RTCRtpSender_h_