nsresult PeerConnectionMedia::ActivateOrRemoveTransports(const JsepSession& aSession, const bool forceIceTcp) { for (const auto& transceiver : aSession.GetTransceivers()) { if (!transceiver->HasLevel()) { continue; } std::string ufrag; std::string pwd; std::vector<std::string> candidates; size_t components = 0; RefPtr<JsepTransport> transport = transceiver->mTransport; unsigned level = transceiver->GetLevel(); if (transport->mComponents && (!transceiver->HasBundleLevel() || (transceiver->BundleLevel() == level))) { CSFLogDebug(LOGTAG, "ACTIVATING TRANSPORT! - PC %s: level=%u components=%u", mParentHandle.c_str(), (unsigned)level, (unsigned)transport->mComponents); ufrag = transport->mIce->GetUfrag(); pwd = transport->mIce->GetPassword(); candidates = transport->mIce->GetCandidates(); components = transport->mComponents; if (forceIceTcp) { candidates.erase(std::remove_if(candidates.begin(), candidates.end(), [](const std::string & s) { return s.find(" UDP ") != std::string::npos || s.find(" udp ") != std::string::npos; }), candidates.end()); } } RUN_ON_THREAD( GetSTSThread(), WrapRunnable(RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::ActivateOrRemoveTransport_s, transceiver->GetLevel(), components, ufrag, pwd, candidates), NS_DISPATCH_NORMAL); } // We can have more streams than m-lines due to rollback. RUN_ON_THREAD( GetSTSThread(), WrapRunnable(RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::RemoveTransportsAtOrAfter_s, aSession.GetTransceivers().size()), NS_DISPATCH_NORMAL); return NS_OK; }
void PeerConnectionMedia::StartIceChecks(const JsepSession& session) { std::vector<size_t> numComponentsByLevel; auto transports = session.GetTransports(); for (size_t i = 0; i < transports.size(); ++i) { RefPtr<JsepTransport> transport = transports[i]; if (transport->mState == JsepTransport::kJsepTransportClosed) { CSFLogDebug(logTag, "Transport %s is disabled", transport->mTransportId.c_str()); numComponentsByLevel.push_back(0); // Make sure the MediaPipelineFactory doesn't try to use these. RemoveTransportFlow(i, false); RemoveTransportFlow(i, true); } else { CSFLogDebug(logTag, "Transport %s has %u components", transport->mTransportId.c_str(), static_cast<unsigned>(transport->mComponents)); numComponentsByLevel.push_back(transport->mComponents); } } nsCOMPtr<nsIRunnable> runnable( WrapRunnable( RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::StartIceChecks_s, session.IsIceControlling(), session.RemoteIsIceLite(), // Copy, just in case API changes to return a ref std::vector<std::string>(session.GetIceOptions()), numComponentsByLevel)); PerformOrEnqueueIceCtxOperation(runnable); }
void PeerConnectionMedia::StartIceChecks(const JsepSession& aSession) { nsCOMPtr<nsIRunnable> runnable( WrapRunnable( RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::StartIceChecks_s, aSession.IsIceControlling(), aSession.RemoteIsIceLite(), // Copy, just in case API changes to return a ref std::vector<std::string>(aSession.GetIceOptions()))); PerformOrEnqueueIceCtxOperation(runnable); }
nsresult PeerConnectionMedia::UpdateMediaPipelines( const JsepSession& session) { auto trackPairs = session.GetNegotiatedTrackPairs(); MediaPipelineFactory factory(this); nsresult rv; for (auto i = trackPairs.begin(); i != trackPairs.end(); ++i) { JsepTrackPair pair = *i; if (pair.mReceiving) { rv = factory.CreateOrUpdateMediaPipeline(pair, *pair.mReceiving); if (NS_FAILED(rv)) { return rv; } } if (pair.mSending) { rv = factory.CreateOrUpdateMediaPipeline(pair, *pair.mSending); if (NS_FAILED(rv)) { return rv; } } } for (auto& stream : mRemoteSourceStreams) { stream->StartReceiving(); } return NS_OK; }
nsresult PeerConnectionMedia::UpdateTransceiverTransports(const JsepSession& aSession) { for (const auto& transceiver : aSession.GetTransceivers()) { nsresult rv = UpdateTransportFlows(*transceiver); if (NS_FAILED(rv)) { return rv; } } for (const auto& transceiverImpl : mTransceivers) { transceiverImpl->UpdateTransport(*this); } return NS_OK; }
void PeerConnectionMedia::EnsureTransports(const JsepSession& aSession) { auto transports = aSession.GetTransports(); for (size_t i = 0; i < transports.size(); ++i) { RefPtr<JsepTransport> transport = transports[i]; RUN_ON_THREAD( GetSTSThread(), WrapRunnable(RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::EnsureTransport_s, i, transport->mComponents), NS_DISPATCH_NORMAL); } GatherIfReady(); }
void PeerConnectionMedia::ActivateOrRemoveTransports(const JsepSession& aSession) { auto transports = aSession.GetTransports(); for (size_t i = 0; i < transports.size(); ++i) { RefPtr<JsepTransport> transport = transports[i]; std::string ufrag; std::string pwd; std::vector<std::string> candidates; if (transport->mComponents) { MOZ_ASSERT(transport->mIce); CSFLogDebug(logTag, "Transport %u is active", static_cast<unsigned>(i)); ufrag = transport->mIce->GetUfrag(); pwd = transport->mIce->GetPassword(); candidates = transport->mIce->GetCandidates(); } else { CSFLogDebug(logTag, "Transport %u is disabled", static_cast<unsigned>(i)); // Make sure the MediaPipelineFactory doesn't try to use these. RemoveTransportFlow(i, false); RemoveTransportFlow(i, true); } RUN_ON_THREAD( GetSTSThread(), WrapRunnable(RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::ActivateOrRemoveTransport_s, i, transport->mComponents, ufrag, pwd, candidates), NS_DISPATCH_NORMAL); } // We can have more streams than m-lines due to rollback. RUN_ON_THREAD( GetSTSThread(), WrapRunnable(RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::RemoveTransportsAtOrAfter_s, transports.size()), NS_DISPATCH_NORMAL); }
void PeerConnectionMedia::EnsureTransports(const JsepSession& aSession) { for (const auto& transceiver : aSession.GetTransceivers()) { if (!transceiver->HasLevel()) { continue; } RefPtr<JsepTransport> transport = transceiver->mTransport; RUN_ON_THREAD( GetSTSThread(), WrapRunnable(RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::EnsureTransport_s, transceiver->GetLevel(), transport->mComponents), NS_DISPATCH_NORMAL); } GatherIfReady(); }
void PeerConnectionMedia::UpdateTransports(const JsepSession& session, bool restartGathering) { auto transports = session.GetTransports(); for (size_t i = 0; i < transports.size(); ++i) { RefPtr<JsepTransport> transport = transports[i]; std::string ufrag; std::string pwd; std::vector<std::string> candidates; bool hasAttrs = false; if (transport->mIce) { CSFLogDebug(logTag, "Transport %u is active", static_cast<unsigned>(i)); hasAttrs = true; ufrag = transport->mIce->GetUfrag(); pwd = transport->mIce->GetPassword(); candidates = transport->mIce->GetCandidates(); } // Update the transport. RUN_ON_THREAD(GetSTSThread(), WrapRunnable(RefPtr<PeerConnectionMedia>(this), &PeerConnectionMedia::UpdateIceMediaStream_s, i, transport->mComponents, hasAttrs, ufrag, pwd, candidates), NS_DISPATCH_NORMAL); } if (restartGathering) { GatherIfReady(); } }