diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index f0c9d18e6..27dd2a903 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -866,6 +866,7 @@ SrsRtcPublishStream::SrsRtcPublishStream(SrsRtcConnection* session, const SrsCon pt_to_drop_ = 0; nn_audio_frames = 0; + twcc_enabled_ = false; twcc_id_ = 0; twcc_fb_count_ = 0; @@ -930,7 +931,7 @@ srs_error_t SrsRtcPublishStream::initialize(SrsRequest* r, SrsRtcStreamDescripti media_ssrc = desc->ssrc_; break; } - if (twcc_id != -1) { + if (twcc_id > 0) { twcc_id_ = twcc_id; extension_types_.register_by_uri(twcc_id_, kTWCCExt); rtcp_twcc_.set_media_ssrc(media_ssrc); @@ -941,6 +942,11 @@ srs_error_t SrsRtcPublishStream::initialize(SrsRequest* r, SrsRtcStreamDescripti pt_to_drop_ = (uint16_t)_srs_config->get_rtc_drop_for_pt(req->vhost); twcc_enabled_ = _srs_config->get_rtc_twcc_enabled(req->vhost); + // No TWCC when negotiate, disable it. + if (twcc_id <= 0) { + twcc_enabled_ = false; + } + srs_trace("RTC publisher nack=%d, nnc=%d, pt-drop=%u, twcc=%u/%d", nack_enabled_, nack_no_copy_, pt_to_drop_, twcc_enabled_, twcc_id); // Setup tracks. @@ -3116,6 +3122,7 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRequest* req, SrsRtcS //negotiate audio media if(NULL != req_stream_desc->audio_track_desc_) { SrsRtcTrackDescription* req_audio_track = req_stream_desc->audio_track_desc_; + int remote_twcc_id = req_audio_track->get_rtp_extension_id(kTWCCExt); src_track_descs = source->get_track_desc("audio", "opus"); if (src_track_descs.size() > 0) { @@ -3131,6 +3138,11 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRequest* req, SrsRtcS track->red_->pt_ = req_audio_track->red_->pt_; } + track->del_rtp_extension_desc(kTWCCExt); + if (remote_twcc_id > 0) { + track->add_rtp_extension_desc(remote_twcc_id, kTWCCExt); + } + track->mid_ = req_audio_track->mid_; sub_relations.insert(make_pair(track->ssrc_, track)); track->set_direction("sendonly"); @@ -3143,6 +3155,8 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRequest* req, SrsRtcS src_track_descs = source->get_track_desc("video", "h264"); for(int i = 0; i < (int)req_video_tracks.size(); ++i) { SrsRtcTrackDescription* req_video = req_video_tracks.at(i); + int remote_twcc_id = req_video->get_rtp_extension_id(kTWCCExt); + for(int j = 0; j < (int)src_track_descs.size(); ++j) { SrsRtcTrackDescription* src_video = src_track_descs.at(j); if(req_video->id_ == src_video->id_) { @@ -3158,6 +3172,11 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRequest* req, SrsRtcS track->red_->pt_ = req_video->red_->pt_; } + track->del_rtp_extension_desc(kTWCCExt); + if (remote_twcc_id > 0) { + track->add_rtp_extension_desc(remote_twcc_id, kTWCCExt); + } + track->mid_ = req_video->mid_; sub_relations.insert(make_pair(track->ssrc_, track)); track->set_direction("sendonly"); diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index cc328b176..96a6bcc18 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1583,6 +1583,16 @@ void SrsRtcTrackDescription::add_rtp_extension_desc(int id, std::string uri) extmaps_[id] = uri; } +void SrsRtcTrackDescription::del_rtp_extension_desc(std::string uri) +{ + for(std::map::iterator it = extmaps_.begin(); it != extmaps_.end(); ++it) { + if(uri == it->second) { + extmaps_.erase(it++); + break; + } + } +} + void SrsRtcTrackDescription::set_direction(std::string direction) { direction_ = direction; @@ -1630,7 +1640,7 @@ void SrsRtcTrackDescription::set_mid(std::string mid) int SrsRtcTrackDescription::get_rtp_extension_id(std::string uri) { - for(std::map::iterator it = extmaps_.begin(); it != extmaps_.end(); ++it) { + for (std::map::iterator it = extmaps_.begin(); it != extmaps_.end(); ++it) { if(uri == it->second) { return it->first; } diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index 8f29946f3..f22bffc27 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -439,6 +439,7 @@ public: bool has_ssrc(uint32_t ssrc); public: void add_rtp_extension_desc(int id, std::string uri); + void del_rtp_extension_desc(std::string uri); void set_direction(std::string direction); void set_codec_payload(SrsCodecPayload* payload); // auxiliary paylod include red, rtx, ulpfec.