tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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_