#include "pc/sdp_offer_answer.h"
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <iterator>
#include <map>
#include <memory>
#include <queue>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "absl/algorithm/container.h"
#include "absl/memory/memory.h"
#include "absl/strings/match.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "api/array_view.h"
#include "api/candidate.h"
#include "api/crypto/crypto_options.h"
#include "api/jsep.h"
#include "api/jsep_ice_candidate.h"
#include "api/make_ref_counted.h"
#include "api/media_stream_interface.h"
#include "api/media_types.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_error.h"
#include "api/rtp_parameters.h"
#include "api/rtp_receiver_interface.h"
#include "api/rtp_sender_interface.h"
#include "api/rtp_transceiver_direction.h"
#include "api/rtp_transceiver_interface.h"
#include "api/scoped_refptr.h"
#include "api/sequence_checker.h"
#include "api/set_local_description_observer_interface.h"
#include "api/set_remote_description_observer_interface.h"
#include "api/uma_metrics.h"
#include "api/video/builtin_video_bitrate_allocator_factory.h"
#include "api/video/video_codec_constants.h"
#include "media/base/codec.h"
#include "media/base/media_engine.h"
#include "media/base/rid_description.h"
#include "media/base/stream_params.h"
#include "p2p/base/ice_transport_internal.h"
#include "p2p/base/p2p_constants.h"
#include "p2p/base/p2p_transport_channel.h"
#include "p2p/base/port_allocator.h"
#include "p2p/base/transport_description.h"
#include "p2p/base/transport_description_factory.h"
#include "p2p/base/transport_info.h"
#include "pc/channel_interface.h"
#include "pc/connection_context.h"
#include "pc/dtls_transport.h"
#include "pc/jsep_transport_controller.h"
#include "pc/legacy_stats_collector.h"
#include "pc/media_session.h"
#include "pc/media_stream.h"
#include "pc/media_stream_observer.h"
#include "pc/media_stream_proxy.h"
#include "pc/peer_connection_internal.h"
#include "pc/peer_connection_message_handler.h"
#include "pc/rtp_media_utils.h"
#include "pc/rtp_receiver.h"
#include "pc/rtp_sender.h"
#include "pc/rtp_sender_proxy.h"
#include "pc/rtp_transceiver.h"
#include "pc/rtp_transmission_manager.h"
#include "pc/session_description.h"
#include "pc/simulcast_description.h"
#include "pc/stream_collection.h"
#include "pc/transceiver_list.h"
#include "pc/usage_pattern.h"
#include "pc/used_ids.h"
#include "pc/webrtc_session_description_factory.h"
#include "rtc_base/checks.h"
#include "rtc_base/crypto_random.h"
#include "rtc_base/logging.h"
#include "rtc_base/operations_chain.h"
#include "rtc_base/rtc_certificate.h"
#include "rtc_base/ssl_stream_adapter.h"
#include "rtc_base/string_encode.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/thread.h"
#include "rtc_base/trace_event.h"
#include "rtc_base/weak_ptr.h"
#include "system_wrappers/include/metrics.h"
ContentInfo;
ContentInfos;
MediaContentDescription;
MediaProtocolType;
RidDescription;
RidDirection;
SessionDescription;
SimulcastDescription;
SimulcastLayer;
SimulcastLayerList;
StreamParams;
TransportInfo;
namespace webrtc {
namespace {
RTCOfferAnswerOptions;
const char kInvalidSdp[] = …;
const char kInvalidCandidates[] = …;
const char kBundleWithoutRtcpMux[] = …;
const char kMlineMismatchInAnswer[] = …;
const char kMlineMismatchInSubsequentOffer[] = …;
const char kSdpWithoutIceUfragPwd[] = …;
const char kSdpWithoutDtlsFingerprint[] = …;
const char kSdpWithoutCrypto[] = …;
const char kSessionError[] = …;
const char kSessionErrorDesc[] = …;
static const int kRtcpCnameLength = …;
static constexpr size_t kMidMaxSize = …;
const char kDefaultStreamId[] = …;
static const char kDefaultAudioSenderId[] = …;
static const char kDefaultVideoSenderId[] = …;
void NoteAddIceCandidateResult(int result) { … }
std::map<std::string, const cricket::ContentGroup*> GetBundleGroupsByMid(
const SessionDescription* desc) { … }
bool CheckForRemoteIceRestart(const SessionDescriptionInterface* old_desc,
const SessionDescriptionInterface* new_desc,
const std::string& content_name) { … }
std::string GetSetDescriptionErrorMessage(cricket::ContentSource source,
SdpType type,
const RTCError& error) { … }
std::string GetStreamIdsString(rtc::ArrayView<const std::string> stream_ids) { … }
const ContentInfo* FindTransceiverMSection(
RtpTransceiver* transceiver,
const SessionDescriptionInterface* session_description) { … }
std::vector<cricket::StreamParams> GetActiveStreams(
const cricket::MediaContentDescription* desc) { … }
bool IsMediaSectionBeingRecycled(SdpType type,
const ContentInfo& content,
const ContentInfo* old_content_one,
const ContentInfo* old_content_two) { … }
bool MediaSectionsInSameOrder(const SessionDescription& current_desc,
const SessionDescription* secondary_current_desc,
const SessionDescription& new_desc,
const SdpType type) { … }
bool MediaSectionsHaveSameCount(const SessionDescription& desc1,
const SessionDescription& desc2) { … }
RTCError VerifyCrypto(const SessionDescription* desc,
bool dtls_enabled,
const std::map<std::string, const cricket::ContentGroup*>&
bundle_groups_by_mid) { … }
bool VerifyIceUfragPwdPresent(
const SessionDescription* desc,
const std::map<std::string, const cricket::ContentGroup*>&
bundle_groups_by_mid) { … }
RTCError ValidateMids(const cricket::SessionDescription& description) { … }
RTCError FindDuplicateCodecParameters(
const RtpCodecParameters codec_parameters,
std::map<int, RtpCodecParameters>& payload_to_codec_parameters) { … }
RTCError ValidateBundledPayloadTypes(
const cricket::SessionDescription& description) { … }
RTCError FindDuplicateHeaderExtensionIds(
const RtpExtension extension,
std::map<int, RtpExtension>& id_to_extension) { … }
RTCError ValidateBundledRtpHeaderExtensions(
const cricket::SessionDescription& description) { … }
RTCError ValidateRtpHeaderExtensionsForSpecSimulcast(
const cricket::SessionDescription& description) { … }
RTCError ValidateSsrcGroups(const cricket::SessionDescription& description) { … }
RTCError ValidatePayloadTypes(const cricket::SessionDescription& description) { … }
bool IsValidOfferToReceiveMedia(int value) { … }
bool ValidateOfferAnswerOptions(
const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options) { … }
std::vector<RtpEncodingParameters> GetSendEncodingsFromRemoteDescription(
const MediaContentDescription& desc) { … }
RTCError UpdateSimulcastLayerStatusInSender(
const std::vector<SimulcastLayer>& layers,
rtc::scoped_refptr<RtpSenderInternal> sender) { … }
bool SimulcastIsRejected(const ContentInfo* local_content,
const MediaContentDescription& answer_media_desc,
bool enable_encrypted_rtp_header_extensions) { … }
RTCError DisableSimulcastInSender(
rtc::scoped_refptr<RtpSenderInternal> sender) { … }
absl::string_view GetDefaultMidForPlanB(cricket::MediaType media_type) { … }
void AddPlanBRtpSenderOptions(
const std::vector<rtc::scoped_refptr<
RtpSenderProxyWithInternal<RtpSenderInternal>>>& senders,
cricket::MediaDescriptionOptions* audio_media_description_options,
cricket::MediaDescriptionOptions* video_media_description_options,
int num_sim_layers) { … }
cricket::MediaDescriptionOptions GetMediaDescriptionOptionsForTransceiver(
RtpTransceiver* transceiver,
const std::string& mid,
bool is_create_offer) { … }
const ContentInfo* GetContentByIndex(const SessionDescriptionInterface* sdesc,
size_t i) { … }
void ExtractSharedMediaSessionOptions(
const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options,
cricket::MediaSessionOptions* session_options) { … }
std::string GenerateRtcpCname() { … }
bool CanAddLocalMediaStream(StreamCollectionInterface* current_streams,
MediaStreamInterface* new_stream) { … }
rtc::scoped_refptr<DtlsTransport> LookupDtlsTransportByMid(
rtc::Thread* network_thread,
JsepTransportController* controller,
const std::string& mid) { … }
bool ContentHasHeaderExtension(const cricket::ContentInfo& content_info,
absl::string_view header_extension_uri) { … }
}
void UpdateRtpHeaderExtensionPreferencesFromSdpMunging(
const cricket::SessionDescription* description,
TransceiverList* transceivers) { … }
class SdpOfferAnswerHandler::RemoteDescriptionOperation { … };
class SdpOfferAnswerHandler::ImplicitCreateSessionDescriptionObserver
: public CreateSessionDescriptionObserver { … };
class CreateSessionDescriptionObserverOperationWrapper
: public CreateSessionDescriptionObserver { … };
class SdpOfferAnswerHandler::SetSessionDescriptionObserverAdapter
: public SetLocalDescriptionObserverInterface,
public SetRemoteDescriptionObserverInterface { … };
class SdpOfferAnswerHandler::LocalIceCredentialsToReplace { … };
SdpOfferAnswerHandler::SdpOfferAnswerHandler(PeerConnectionSdpMethods* pc,
ConnectionContext* context)
: … { … }
SdpOfferAnswerHandler::~SdpOfferAnswerHandler() { … }
std::unique_ptr<SdpOfferAnswerHandler> SdpOfferAnswerHandler::Create(
PeerConnectionSdpMethods* pc,
const PeerConnectionInterface::RTCConfiguration& configuration,
PeerConnectionDependencies& dependencies,
ConnectionContext* context) { … }
void SdpOfferAnswerHandler::Initialize(
const PeerConnectionInterface::RTCConfiguration& configuration,
PeerConnectionDependencies& dependencies,
ConnectionContext* context) { … }
cricket::MediaEngineInterface* SdpOfferAnswerHandler::media_engine() const { … }
TransceiverList* SdpOfferAnswerHandler::transceivers() { … }
const TransceiverList* SdpOfferAnswerHandler::transceivers() const { … }
JsepTransportController* SdpOfferAnswerHandler::transport_controller_s() { … }
JsepTransportController* SdpOfferAnswerHandler::transport_controller_n() { … }
const JsepTransportController* SdpOfferAnswerHandler::transport_controller_s()
const { … }
const JsepTransportController* SdpOfferAnswerHandler::transport_controller_n()
const { … }
DataChannelController* SdpOfferAnswerHandler::data_channel_controller() { … }
const DataChannelController* SdpOfferAnswerHandler::data_channel_controller()
const { … }
cricket::PortAllocator* SdpOfferAnswerHandler::port_allocator() { … }
const cricket::PortAllocator* SdpOfferAnswerHandler::port_allocator() const { … }
RtpTransmissionManager* SdpOfferAnswerHandler::rtp_manager() { … }
const RtpTransmissionManager* SdpOfferAnswerHandler::rtp_manager() const { … }
void SdpOfferAnswerHandler::PrepareForShutdown() { … }
void SdpOfferAnswerHandler::Close() { … }
void SdpOfferAnswerHandler::RestartIce() { … }
rtc::Thread* SdpOfferAnswerHandler::signaling_thread() const { … }
rtc::Thread* SdpOfferAnswerHandler::network_thread() const { … }
void SdpOfferAnswerHandler::CreateOffer(
CreateSessionDescriptionObserver* observer,
const PeerConnectionInterface::RTCOfferAnswerOptions& options) { … }
void SdpOfferAnswerHandler::SetLocalDescription(
SetSessionDescriptionObserver* observer,
SessionDescriptionInterface* desc_ptr) { … }
void SdpOfferAnswerHandler::SetLocalDescription(
std::unique_ptr<SessionDescriptionInterface> desc,
rtc::scoped_refptr<SetLocalDescriptionObserverInterface> observer) { … }
void SdpOfferAnswerHandler::SetLocalDescription(
SetSessionDescriptionObserver* observer) { … }
void SdpOfferAnswerHandler::SetLocalDescription(
rtc::scoped_refptr<SetLocalDescriptionObserverInterface> observer) { … }
RTCError SdpOfferAnswerHandler::ApplyLocalDescription(
std::unique_ptr<SessionDescriptionInterface> desc,
const std::map<std::string, const cricket::ContentGroup*>&
bundle_groups_by_mid) { … }
void SdpOfferAnswerHandler::SetRemoteDescription(
SetSessionDescriptionObserver* observer,
SessionDescriptionInterface* desc_ptr) { … }
void SdpOfferAnswerHandler::SetRemoteDescription(
std::unique_ptr<SessionDescriptionInterface> desc,
rtc::scoped_refptr<SetRemoteDescriptionObserverInterface> observer) { … }
RTCError SdpOfferAnswerHandler::ReplaceRemoteDescription(
std::unique_ptr<SessionDescriptionInterface> desc,
SdpType sdp_type,
std::unique_ptr<SessionDescriptionInterface>* replaced_description) { … }
void SdpOfferAnswerHandler::ApplyRemoteDescription(
std::unique_ptr<RemoteDescriptionOperation> operation) { … }
void SdpOfferAnswerHandler::ApplyRemoteDescriptionUpdateTransceiverState(
SdpType sdp_type) { … }
void SdpOfferAnswerHandler::PlanBUpdateSendersAndReceivers(
const cricket::ContentInfo* audio_content,
const cricket::AudioContentDescription* audio_desc,
const cricket::ContentInfo* video_content,
const cricket::VideoContentDescription* video_desc) { … }
void SdpOfferAnswerHandler::DoSetLocalDescription(
std::unique_ptr<SessionDescriptionInterface> desc,
rtc::scoped_refptr<SetLocalDescriptionObserverInterface> observer) { … }
void SdpOfferAnswerHandler::DoCreateOffer(
const PeerConnectionInterface::RTCOfferAnswerOptions& options,
rtc::scoped_refptr<CreateSessionDescriptionObserver> observer) { … }
void SdpOfferAnswerHandler::CreateAnswer(
CreateSessionDescriptionObserver* observer,
const PeerConnectionInterface::RTCOfferAnswerOptions& options) { … }
void SdpOfferAnswerHandler::DoCreateAnswer(
const PeerConnectionInterface::RTCOfferAnswerOptions& options,
rtc::scoped_refptr<CreateSessionDescriptionObserver> observer) { … }
void SdpOfferAnswerHandler::DoSetRemoteDescription(
std::unique_ptr<RemoteDescriptionOperation> operation) { … }
void SdpOfferAnswerHandler::SetRemoteDescriptionPostProcess(bool was_answer) { … }
void SdpOfferAnswerHandler::SetAssociatedRemoteStreams(
rtc::scoped_refptr<RtpReceiverInternal> receiver,
const std::vector<std::string>& stream_ids,
std::vector<rtc::scoped_refptr<MediaStreamInterface>>* added_streams,
std::vector<rtc::scoped_refptr<MediaStreamInterface>>* removed_streams) { … }
bool SdpOfferAnswerHandler::AddIceCandidate(
const IceCandidateInterface* ice_candidate) { … }
AddIceCandidateResult SdpOfferAnswerHandler::AddIceCandidateInternal(
const IceCandidateInterface* ice_candidate) { … }
void SdpOfferAnswerHandler::AddIceCandidate(
std::unique_ptr<IceCandidateInterface> candidate,
std::function<void(RTCError)> callback) { … }
bool SdpOfferAnswerHandler::RemoveIceCandidates(
const std::vector<cricket::Candidate>& candidates) { … }
void SdpOfferAnswerHandler::AddLocalIceCandidate(
const JsepIceCandidate* candidate) { … }
void SdpOfferAnswerHandler::RemoveLocalIceCandidates(
const std::vector<cricket::Candidate>& candidates) { … }
const SessionDescriptionInterface* SdpOfferAnswerHandler::local_description()
const { … }
const SessionDescriptionInterface* SdpOfferAnswerHandler::remote_description()
const { … }
const SessionDescriptionInterface*
SdpOfferAnswerHandler::current_local_description() const { … }
const SessionDescriptionInterface*
SdpOfferAnswerHandler::current_remote_description() const { … }
const SessionDescriptionInterface*
SdpOfferAnswerHandler::pending_local_description() const { … }
const SessionDescriptionInterface*
SdpOfferAnswerHandler::pending_remote_description() const { … }
PeerConnectionInterface::SignalingState SdpOfferAnswerHandler::signaling_state()
const { … }
void SdpOfferAnswerHandler::ChangeSignalingState(
PeerConnectionInterface::SignalingState signaling_state) { … }
RTCError SdpOfferAnswerHandler::UpdateSessionState(
SdpType type,
cricket::ContentSource source,
const cricket::SessionDescription* description,
const std::map<std::string, const cricket::ContentGroup*>&
bundle_groups_by_mid) { … }
bool SdpOfferAnswerHandler::ShouldFireNegotiationNeededEvent(
uint32_t event_id) { … }
rtc::scoped_refptr<StreamCollectionInterface>
SdpOfferAnswerHandler::local_streams() { … }
rtc::scoped_refptr<StreamCollectionInterface>
SdpOfferAnswerHandler::remote_streams() { … }
bool SdpOfferAnswerHandler::AddStream(MediaStreamInterface* local_stream) { … }
void SdpOfferAnswerHandler::RemoveStream(MediaStreamInterface* local_stream) { … }
void SdpOfferAnswerHandler::OnAudioTrackAdded(AudioTrackInterface* track,
MediaStreamInterface* stream) { … }
void SdpOfferAnswerHandler::OnAudioTrackRemoved(AudioTrackInterface* track,
MediaStreamInterface* stream) { … }
void SdpOfferAnswerHandler::OnVideoTrackAdded(VideoTrackInterface* track,
MediaStreamInterface* stream) { … }
void SdpOfferAnswerHandler::OnVideoTrackRemoved(VideoTrackInterface* track,
MediaStreamInterface* stream) { … }
RTCError SdpOfferAnswerHandler::Rollback(SdpType desc_type) { … }
bool SdpOfferAnswerHandler::IsUnifiedPlan() const { … }
void SdpOfferAnswerHandler::OnOperationsChainEmpty() { … }
absl::optional<bool> SdpOfferAnswerHandler::is_caller() const { … }
bool SdpOfferAnswerHandler::HasNewIceCredentials() { … }
bool SdpOfferAnswerHandler::IceRestartPending(
const std::string& content_name) const { … }
bool SdpOfferAnswerHandler::NeedsIceRestart(
const std::string& content_name) const { … }
absl::optional<rtc::SSLRole> SdpOfferAnswerHandler::GetDtlsRole(
const std::string& mid) const { … }
void SdpOfferAnswerHandler::UpdateNegotiationNeeded() { … }
void SdpOfferAnswerHandler::AllocateSctpSids() { … }
absl::optional<rtc::SSLRole> SdpOfferAnswerHandler::GuessSslRole() const { … }
bool SdpOfferAnswerHandler::CheckIfNegotiationIsNeeded() { … }
void SdpOfferAnswerHandler::GenerateNegotiationNeededEvent() { … }
RTCError SdpOfferAnswerHandler::ValidateSessionDescription(
const SessionDescriptionInterface* sdesc,
cricket::ContentSource source,
const std::map<std::string, const cricket::ContentGroup*>&
bundle_groups_by_mid) { … }
RTCError SdpOfferAnswerHandler::UpdateTransceiversAndDataChannels(
cricket::ContentSource source,
const SessionDescriptionInterface& new_session,
const SessionDescriptionInterface* old_local_description,
const SessionDescriptionInterface* old_remote_description,
const std::map<std::string, const cricket::ContentGroup*>&
bundle_groups_by_mid) { … }
RTCErrorOr<rtc::scoped_refptr<RtpTransceiverProxyWithInternal<RtpTransceiver>>>
SdpOfferAnswerHandler::AssociateTransceiver(
cricket::ContentSource source,
SdpType type,
size_t mline_index,
const ContentInfo& content,
const ContentInfo* old_local_content,
const ContentInfo* old_remote_content) { … }
RTCError SdpOfferAnswerHandler::UpdateTransceiverChannel(
rtc::scoped_refptr<RtpTransceiverProxyWithInternal<RtpTransceiver>>
transceiver,
const cricket::ContentInfo& content,
const cricket::ContentGroup* bundle_group) { … }
RTCError SdpOfferAnswerHandler::UpdateDataChannelTransport(
cricket::ContentSource source,
const cricket::ContentInfo& content,
const cricket::ContentGroup* bundle_group) { … }
bool SdpOfferAnswerHandler::ExpectSetLocalDescription(SdpType type) { … }
bool SdpOfferAnswerHandler::ExpectSetRemoteDescription(SdpType type) { … }
void SdpOfferAnswerHandler::FillInMissingRemoteMids(
cricket::SessionDescription* new_remote_description) { … }
rtc::scoped_refptr<RtpTransceiverProxyWithInternal<RtpTransceiver>>
SdpOfferAnswerHandler::FindAvailableTransceiverToReceive(
cricket::MediaType media_type) const { … }
const cricket::ContentInfo*
SdpOfferAnswerHandler::FindMediaSectionForTransceiver(
const RtpTransceiver* transceiver,
const SessionDescriptionInterface* sdesc) const { … }
void SdpOfferAnswerHandler::GetOptionsForOffer(
const PeerConnectionInterface::RTCOfferAnswerOptions& offer_answer_options,
cricket::MediaSessionOptions* session_options) { … }
void SdpOfferAnswerHandler::GetOptionsForPlanBOffer(
const PeerConnectionInterface::RTCOfferAnswerOptions& offer_answer_options,
cricket::MediaSessionOptions* session_options) { … }
void SdpOfferAnswerHandler::GetOptionsForUnifiedPlanOffer(
const RTCOfferAnswerOptions& offer_answer_options,
cricket::MediaSessionOptions* session_options) { … }
void SdpOfferAnswerHandler::GetOptionsForAnswer(
const RTCOfferAnswerOptions& offer_answer_options,
cricket::MediaSessionOptions* session_options) { … }
void SdpOfferAnswerHandler::GetOptionsForPlanBAnswer(
const PeerConnectionInterface::RTCOfferAnswerOptions& offer_answer_options,
cricket::MediaSessionOptions* session_options) { … }
void SdpOfferAnswerHandler::GetOptionsForUnifiedPlanAnswer(
const PeerConnectionInterface::RTCOfferAnswerOptions& offer_answer_options,
cricket::MediaSessionOptions* session_options) { … }
const char* SdpOfferAnswerHandler::SessionErrorToString(
SessionError error) const { … }
std::string SdpOfferAnswerHandler::GetSessionErrorMsg() { … }
void SdpOfferAnswerHandler::SetSessionError(SessionError error,
const std::string& error_desc) { … }
RTCError SdpOfferAnswerHandler::HandleLegacyOfferOptions(
const PeerConnectionInterface::RTCOfferAnswerOptions& options) { … }
void SdpOfferAnswerHandler::RemoveRecvDirectionFromReceivingTransceiversOfType(
cricket::MediaType media_type) { … }
void SdpOfferAnswerHandler::AddUpToOneReceivingTransceiverOfType(
cricket::MediaType media_type) { … }
std::vector<rtc::scoped_refptr<RtpTransceiverProxyWithInternal<RtpTransceiver>>>
SdpOfferAnswerHandler::GetReceivingTransceiversOfType(
cricket::MediaType media_type) { … }
void SdpOfferAnswerHandler::ProcessRemovalOfRemoteTrack(
rtc::scoped_refptr<RtpTransceiverProxyWithInternal<RtpTransceiver>>
transceiver,
std::vector<rtc::scoped_refptr<RtpTransceiverInterface>>* remove_list,
std::vector<rtc::scoped_refptr<MediaStreamInterface>>* removed_streams) { … }
void SdpOfferAnswerHandler::RemoveRemoteStreamsIfEmpty(
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& remote_streams,
std::vector<rtc::scoped_refptr<MediaStreamInterface>>* removed_streams) { … }
void SdpOfferAnswerHandler::RemoveSenders(cricket::MediaType media_type) { … }
void SdpOfferAnswerHandler::UpdateLocalSenders(
const std::vector<cricket::StreamParams>& streams,
cricket::MediaType media_type) { … }
void SdpOfferAnswerHandler::UpdateRemoteSendersList(
const cricket::StreamParamsVec& streams,
bool default_sender_needed,
cricket::MediaType media_type,
StreamCollection* new_streams) { … }
void SdpOfferAnswerHandler::EnableSending() { … }
RTCError SdpOfferAnswerHandler::PushdownMediaDescription(
SdpType type,
cricket::ContentSource source,
const std::map<std::string, const cricket::ContentGroup*>&
bundle_groups_by_mid) { … }
RTCError SdpOfferAnswerHandler::PushdownTransportDescription(
cricket::ContentSource source,
SdpType type) { … }
void SdpOfferAnswerHandler::RemoveStoppedTransceivers() { … }
void SdpOfferAnswerHandler::RemoveUnusedChannels(
const SessionDescription* desc) { … }
void SdpOfferAnswerHandler::UpdateEndedRemoteMediaStreams() { … }
bool SdpOfferAnswerHandler::UseCandidatesInRemoteDescription() { … }
bool SdpOfferAnswerHandler::UseCandidate(
const IceCandidateInterface* candidate) { … }
bool SdpOfferAnswerHandler::ReadyToUseRemoteCandidate(
const IceCandidateInterface* candidate,
const SessionDescriptionInterface* remote_desc,
bool* valid) { … }
RTCErrorOr<const cricket::ContentInfo*> SdpOfferAnswerHandler::FindContentInfo(
const SessionDescriptionInterface* description,
const IceCandidateInterface* candidate) { … }
RTCError SdpOfferAnswerHandler::CreateChannels(const SessionDescription& desc) { … }
void SdpOfferAnswerHandler::DestroyMediaChannels() { … }
void SdpOfferAnswerHandler::GenerateMediaDescriptionOptions(
const SessionDescriptionInterface* session_desc,
RtpTransceiverDirection audio_direction,
RtpTransceiverDirection video_direction,
absl::optional<size_t>* audio_index,
absl::optional<size_t>* video_index,
absl::optional<size_t>* data_index,
cricket::MediaSessionOptions* session_options) { … }
cricket::MediaDescriptionOptions
SdpOfferAnswerHandler::GetMediaDescriptionOptionsForActiveData(
const std::string& mid) const { … }
cricket::MediaDescriptionOptions
SdpOfferAnswerHandler::GetMediaDescriptionOptionsForRejectedData(
const std::string& mid) const { … }
bool SdpOfferAnswerHandler::UpdatePayloadTypeDemuxingState(
cricket::ContentSource source,
const std::map<std::string, const cricket::ContentGroup*>&
bundle_groups_by_mid) { … }
bool SdpOfferAnswerHandler::ConfiguredForMedia() const { … }
}