From 77c958ad1c5f97a4d231d4af2bd204560e45d0b3 Mon Sep 17 00:00:00 2001 From: Winlin Date: Thu, 8 Jul 2021 09:54:55 +0800 Subject: [PATCH 1/4] RTC: Trim SDP line space for pion/webrtc client. (#2466) --- trunk/src/app/srs_app_rtc_sdp.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/trunk/src/app/srs_app_rtc_sdp.cpp b/trunk/src/app/srs_app_rtc_sdp.cpp index f14a36a03..e9e549393 100644 --- a/trunk/src/app/srs_app_rtc_sdp.cpp +++ b/trunk/src/app/srs_app_rtc_sdp.cpp @@ -747,6 +747,9 @@ srs_error_t SrsSdp::parse(const std::string& sdp_str) line.erase(line.size()-1, 1); } + // Strip the space of line, for pion WebRTC client. + line = srs_string_trim_end(line, " "); + if ((err = parse_line(line)) != srs_success) { return srs_error_wrap(err, "parse sdp line failed"); } From b121f5f58830ec5792053c4d40343e0c4053a485 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 8 Jul 2021 12:56:43 +0800 Subject: [PATCH 2/4] Update SRS 4.0 docker --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c1763725..87de127bb 100755 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ please set the CANDIDATE ([CN][v4_CN_WebRTC#config-candidate],[EN][v4_EN_WebRTC# ```bash docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \ --env CANDIDATE=$(ifconfig en0 inet| grep 'inet '|awk '{print $2}') -p 8000:8000/udp \ - ossrs/srs:v4.0.117 ./objs/srs -c conf/srs.conf + ossrs/srs:v4.0.139 ./objs/srs -c conf/srs.conf ``` From 10b9a81061f31cd20228244137a73cea528b5f34 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 8 Jul 2021 14:25:38 +0800 Subject: [PATCH 3/4] RTC: Support eip/candidate to set the eip of server --- trunk/research/players/js/srs.sdk.js | 8 ++++---- trunk/src/app/srs_app_rtc_api.cpp | 10 ++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/trunk/research/players/js/srs.sdk.js b/trunk/research/players/js/srs.sdk.js index 5151aebb4..1bfff4d1e 100644 --- a/trunk/research/players/js/srs.sdk.js +++ b/trunk/research/players/js/srs.sdk.js @@ -33,8 +33,8 @@ function SrsRtcPublisherAsync() { // webrtc://r.ossrs.net:11985/live/mystream // or set the api server to myapi.domain.com: // webrtc://myapi.domain.com/live/livestream - // or set the candidate(ip) of answer: - // webrtc://r.ossrs.net/live/livestream?eip=39.107.238.185 + // or set the candidate(eip) of answer: + // webrtc://r.ossrs.net/live/livestream?candidate=39.107.238.185 // or force to access https API: // webrtc://r.ossrs.net/live/livestream?schema=https // or use plaintext, without SRTP: @@ -272,8 +272,8 @@ function SrsRtcPlayerAsync() { // webrtc://r.ossrs.net:11985/live/mystream // or set the api server to myapi.domain.com: // webrtc://myapi.domain.com/live/livestream - // or set the candidate(ip) of answer: - // webrtc://r.ossrs.net/live/livestream?eip=39.107.238.185 + // or set the candidate(eip) of answer: + // webrtc://r.ossrs.net/live/livestream?candidate=39.107.238.185 // or force to access https API: // webrtc://r.ossrs.net/live/livestream?schema=https // or use plaintext, without SRTP: diff --git a/trunk/src/app/srs_app_rtc_api.cpp b/trunk/src/app/srs_app_rtc_api.cpp index dd43d5233..bbadedf0e 100644 --- a/trunk/src/app/srs_app_rtc_api.cpp +++ b/trunk/src/app/srs_app_rtc_api.cpp @@ -118,8 +118,11 @@ srs_error_t SrsGoApiRtcPlay::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMe srs_discovery_tc_url(tcUrl, schema, host, vhost, app, stream_name, port, param); } - // For client to specifies the EIP of server. + // For client to specifies the candidate(EIP) of server. string eip = r->query_get("eip"); + if (eip.empty()) { + eip = r->query_get("candidate"); + } string codec = r->query_get("codec"); // For client to specifies whether encrypt by SRTP. string srtp = r->query_get("encrypt"); @@ -338,8 +341,11 @@ srs_error_t SrsGoApiRtcPublish::do_serve_http(ISrsHttpResponseWriter* w, ISrsHtt srs_discovery_tc_url(tcUrl, schema, host, vhost, app, stream_name, port, param); } - // For client to specifies the EIP of server. + // For client to specifies the candidate(EIP) of server. string eip = r->query_get("eip"); + if (eip.empty()) { + eip = r->query_get("candidate"); + } string codec = r->query_get("codec"); srs_trace("RTC publish %s, api=%s, tid=%s, clientip=%s, app=%s, stream=%s, offer=%dB, eip=%s, codec=%s", From 90b7933dbb37283e6e4a7b9ea98e79574e19661f Mon Sep 17 00:00:00 2001 From: Haibo Chen <495810242@qq.com> Date: Thu, 8 Jul 2021 14:23:53 +0800 Subject: [PATCH 4/4] For #2403, fix padding packets for RTMP2RTC. 4.0.140. Calculate the correct payload_size which pure padding data, in the process of rtc2rtmp, make Chrome happy (#2461) * Calculate the correct payload_size which pure padding data, in the process of rtc2rtmp, make Chrome happy * make clear for magic number make clear for magic number * Update srs_app_rtc_source.cpp --- CHANGELOG.md | 1 + trunk/src/app/srs_app_rtc_source.cpp | 29 +++++++++++++++++++--------- trunk/src/core/srs_core_version4.hpp | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56519ef06..a62fc57a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2021-07-08, For [#2403](https://github.com/ossrs/srs/issues/2403), fix padding packets for RTMP2RTC. 4.0.140 * v4.0, 2021-07-04, For [#2424](https://github.com/ossrs/srs/issues/2424), use srandom/random to generate. 4.0.139 * v4.0, 2021-07-01, Merge [#2452](https://github.com/ossrs/srs/pull/2452), fix FFmpeg bug by updating channel_layout. 4.0.138 * v4.0, 2021-06-30, Merge [#2440](https://github.com/ossrs/srs/pull/2440), fix [#2390](https://github.com/ossrs/srs/issues/2390), SRT bug for zerolatency. 4.0.137 diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 9470d5594..d0e719217 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1517,8 +1517,7 @@ srs_error_t SrsRtmpFromRtcBridger::packet_video_rtmp(const uint16_t start, const { srs_error_t err = srs_success; - //type_codec1 + avc_type + composition time + nalu size + nalu - int nb_payload = 1 + 1 + 3; + int nb_payload = 0; uint16_t cnt = end - start + 1; for (uint16_t i = 0; i < cnt; ++i) { @@ -1527,7 +1526,7 @@ srs_error_t SrsRtmpFromRtcBridger::packet_video_rtmp(const uint16_t start, const SrsRtpPacket* pkt = cache_video_pkts_[index].pkt; // calculate nalu len SrsRtpFUAPayload2* fua_payload = dynamic_cast(pkt->payload()); - if (fua_payload) { + if (fua_payload && fua_payload->size > 0) { if (fua_payload->start) { nb_payload += 1 + 4; } @@ -1539,18 +1538,28 @@ srs_error_t SrsRtmpFromRtcBridger::packet_video_rtmp(const uint16_t start, const if (stap_payload) { for (int j = 0; j < (int)stap_payload->nalus.size(); ++j) { SrsSample* sample = stap_payload->nalus.at(j); - nb_payload += 4 + sample->size; + if (sample->size > 0) { + nb_payload += 4 + sample->size; + } } continue; } SrsRtpRawPayload* raw_payload = dynamic_cast(pkt->payload()); - if (raw_payload) { + if (raw_payload && raw_payload->nn_payload > 0) { nb_payload += 4 + raw_payload->nn_payload; continue; } } + if (0 == nb_payload) { + srs_warn("empty nalu"); + return err; + } + + //type_codec1 + avc_type + composition time + nalu size + nalu + nb_payload += 1 + 1 + 3; + SrsCommonMessage rtmp; SrsRtpPacket* header = cache_video_pkts_[cache_index(start)].pkt; rtmp.header.initialize_video(nb_payload, header->header.get_timestamp() / 90, 1); @@ -1578,7 +1587,7 @@ srs_error_t SrsRtmpFromRtcBridger::packet_video_rtmp(const uint16_t start, const cache_video_pkts_[index].sn = 0; SrsRtpFUAPayload2* fua_payload = dynamic_cast(pkt->payload()); - if (fua_payload) { + if (fua_payload && fua_payload->size > 0) { if (fua_payload->start) { nalu_len = fua_payload->size + 1; //skip 4 bytes to write nalu_len future @@ -1603,15 +1612,17 @@ srs_error_t SrsRtmpFromRtcBridger::packet_video_rtmp(const uint16_t start, const if (stap_payload) { for (int j = 0; j < (int)stap_payload->nalus.size(); ++j) { SrsSample* sample = stap_payload->nalus.at(j); - payload.write_4bytes(sample->size); - payload.write_bytes(sample->bytes, sample->size); + if (sample->size > 0) { + payload.write_4bytes(sample->size); + payload.write_bytes(sample->bytes, sample->size); + } } srs_freep(pkt); continue; } SrsRtpRawPayload* raw_payload = dynamic_cast(pkt->payload()); - if (raw_payload) { + if (raw_payload && raw_payload->nn_payload > 0) { payload.write_4bytes(raw_payload->nn_payload); payload.write_bytes(raw_payload->payload, raw_payload->nn_payload); srs_freep(pkt); diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 54605d270..932132f0a 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 139 +#define VERSION_REVISION 140 #endif