diff --git a/README.md b/README.md index de3266765..9b5514fa0 100755 --- a/README.md +++ b/README.md @@ -850,7 +850,7 @@ The ports used by SRS: * v1.0, 2014-03-01, modularity, extract core/kernel/rtmp/app/main module. * v1.0, 2014-02-28, support arm build(SRS/ST), add ssl to 3rdparty package. * v1.0, 2014-02-28, add wiki [BuildArm][v4_CN_Build], [FFMPEG][v4_CN_FFMPEG], [Reload][v4_CN_Reload] -* v1.0, 2014-02-27, add wiki [LowLatency][v4_CN_LowLatency], [HTTPCallback][v4_CN_HTTPCallback], [ServerSideScript][v4_CN_ServerSideScript], [IDE][v4_CN_IDE] +* v1.0, 2014-02-27, add wiki [LowLatency][v4_CN_LowLatency], [HTTPCallback][v4_CN_HTTPCallback] * v1.0, 2014-01-19, add wiki [DeliveryHLS][v4_CN_DeliveryHLS] * v1.0, 2014-01-12, add wiki [HowToAskQuestion][v4_CN_HowToAskQuestion], [RtmpUrlVhost][v4_CN_RtmpUrlVhost] * v1.0, 2014-01-11, fix jw/flower player pause bug, which send closeStream actually. @@ -1573,9 +1573,7 @@ Winlin [v4_CN_RaspberryPi]: https://github.com/ossrs/srs/wiki/v4_CN_RaspberryPi [v4_CN_LowLatency#merged-read]: https://github.com/ossrs/srs/wiki/v4_CN_LowLatency#merged-read [v4_CN_Product]: https://github.com/ossrs/srs/wiki/v4_CN_Product -[v4_CN_ServerSideScript]: https://github.com/ossrs/srs/wiki/v4_CN_ServerSideScript [v4_EN_LowLatency#merged-write]: https://github.com/ossrs/srs/wiki/v4_EN_LowLatency#merged-write -[v4_CN_IDE]: https://github.com/ossrs/srs/wiki/v4_CN_IDE [v4_CN_LowLatency#merged-write]: https://github.com/ossrs/srs/wiki/v4_CN_LowLatency#merged-write [v4_CN_NgExec]:https://github.com/ossrs/srs/wiki/v4_CN_NgExec [v4_EN_NgExec]:https://github.com/ossrs/srs/wiki/v4_EN_NgExec diff --git a/trunk/src/app/srs_app_rtc_api.cpp b/trunk/src/app/srs_app_rtc_api.cpp index e18360403..ae77d9726 100644 --- a/trunk/src/app/srs_app_rtc_api.cpp +++ b/trunk/src/app/srs_app_rtc_api.cpp @@ -36,8 +36,6 @@ #include using namespace std; -uint32_t SrsGoApiRtcPlay::ssrc_num = 0; - SrsGoApiRtcPlay::SrsGoApiRtcPlay(SrsRtcServer* server) { server_ = server; @@ -260,159 +258,6 @@ srs_error_t SrsGoApiRtcPlay::check_remote_sdp(const SrsSdp& remote_sdp) return err; } -srs_error_t SrsGoApiRtcPlay::exchange_sdp(SrsRequest* req, const SrsSdp& remote_sdp, SrsSdp& local_sdp) -{ - srs_error_t err = srs_success; - local_sdp.version_ = "0"; - - local_sdp.username_ = RTMP_SIG_SRS_SERVER; - local_sdp.session_id_ = srs_int2str((int64_t)this); - local_sdp.session_version_ = "2"; - local_sdp.nettype_ = "IN"; - local_sdp.addrtype_ = "IP4"; - local_sdp.unicast_address_ = "0.0.0.0"; - - local_sdp.session_name_ = "SRSPlaySession"; - - local_sdp.msid_semantic_ = "WMS"; - local_sdp.msids_.push_back(req->app + "/" + req->stream); - - local_sdp.group_policy_ = "BUNDLE"; - - bool nack_enabled = _srs_config->get_rtc_nack_enabled(req->vhost); - - for (size_t i = 0; i < remote_sdp.media_descs_.size(); ++i) { - const SrsMediaDesc& remote_media_desc = remote_sdp.media_descs_[i]; - - if (remote_media_desc.is_audio()) { - local_sdp.media_descs_.push_back(SrsMediaDesc("audio")); - } else if (remote_media_desc.is_video()) { - local_sdp.media_descs_.push_back(SrsMediaDesc("video")); - } - - SrsMediaDesc& local_media_desc = local_sdp.media_descs_.back(); - - if (remote_media_desc.is_audio()) { - // TODO: check opus format specific param - std::vector payloads = remote_media_desc.find_media_with_encoding_name("opus"); - for (std::vector::iterator iter = payloads.begin(); iter != payloads.end(); ++iter) { - local_media_desc.payload_types_.push_back(*iter); - SrsMediaPayloadType& payload_type = local_media_desc.payload_types_.back(); - - // TODO: FIXME: Only support some transport algorithms. - vector rtcp_fb; - payload_type.rtcp_fb_.swap(rtcp_fb); - for (int j = 0; j < (int)rtcp_fb.size(); j++) { - if (nack_enabled) { - if (rtcp_fb.at(j) == "nack" || rtcp_fb.at(j) == "nack pli") { - payload_type.rtcp_fb_.push_back(rtcp_fb.at(j)); - } - } - } - - // Only choose one match opus. - break; - } - - if (local_media_desc.payload_types_.empty()) { - return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid opus payload type"); - } - } else if (remote_media_desc.is_video()) { - std::deque backup_payloads; - std::vector payloads = remote_media_desc.find_media_with_encoding_name("H264"); - for (std::vector::iterator iter = payloads.begin(); iter != payloads.end(); ++iter) { - if (iter->format_specific_param_.empty()) { - backup_payloads.push_front(*iter); - continue; - } - H264SpecificParam h264_param; - if ((err = srs_parse_h264_fmtp(iter->format_specific_param_, h264_param)) != srs_success) { - srs_error_reset(err); continue; - } - - // Try to pick the "best match" H.264 payload type. - if (h264_param.packetization_mode == "1" && h264_param.level_asymmerty_allow == "1") { - local_media_desc.payload_types_.push_back(*iter); - SrsMediaPayloadType& payload_type = local_media_desc.payload_types_.back(); - - // TODO: FIXME: Only support some transport algorithms. - vector rtcp_fb; - payload_type.rtcp_fb_.swap(rtcp_fb); - for (int j = 0; j < (int)rtcp_fb.size(); j++) { - if (nack_enabled) { - if (rtcp_fb.at(j) == "nack" || rtcp_fb.at(j) == "nack pli") { - payload_type.rtcp_fb_.push_back(rtcp_fb.at(j)); - } - } - } - - // Only choose first match H.264 payload type. - break; - } - - backup_payloads.push_back(*iter); - } - - // Try my best to pick at least one media payload type. - if (local_media_desc.payload_types_.empty() && ! backup_payloads.empty()) { - srs_warn("choose backup H.264 payload type=%d", backup_payloads.front().payload_type_); - local_media_desc.payload_types_.push_back(backup_payloads.front()); - } - - if (local_media_desc.payload_types_.empty()) { - return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid H.264 payload type"); - } - } - - local_media_desc.mid_ = remote_media_desc.mid_; - local_sdp.groups_.push_back(local_media_desc.mid_); - - local_media_desc.port_ = 9; - local_media_desc.protos_ = "UDP/TLS/RTP/SAVPF"; - - if (remote_media_desc.session_info_.setup_ == "active") { - local_media_desc.session_info_.setup_ = "passive"; - } else if (remote_media_desc.session_info_.setup_ == "passive") { - local_media_desc.session_info_.setup_ = "active"; - } else if (remote_media_desc.session_info_.setup_ == "actpass") { - local_media_desc.session_info_.setup_ = local_sdp.session_config_.dtls_role; - } else { - // @see: https://tools.ietf.org/html/rfc4145#section-4.1 - // The default value of the setup attribute in an offer/answer exchange - // is 'active' in the offer and 'passive' in the answer. - local_media_desc.session_info_.setup_ = "passive"; - } - - if (remote_media_desc.sendonly_) { - local_media_desc.recvonly_ = true; - } else if (remote_media_desc.recvonly_) { - local_media_desc.sendonly_ = true; - } else if (remote_media_desc.sendrecv_) { - local_media_desc.sendrecv_ = true; - } - - local_media_desc.rtcp_mux_ = true; - local_media_desc.rtcp_rsize_ = true; - - // TODO: FIXME: Avoid SSRC collision. - if (!ssrc_num) { - ssrc_num = ::getpid() * 10000 + ::getpid() * 100 + ::getpid(); - } - - if (local_media_desc.sendonly_ || local_media_desc.sendrecv_) { - SrsSSRCInfo ssrc_info; - ssrc_info.ssrc_ = ++ssrc_num; - // TODO:use formated cname - ssrc_info.cname_ = "stream"; - local_media_desc.ssrc_infos_.push_back(ssrc_info); - } - } - - return err; -} - -uint32_t SrsGoApiRtcPublish::ssrc_num = 0; - SrsGoApiRtcPublish::SrsGoApiRtcPublish(SrsRtcServer* server) { server_ = server; @@ -625,170 +470,6 @@ srs_error_t SrsGoApiRtcPublish::check_remote_sdp(const SrsSdp& remote_sdp) return err; } -srs_error_t SrsGoApiRtcPublish::exchange_sdp(SrsRequest* req, const SrsSdp& remote_sdp, SrsSdp& local_sdp) -{ - srs_error_t err = srs_success; - local_sdp.version_ = "0"; - - local_sdp.username_ = RTMP_SIG_SRS_SERVER; - local_sdp.session_id_ = srs_int2str((int64_t)this); - local_sdp.session_version_ = "2"; - local_sdp.nettype_ = "IN"; - local_sdp.addrtype_ = "IP4"; - local_sdp.unicast_address_ = "0.0.0.0"; - - local_sdp.session_name_ = "SRSPublishSession"; - - local_sdp.msid_semantic_ = "WMS"; - local_sdp.msids_.push_back(req->app + "/" + req->stream); - - local_sdp.group_policy_ = "BUNDLE"; - - bool nack_enabled = _srs_config->get_rtc_nack_enabled(req->vhost); - bool twcc_enabled = _srs_config->get_rtc_twcc_enabled(req->vhost); - - for (size_t i = 0; i < remote_sdp.media_descs_.size(); ++i) { - const SrsMediaDesc& remote_media_desc = remote_sdp.media_descs_[i]; - - if (remote_media_desc.is_audio()) { - local_sdp.media_descs_.push_back(SrsMediaDesc("audio")); - } else if (remote_media_desc.is_video()) { - local_sdp.media_descs_.push_back(SrsMediaDesc("video")); - } - - SrsMediaDesc& local_media_desc = local_sdp.media_descs_.back(); - - // Whether feature enabled in remote extmap. - int remote_twcc_id = 0; - if (true) { - map extmaps = remote_media_desc.get_extmaps(); - for(map::iterator it = extmaps.begin(); it != extmaps.end(); ++it) { - if (it->second == kTWCCExt) { - remote_twcc_id = it->first; - break; - } - } - } - if (twcc_enabled && remote_twcc_id) { - local_media_desc.extmaps_[remote_twcc_id] = kTWCCExt; - } - - if (remote_media_desc.is_audio()) { - // TODO: check opus format specific param - std::vector payloads = remote_media_desc.find_media_with_encoding_name("opus"); - for (std::vector::iterator iter = payloads.begin(); iter != payloads.end(); ++iter) { - local_media_desc.payload_types_.push_back(*iter); - SrsMediaPayloadType& payload_type = local_media_desc.payload_types_.back(); - - // TODO: FIXME: Only support some transport algorithms. - vector rtcp_fb; - payload_type.rtcp_fb_.swap(rtcp_fb); - for (int j = 0; j < (int)rtcp_fb.size(); j++) { - if (nack_enabled) { - if (rtcp_fb.at(j) == "nack" || rtcp_fb.at(j) == "nack pli") { - payload_type.rtcp_fb_.push_back(rtcp_fb.at(j)); - } - } - if (twcc_enabled && remote_twcc_id) { - if (rtcp_fb.at(j) == "transport-cc") { - payload_type.rtcp_fb_.push_back(rtcp_fb.at(j)); - } - } - } - - // Only choose one match opus. - break; - } - - if (local_media_desc.payload_types_.empty()) { - return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found opus payload type"); - } - - } else if (remote_media_desc.is_video()) { - std::deque backup_payloads; - std::vector payloads = remote_media_desc.find_media_with_encoding_name("H264"); - for (std::vector::iterator iter = payloads.begin(); iter != payloads.end(); ++iter) { - if (iter->format_specific_param_.empty()) { - backup_payloads.push_front(*iter); - continue; - } - H264SpecificParam h264_param; - if ((err = srs_parse_h264_fmtp(iter->format_specific_param_, h264_param)) != srs_success) { - srs_error_reset(err); continue; - } - - // Try to pick the "best match" H.264 payload type. - if (h264_param.packetization_mode == "1" && h264_param.level_asymmerty_allow == "1") { - local_media_desc.payload_types_.push_back(*iter); - SrsMediaPayloadType& payload_type = local_media_desc.payload_types_.back(); - - // TODO: FIXME: Only support some transport algorithms. - vector rtcp_fb; - payload_type.rtcp_fb_.swap(rtcp_fb); - for (int j = 0; j < (int)rtcp_fb.size(); j++) { - if (nack_enabled) { - if (rtcp_fb.at(j) == "nack" || rtcp_fb.at(j) == "nack pli") { - payload_type.rtcp_fb_.push_back(rtcp_fb.at(j)); - } - } - if (twcc_enabled && remote_twcc_id) { - if (rtcp_fb.at(j) == "transport-cc") { - payload_type.rtcp_fb_.push_back(rtcp_fb.at(j)); - } - } - } - - // Only choose first match H.264 payload type. - break; - } - - backup_payloads.push_back(*iter); - } - - // Try my best to pick at least one media payload type. - if (local_media_desc.payload_types_.empty() && ! backup_payloads.empty()) { - srs_warn("choose backup H.264 payload type=%d", backup_payloads.front().payload_type_); - local_media_desc.payload_types_.push_back(backup_payloads.front()); - } - - if (local_media_desc.payload_types_.empty()) { - return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid H.264 payload type"); - } - - // TODO: FIXME: Support RRTR? - //local_media_desc.payload_types_.back().rtcp_fb_.push_back("rrtr"); - } - - local_media_desc.mid_ = remote_media_desc.mid_; - local_sdp.groups_.push_back(local_media_desc.mid_); - - local_media_desc.port_ = 9; - local_media_desc.protos_ = "UDP/TLS/RTP/SAVPF"; - - if (remote_media_desc.session_info_.setup_ == "active") { - local_media_desc.session_info_.setup_ = "passive"; - } else if (remote_media_desc.session_info_.setup_ == "passive") { - local_media_desc.session_info_.setup_ = "active"; - } else if (remote_media_desc.session_info_.setup_ == "actpass") { - local_media_desc.session_info_.setup_ = local_sdp.session_config_.dtls_role; - } else { - // @see: https://tools.ietf.org/html/rfc4145#section-4.1 - // The default value of the setup attribute in an offer/answer exchange - // is 'active' in the offer and 'passive' in the answer. - local_media_desc.session_info_.setup_ = "passive"; - } - - local_media_desc.rtcp_mux_ = true; - - // For publisher, we are always sendonly. - local_media_desc.sendonly_ = false; - local_media_desc.recvonly_ = true; - local_media_desc.sendrecv_ = false; - } - - return err; -} - SrsGoApiRtcNACK::SrsGoApiRtcNACK(SrsRtcServer* server) { server_ = server; diff --git a/trunk/src/app/srs_app_rtc_api.hpp b/trunk/src/app/srs_app_rtc_api.hpp index c7bc6596b..53db46346 100644 --- a/trunk/src/app/srs_app_rtc_api.hpp +++ b/trunk/src/app/srs_app_rtc_api.hpp @@ -34,8 +34,6 @@ class SrsSdp; class SrsGoApiRtcPlay : public ISrsHttpHandler { -public: - static uint32_t ssrc_num; private: SrsRtcServer* server_; public: @@ -45,14 +43,11 @@ public: virtual srs_error_t serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r); private: virtual srs_error_t do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, SrsJsonObject* res); - srs_error_t exchange_sdp(SrsRequest* req, const SrsSdp& remote_sdp, SrsSdp& local_sdp); srs_error_t check_remote_sdp(const SrsSdp& remote_sdp); }; class SrsGoApiRtcPublish : public ISrsHttpHandler { -public: - static uint32_t ssrc_num; private: SrsRtcServer* server_; public: @@ -62,7 +57,6 @@ public: virtual srs_error_t serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r); private: virtual srs_error_t do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, SrsJsonObject* res); - srs_error_t exchange_sdp(SrsRequest* req, const SrsSdp& remote_sdp, SrsSdp& local_sdp); srs_error_t check_remote_sdp(const SrsSdp& remote_sdp); }; diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 44eec8dc1..8535e8636 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -26,6 +26,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 121 +#define VERSION_REVISION 122 #endif