class JsepTransportController final { public: // Used when the RtpTransport/DtlsTransport of the m= section is changed // because the section is rejected or BUNDLE is enabled. class Observer { public: virtual ~Observer() {}
// Returns true if media associated with `mid` was successfully set up to be // demultiplexed on `rtp_transport`. Could return false if two bundled m= // sections use the same SSRC, for example. // // If a data channel transport must be negotiated, `data_channel_transport` // and `negotiation_state` indicate negotiation status. If // `data_channel_transport` is null, the data channel transport should not // be used. Otherwise, the value is a pointer to the transport to be used // for data channels on `mid`, if any. // // The observer should not send data on `data_channel_transport` until // `negotiation_state` is provisional or final. It should not delete // `data_channel_transport` or any fallback transport until // `negotiation_state` is final. virtualbool OnTransportChanged(
absl::string_view mid,
RtpTransportInternal* rtp_transport,
scoped_refptr<DtlsTransport> dtls_transport,
DataChannelTransportInterface* data_channel_transport) = 0;
};
struct Config { // If `redetermine_role_on_ice_restart` is true, ICE role is redetermined // upon setting a local transport description that indicates an ICE // restart. bool redetermine_role_on_ice_restart = true;
SSLProtocolVersion ssl_max_version = SSL_PROTOCOL_DTLS_12; // `crypto_options` is used to determine if created DTLS transports // negotiate GCM crypto suites or not.
CryptoOptions crypto_options;
PeerConnectionInterface::BundlePolicy bundle_policy =
PeerConnectionInterface::kBundlePolicyBalanced;
PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy =
PeerConnectionInterface::kRtcpMuxPolicyRequire; bool disable_encryption = false; // Used to inject the ICE/DTLS/SRTP transports created externally.
IceTransportFactory* ice_transport_factory = nullptr;
DtlsTransportFactory* dtls_transport_factory = nullptr;
RtpTransportFactory* rtp_transport_factory = nullptr;
Observer* transport_observer = nullptr; // Must be provided and valid for the lifetime of the // JsepTransportController instance.
absl::AnyInvocable<void(const CopyOnWriteBuffer& packet,
int64_t packet_time_us) const>
rtcp_handler;
absl::AnyInvocable<void(const RtpPacketReceived& parsed_packet) const>
un_demuxable_packet_handler;
// The ICE related events are fired on the `network_thread`. // All the transport related methods are called on the `network_thread` // and destruction of the JsepTransportController must occur on the // `network_thread`.
JsepTransportController( const Environment& env,
TaskQueueBase* signaling_thread,
Thread* network_thread,
PortAllocator* port_allocator,
AsyncDnsResolverFactoryInterface* async_dns_resolver_factory,
LocalNetworkAccessPermissionFactoryInterface* lna_permission_factory,
Config config);
~JsepTransportController();
// The main method to be called; applies a description at the transport // level, creating/destroying transport objects as needed and updating their // properties. This includes RTP, DTLS, and ICE (but not SCTP). At least not // yet? May make sense to in the future. // // `local_desc` must always be valid. If a remote description has previously // been set via a call to `SetRemoteDescription()` then `remote_desc` should // point to that description object in order to keep the current local and // remote session descriptions in sync. // // Must be called on the signaling thread.
RTCError SetLocalDescription(SdpType type, const SessionDescription* local_desc, const SessionDescription* remote_desc);
// Call to apply a remote description (See `SetLocalDescription()` for local). // // `remote_desc` must always be valid. If a local description has previously // been set via a call to `SetLocalDescription()` then `local_desc` should // point to that description object in order to keep the current local and // remote session descriptions in sync. // // Must be called on the signaling thread.
RTCError SetRemoteDescription(SdpType type, const SessionDescription* local_desc, const SessionDescription* remote_desc);
// Get transports to be used for the provided `mid`. If bundling is enabled, // calling GetRtpTransport for multiple MIDs may yield the same object.
RtpTransportInternal* GetRtpTransport(absl::string_view mid) const;
DtlsTransportInternal* GetDtlsTransport(absl::string_view mid); // Gets the externally sharable version of the DtlsTransport.
scoped_refptr<DtlsTransport> LookupDtlsTransportByMid_n(
absl::string_view mid);
scoped_refptr<DtlsTransport> LookupDtlsTransportByMid(absl::string_view mid);
scoped_refptr<SctpTransport> GetSctpTransport(absl::string_view mid) const;
/********************* *ICE-relatedmethods
********************/ // This method is public to allow PeerConnection to update it from // SetConfiguration. void SetIceConfig(const IceConfig& config); // Set the "needs-ice-restart" flag as described in JSEP. After the flag is // set, offers should generate new ufrags/passwords until an ICE restart // occurs. void SetNeedsIceRestartFlag(); // Returns true if the ICE restart flag above was set, and no ICE restart has // occurred yet for this transport (by applying a local description with // changed ufrag/password). If the transport has been deleted as a result of // bundling, returns false. // // Must be called on the signaling thread. bool NeedsIceRestart(absl::string_view mid) const; // Start gathering candidates for any new transports, or transports doing an // ICE restart. Returns the pooled ICE credentials from the port allocator. // // Must be called on the signaling thread.
std::vector<IceParameters> MaybeStartGathering();
RTCError AddRemoteCandidates(absl::string_view mid, const std::vector<Candidate>& candidates); // Must be called on the signaling thread. bool RemoveRemoteCandidate(const IceCandidate* candidate);
/********************** *DTLS-relatedmethods
*********************/ // Specifies the identity to use in this session. // Can only be called once. // // Must be called on the signaling thread. bool SetLocalCertificate(const scoped_refptr<RTCCertificate>& certificate);
scoped_refptr<RTCCertificate> GetLocalCertificate(
absl::string_view mid) const; // Caller owns returned certificate chain. This method mainly exists for // stats reporting.
std::unique_ptr<SSLCertChain> GetRemoteSSLCertChain(
absl::string_view mid) const; // Get negotiated role, if one has been negotiated. // // Must be called on the signaling thread.
std::optional<SSLRole> GetDtlsRole(absl::string_view mid) const;
// Must be called on the signaling thread. void SetTransportStates(flat_map<std::string, TransportState> states);
// Must be called on the network thread.
flat_map<std::string, TransportState> GetTransportStates_n();
// Must be called on the signaling thread.
RTCError RollbackTransports();
// Must be called on the signaling thread.
absl::AnyInvocable<void() &&> MakeCloseTask();
private: // Always called via a blocking call from the signaling thread.
RTCError SetLocalDescription_n(SdpType type, const SessionDescription* local_desc, const SessionDescription* remote_desc)
RTC_RUN_ON(network_thread_);
// Always called via a blocking call from the signaling thread.
RTCError SetRemoteDescription_n(SdpType type, const SessionDescription* local_desc, const SessionDescription* remote_desc)
RTC_RUN_ON(network_thread_);
// Always called via a blocking call from the signaling thread. bool RemoveRemoteCandidate_n(const IceCandidate* candidate)
RTC_RUN_ON(network_thread_);
// Always called via a blocking call from the signaling thread.
RTCError RollbackTransports_n() RTC_RUN_ON(network_thread_);
// Always called via a blocking call from the signaling thread. void MaybeStartGathering_n() RTC_RUN_ON(network_thread_);
// Always called via a blocking call from the signaling thread. bool SetLocalCertificate_n(const scoped_refptr<RTCCertificate>& certificate)
RTC_RUN_ON(network_thread_);
// Called from SetLocalDescription and SetRemoteDescription. // When `local` is true, local_desc must be valid. Similarly when // `local` is false, remote_desc must be valid. The description counterpart // to the one that's being applied, may be nullptr but when it's supplied // the counterpart description's content groups will be kept up to date for // `type == SdpType::kAnswer`.
RTCError ApplyDescription_n(bool local,
SdpType type, const SessionDescription* local_desc, const SessionDescription* remote_desc)
RTC_RUN_ON(network_thread_);
// This method takes the BUNDLE group into account. If the JsepTransport is // destroyed because of BUNDLE, it would return the transport which other // transports are bundled on (In current implementation, it is the first // content in the BUNDLE group). const JsepTransport* GetJsepTransportForMid(absl::string_view mid) const
RTC_RUN_ON(network_thread_);
JsepTransport* GetJsepTransportForMid(absl::string_view mid)
RTC_RUN_ON(network_thread_);
// Get the JsepTransport without considering the BUNDLE group. Return nullptr // if the JsepTransport is destroyed. const JsepTransport* GetJsepTransportByName(
absl::string_view transport_name) const RTC_RUN_ON(network_thread_);
JsepTransport* GetJsepTransportByName(absl::string_view transport_name)
RTC_RUN_ON(network_thread_);
// Creates jsep transport. Noop if transport is already created. // Transport is created either during SetLocalDescription (`local` == true) or // during SetRemoteDescription (`local` == false). Passing `local` helps to // differentiate initiator (caller) from answerer (callee).
RTCError MaybeCreateJsepTransport(bool local, const ContentInfo& content_info, const SessionDescription& description)
RTC_RUN_ON(network_thread_);
// Collect all the DtlsTransports, including RTP and RTCP, from the // JsepTransports, including those not mapped to a MID because they are being // kept alive in case of rollback.
std::vector<DtlsTransportInternal*> GetDtlsTransports(); // Same as the above, but doesn't include rollback transports. // JsepTransportController can iterate all the DtlsTransports and update the // aggregate states.
std::vector<DtlsTransportInternal*> GetActiveDtlsTransports();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.