|
|
|
@ -624,76 +624,6 @@ srs_error_t SrsRtcServer::do_create_session(
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsRtcServer::create_session2(SrsRequest* req, SrsSdp& local_sdp, const std::string& mock_eip, bool unified_plan, SrsRtcConnection** psession)
|
|
|
|
|
{
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
SrsContextId cid = _srs_context->get_id();
|
|
|
|
|
|
|
|
|
|
std::string local_pwd = srs_random_str(32);
|
|
|
|
|
// TODO: FIXME: Collision detect.
|
|
|
|
|
std::string local_ufrag = srs_random_str(8);
|
|
|
|
|
|
|
|
|
|
SrsRtcConnection* session = new SrsRtcConnection(this, cid);
|
|
|
|
|
// first add player for negotiate local sdp media info
|
|
|
|
|
if ((err = session->add_player2(req, unified_plan, local_sdp)) != srs_success) {
|
|
|
|
|
srs_freep(session);
|
|
|
|
|
return srs_error_wrap(err, "add player2");
|
|
|
|
|
}
|
|
|
|
|
*psession = session;
|
|
|
|
|
|
|
|
|
|
local_sdp.set_dtls_role("actpass");
|
|
|
|
|
local_sdp.set_ice_ufrag(local_ufrag);
|
|
|
|
|
local_sdp.set_ice_pwd(local_pwd);
|
|
|
|
|
local_sdp.set_fingerprint_algo("sha-256");
|
|
|
|
|
local_sdp.set_fingerprint(_srs_rtc_dtls_certificate->get_fingerprint());
|
|
|
|
|
|
|
|
|
|
// We allows to mock the eip of server.
|
|
|
|
|
if (!mock_eip.empty()) {
|
|
|
|
|
string host;
|
|
|
|
|
int port = _srs_config->get_rtc_server_listen();
|
|
|
|
|
srs_parse_hostport(mock_eip, host, port);
|
|
|
|
|
|
|
|
|
|
local_sdp.add_candidate(host, port, "host");
|
|
|
|
|
srs_trace("RTC: Use candidate mock_eip %s as %s:%d", mock_eip.c_str(), host.c_str(), port);
|
|
|
|
|
} else {
|
|
|
|
|
std::vector<string> candidate_ips = get_candidate_ips();
|
|
|
|
|
for (int i = 0; i < (int)candidate_ips.size(); ++i) {
|
|
|
|
|
local_sdp.add_candidate(candidate_ips[i], _srs_config->get_rtc_server_listen(), "host");
|
|
|
|
|
}
|
|
|
|
|
srs_trace("RTC: Use candidates %s", srs_join_vector_string(candidate_ips, ", ").c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
session->set_local_sdp(local_sdp);
|
|
|
|
|
session->set_state(WAITING_ANSWER);
|
|
|
|
|
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsRtcServer::setup_session2(SrsRtcConnection* session, SrsRequest* req, const SrsSdp& remote_sdp)
|
|
|
|
|
{
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
if (session->state() != WAITING_ANSWER) {
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: FIXME: Collision detect.
|
|
|
|
|
string username = session->get_local_sdp()->get_ice_ufrag() + ":" + remote_sdp.get_ice_ufrag();
|
|
|
|
|
|
|
|
|
|
if ((err = session->initialize(req, true, true, username)) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "init");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// We allows username is optional, but it never empty here.
|
|
|
|
|
_srs_rtc_manager->add_with_name(username, session);
|
|
|
|
|
|
|
|
|
|
session->set_remote_sdp(remote_sdp);
|
|
|
|
|
session->set_state(WAITING_STUN);
|
|
|
|
|
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SrsRtcConnection* SrsRtcServer::find_session_by_username(const std::string& username)
|
|
|
|
|
{
|
|
|
|
|
ISrsResource* conn = _srs_rtc_manager->find_by_name(username);
|
|
|
|
|