Hi,
This CL will support negotiation of RTCP Mux feature. Earlier we were by default enabling and assuming remote end point will support this feature as well. This will also remove the maintaining of transport channels in WebRtcSession. Its left to cricket::Transport Review URL: http://webrtc-codereview.appspot.com/131005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@472 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
bd4494cb20
commit
92bace1faf
@ -145,6 +145,13 @@ bool BuildMediaMessage(
|
|||||||
Append(params, "label", 1); // always audio 1
|
Append(params, "label", 1); // always audio 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const cricket::MediaContentDescription* media_info =
|
||||||
|
static_cast<const cricket::MediaContentDescription*> (
|
||||||
|
content_info.description);
|
||||||
|
if (media_info->rtcp_mux()) {
|
||||||
|
Append(params, "rtcp_mux", std::string("supported"));
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<Json::Value> rtpmap;
|
std::vector<Json::Value> rtpmap;
|
||||||
if (!BuildRtpMapParams(content_info, video, &rtpmap)) {
|
if (!BuildRtpMapParams(content_info, video, &rtpmap)) {
|
||||||
return false;
|
return false;
|
||||||
@ -214,8 +221,10 @@ bool BuildAttributes(const std::vector<cricket::Candidate>& candidates,
|
|||||||
std::vector<cricket::Candidate>::const_iterator iter_end =
|
std::vector<cricket::Candidate>::const_iterator iter_end =
|
||||||
candidates.end();
|
candidates.end();
|
||||||
for (; iter != iter_end; ++iter) {
|
for (; iter != iter_end; ++iter) {
|
||||||
if ((video && !iter->name().compare("video_rtp")) ||
|
if ((video && (!iter->name().compare("video_rtcp") ||
|
||||||
(!video && !iter->name().compare("rtp"))) {
|
(!iter->name().compare("video_rtp")))) ||
|
||||||
|
(!video && (!iter->name().compare("rtp") ||
|
||||||
|
(!iter->name().compare("rtcp"))))) {
|
||||||
Json::Value candidate;
|
Json::Value candidate;
|
||||||
Append(&candidate, "component", kIceComponent);
|
Append(&candidate, "component", kIceComponent);
|
||||||
Append(&candidate, "foundation", kIceFoundation);
|
Append(&candidate, "foundation", kIceFoundation);
|
||||||
@ -270,10 +279,8 @@ bool ParseJSONSignalingMessage(const std::string& signaling_message,
|
|||||||
cricket::AudioContentDescription* audio_content =
|
cricket::AudioContentDescription* audio_content =
|
||||||
new cricket::AudioContentDescription();
|
new cricket::AudioContentDescription();
|
||||||
ParseAudioCodec(mlines[i], audio_content);
|
ParseAudioCodec(mlines[i], audio_content);
|
||||||
|
|
||||||
// enabling RTCP mux by default at both ends, without
|
audio_content->set_rtcp_mux(ParseRTCPMux(mlines[i]));
|
||||||
// exchanging it through signaling message.
|
|
||||||
audio_content->set_rtcp_mux(true);
|
|
||||||
audio_content->SortCodecs();
|
audio_content->SortCodecs();
|
||||||
sdp->AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP, audio_content);
|
sdp->AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP, audio_content);
|
||||||
ParseICECandidates(mlines[i], candidates);
|
ParseICECandidates(mlines[i], candidates);
|
||||||
@ -282,9 +289,7 @@ bool ParseJSONSignalingMessage(const std::string& signaling_message,
|
|||||||
new cricket::VideoContentDescription();
|
new cricket::VideoContentDescription();
|
||||||
ParseVideoCodec(mlines[i], video_content);
|
ParseVideoCodec(mlines[i], video_content);
|
||||||
|
|
||||||
// enabling RTCP mux by default at both ends, without
|
video_content->set_rtcp_mux(ParseRTCPMux(mlines[i]));
|
||||||
// exchanging it through signaling message.
|
|
||||||
video_content->set_rtcp_mux(true);
|
|
||||||
video_content->SortCodecs();
|
video_content->SortCodecs();
|
||||||
sdp->AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP, video_content);
|
sdp->AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP, video_content);
|
||||||
ParseICECandidates(mlines[i], candidates);
|
ParseICECandidates(mlines[i], candidates);
|
||||||
@ -293,6 +298,16 @@ bool ParseJSONSignalingMessage(const std::string& signaling_message,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ParseRTCPMux(const Json::Value& value) {
|
||||||
|
Json::Value rtcp_mux(ReadValue(value, "rtcp_mux"));
|
||||||
|
if (!rtcp_mux.empty()) {
|
||||||
|
if (rtcp_mux.asString().compare("supported") == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool ParseAudioCodec(const Json::Value& value,
|
bool ParseAudioCodec(const Json::Value& value,
|
||||||
cricket::AudioContentDescription* content) {
|
cricket::AudioContentDescription* content) {
|
||||||
std::vector<Json::Value> rtpmap(ReadValues(value, "rtpmap"));
|
std::vector<Json::Value> rtpmap(ReadValues(value, "rtpmap"));
|
||||||
@ -421,6 +436,7 @@ void Append(Json::Value* object, const std::string& key, bool value) {
|
|||||||
void Append(Json::Value* object, const std::string& key, char * value) {
|
void Append(Json::Value* object, const std::string& key, char * value) {
|
||||||
(*object)[key] = Json::Value(value);
|
(*object)[key] = Json::Value(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Append(Json::Value* object, const std::string& key, double value) {
|
void Append(Json::Value* object, const std::string& key, double value) {
|
||||||
(*object)[key] = Json::Value(value);
|
(*object)[key] = Json::Value(value);
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#define TALK_APP_WEBRTC_WEBRTC_JSON_H_
|
#define TALK_APP_WEBRTC_WEBRTC_JSON_H_
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#ifdef WEBRTC_RELATIVE_PATH
|
#ifdef WEBRTC_RELATIVE_PATH
|
||||||
#include "json/json.h"
|
#include "json/json.h"
|
||||||
@ -100,6 +101,7 @@ bool ParseVideoCodec(const Json::Value& value,
|
|||||||
cricket::VideoContentDescription* content);
|
cricket::VideoContentDescription* content);
|
||||||
bool ParseICECandidates(const Json::Value& value,
|
bool ParseICECandidates(const Json::Value& value,
|
||||||
std::vector<cricket::Candidate>* candidates);
|
std::vector<cricket::Candidate>* candidates);
|
||||||
|
bool ParseRTCPMux(const Json::Value& value);
|
||||||
Json::Value ReadValue(const Json::Value& value, const std::string& key);
|
Json::Value ReadValue(const Json::Value& value, const std::string& key);
|
||||||
std::string ReadString(const Json::Value& value, const std::string& key);
|
std::string ReadString(const Json::Value& value, const std::string& key);
|
||||||
double ReadDouble(const Json::Value& value, const std::string& key);
|
double ReadDouble(const Json::Value& value, const std::string& key);
|
||||||
|
@ -128,7 +128,7 @@ bool WebRtcSession::CreateVoiceChannel(const std::string& stream_id) {
|
|||||||
|
|
||||||
// RTCP disabled
|
// RTCP disabled
|
||||||
cricket::VoiceChannel* voice_channel =
|
cricket::VoiceChannel* voice_channel =
|
||||||
channel_manager_->CreateVoiceChannel(this, stream_id, false);
|
channel_manager_->CreateVoiceChannel(this, stream_id, true);
|
||||||
ASSERT(voice_channel != NULL);
|
ASSERT(voice_channel != NULL);
|
||||||
stream_info->channel = voice_channel;
|
stream_info->channel = voice_channel;
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ bool WebRtcSession::CreateVideoChannel(const std::string& stream_id) {
|
|||||||
|
|
||||||
// RTCP disabled
|
// RTCP disabled
|
||||||
cricket::VideoChannel* video_channel =
|
cricket::VideoChannel* video_channel =
|
||||||
channel_manager_->CreateVideoChannel(this, stream_id, false, NULL);
|
channel_manager_->CreateVideoChannel(this, stream_id, true, NULL);
|
||||||
ASSERT(video_channel != NULL);
|
ASSERT(video_channel != NULL);
|
||||||
stream_info->channel = video_channel;
|
stream_info->channel = video_channel;
|
||||||
|
|
||||||
@ -170,17 +170,6 @@ cricket::TransportChannel* WebRtcSession::CreateChannel(
|
|||||||
cricket::TransportChannel* transport_channel =
|
cricket::TransportChannel* transport_channel =
|
||||||
transport_->CreateChannel(name, type);
|
transport_->CreateChannel(name, type);
|
||||||
ASSERT(transport_channel != NULL);
|
ASSERT(transport_channel != NULL);
|
||||||
transport_channels_[name] = transport_channel;
|
|
||||||
|
|
||||||
StreamMap::iterator iter;
|
|
||||||
for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
|
|
||||||
StreamInfo* stream_info = (*iter);
|
|
||||||
if (stream_info->stream_id.compare(content_name) == 0) {
|
|
||||||
ASSERT(!stream_info->channel);
|
|
||||||
stream_info->transport = transport_channel;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return transport_channel;
|
return transport_channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,13 +178,7 @@ cricket::TransportChannel* WebRtcSession::GetChannel(
|
|||||||
if (!transport_)
|
if (!transport_)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
StreamMap::iterator iter;
|
return transport_->GetChannel(name);
|
||||||
for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
|
|
||||||
if (content_name.compare((*iter)->stream_id) == 0) {
|
|
||||||
return (*iter)->transport;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebRtcSession::DestroyChannel(
|
void WebRtcSession::DestroyChannel(
|
||||||
@ -204,14 +187,6 @@ void WebRtcSession::DestroyChannel(
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
transport_->DestroyChannel(name);
|
transport_->DestroyChannel(name);
|
||||||
|
|
||||||
StreamMap::iterator iter;
|
|
||||||
for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
|
|
||||||
if (content_name.compare((*iter)->stream_id) == 0) {
|
|
||||||
(*iter)->transport = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebRtcSession::OnMessage(talk_base::Message* message) {
|
void WebRtcSession::OnMessage(talk_base::Message* message) {
|
||||||
@ -496,68 +471,6 @@ bool WebRtcSession::OnRemoteDescription(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebRtcSession::OnStreamDeleteMessage(
|
|
||||||
const cricket::SessionDescription* desc,
|
|
||||||
const std::vector<cricket::Candidate>& candidates) {
|
|
||||||
// This will be called when session is in connected state
|
|
||||||
// In this state session expects signaling message for any removed
|
|
||||||
// streamed by the peer.
|
|
||||||
// check for candidates port, if its equal to 0, remove that stream
|
|
||||||
// and provide callback OnRemoveStream else keep as it is
|
|
||||||
|
|
||||||
SetState(STATE_RECEIVEDTERMINATE);
|
|
||||||
for (size_t i = 0; i < candidates.size(); ++i) {
|
|
||||||
if (candidates[i].address().port() == 0) {
|
|
||||||
RemoveStreamOnRequest(candidates[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const cricket::ContentInfo* video_content = GetFirstVideoContent(desc);
|
|
||||||
if (video_content) {
|
|
||||||
SignalRemoveStream(video_content->name, true);
|
|
||||||
} else {
|
|
||||||
const cricket::ContentInfo* audio_content = GetFirstAudioContent(desc);
|
|
||||||
if (audio_content) {
|
|
||||||
SignalRemoveStream(audio_content->name, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebRtcSession::RemoveStreamOnRequest(
|
|
||||||
const cricket::Candidate& candidate) {
|
|
||||||
// 1. Get Transport corresponding to candidate name
|
|
||||||
// 2. Get StreamInfo for the transport found in step 1
|
|
||||||
// 3. call ChannelManager Destroy voice/video method
|
|
||||||
//
|
|
||||||
TransportChannelMap::iterator iter =
|
|
||||||
transport_channels_.find(candidate.name());
|
|
||||||
if (iter == transport_channels_.end()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cricket::TransportChannel* transport = iter->second;
|
|
||||||
std::vector<StreamInfo*>::iterator siter;
|
|
||||||
for (siter = streams_.begin(); siter != streams_.end(); ++siter) {
|
|
||||||
StreamInfo* stream_info = (*siter);
|
|
||||||
if (stream_info->transport == transport) {
|
|
||||||
if (!stream_info->video) {
|
|
||||||
cricket::VoiceChannel* channel = static_cast<cricket::VoiceChannel*> (
|
|
||||||
stream_info->channel);
|
|
||||||
channel->Enable(false);
|
|
||||||
channel_manager_->DestroyVoiceChannel(channel);
|
|
||||||
} else {
|
|
||||||
cricket::VideoChannel* channel = static_cast<cricket::VideoChannel*> (
|
|
||||||
stream_info->channel);
|
|
||||||
channel->Enable(false);
|
|
||||||
channel_manager_->DestroyVideoChannel(channel);
|
|
||||||
}
|
|
||||||
streams_.erase(siter);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cricket::SessionDescription* WebRtcSession::CreateOffer() {
|
cricket::SessionDescription* WebRtcSession::CreateOffer() {
|
||||||
cricket::SessionDescription* offer = new cricket::SessionDescription();
|
cricket::SessionDescription* offer = new cricket::SessionDescription();
|
||||||
StreamMap::iterator iter;
|
StreamMap::iterator iter;
|
||||||
@ -626,9 +539,8 @@ cricket::SessionDescription* WebRtcSession::CreateAnswer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// enabling RTCP mux by default at both ends, without
|
// RTCP mux is set based on what present in incoming offer
|
||||||
// exchanging it through signaling message.
|
audio_accept->set_rtcp_mux(audio_offer->rtcp_mux());
|
||||||
audio_accept->set_rtcp_mux(true);
|
|
||||||
audio_accept->SortCodecs();
|
audio_accept->SortCodecs();
|
||||||
answer->AddContent(audio_content->name, audio_content->type, audio_accept);
|
answer->AddContent(audio_content->name, audio_content->type, audio_accept);
|
||||||
}
|
}
|
||||||
@ -656,9 +568,8 @@ cricket::SessionDescription* WebRtcSession::CreateAnswer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// enabling RTCP mux by default at both ends, without
|
// RTCP mux is set based on what present in incoming offer
|
||||||
// exchanging it through signaling message.
|
video_accept->set_rtcp_mux(video_offer->rtcp_mux());
|
||||||
video_accept->set_rtcp_mux(true);
|
|
||||||
video_accept->SortCodecs();
|
video_accept->SortCodecs();
|
||||||
answer->AddContent(video_content->name, video_content->type, video_accept);
|
answer->AddContent(video_content->name, video_content->type, video_accept);
|
||||||
}
|
}
|
||||||
|
@ -143,16 +143,13 @@ class WebRtcSession : public cricket::BaseSession {
|
|||||||
struct StreamInfo {
|
struct StreamInfo {
|
||||||
explicit StreamInfo(const std::string stream_id)
|
explicit StreamInfo(const std::string stream_id)
|
||||||
: channel(NULL),
|
: channel(NULL),
|
||||||
transport(NULL),
|
|
||||||
video(false),
|
video(false),
|
||||||
stream_id(stream_id) {}
|
stream_id(stream_id) {}
|
||||||
|
|
||||||
StreamInfo()
|
StreamInfo()
|
||||||
: channel(NULL),
|
: channel(NULL),
|
||||||
transport(NULL),
|
|
||||||
video(false) {}
|
video(false) {}
|
||||||
cricket::BaseChannel* channel;
|
cricket::BaseChannel* channel;
|
||||||
cricket::TransportChannel* transport;
|
|
||||||
bool video;
|
bool video;
|
||||||
std::string stream_id;
|
std::string stream_id;
|
||||||
};
|
};
|
||||||
@ -202,9 +199,6 @@ class WebRtcSession : public cricket::BaseSession {
|
|||||||
typedef std::map<std::string, cricket::TransportChannel*> TransportChannelMap;
|
typedef std::map<std::string, cricket::TransportChannel*> TransportChannelMap;
|
||||||
|
|
||||||
bool SetVideoCapture(bool capture);
|
bool SetVideoCapture(bool capture);
|
||||||
bool OnStreamDeleteMessage(const cricket::SessionDescription* desc,
|
|
||||||
const std::vector<cricket::Candidate>& candidates);
|
|
||||||
void RemoveStreamOnRequest(const cricket::Candidate& candidate);
|
|
||||||
void EnableAllStreams();
|
void EnableAllStreams();
|
||||||
|
|
||||||
cricket::Transport* transport_;
|
cricket::Transport* transport_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user