From 15955b6cdd6a94f5e8539e9297b1c5ef27819aca Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 4 May 2020 07:40:02 +0800 Subject: [PATCH 1/4] Refactor the RTP packet. --- trunk/src/app/srs_app_dtls.cpp | 4 ++-- trunk/src/app/srs_app_rtc_conn.cpp | 2 +- trunk/src/kernel/srs_kernel_rtp.cpp | 7 ------- trunk/src/kernel/srs_kernel_rtp.hpp | 6 +----- 4 files changed, 4 insertions(+), 15 deletions(-) diff --git a/trunk/src/app/srs_app_dtls.cpp b/trunk/src/app/srs_app_dtls.cpp index 2eb32ef6e..0b8767851 100644 --- a/trunk/src/app/srs_app_dtls.cpp +++ b/trunk/src/app/srs_app_dtls.cpp @@ -81,8 +81,8 @@ srs_error_t SrsDtls::init(SrsRequest* r) #if OPENSSL_VERSION_NUMBER < 0x10002000L // v1.0.2 dtls_ctx = SSL_CTX_new(DTLSv1_method()); #else - //dtls_ctx = SSL_CTX_new(DTLS_method()); - dtls_ctx = SSL_CTX_new(DTLSv1_method()); + dtls_ctx = SSL_CTX_new(DTLS_method()); + //dtls_ctx = SSL_CTX_new(DTLSv1_method()); //dtls_ctx = SSL_CTX_new(DTLSv1_2_method()); #endif diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 35ae6fef1..ff5fc051d 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1882,7 +1882,7 @@ srs_error_t SrsRtcPublisher::on_rtp(char* buf, int nb_buf) SrsRtpPacket2* pkt = new SrsRtpPacket2(); pkt->set_decode_handler(this); - pkt->set_original_bytes(buf, nb_buf); + pkt->original_bytes = buf; SrsBuffer b(buf, nb_buf); if ((err = pkt->decode(&b)) != srs_success) { diff --git a/trunk/src/kernel/srs_kernel_rtp.cpp b/trunk/src/kernel/srs_kernel_rtp.cpp index a27b2cdd4..8e175ab89 100644 --- a/trunk/src/kernel/srs_kernel_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtp.cpp @@ -287,7 +287,6 @@ SrsRtpPacket2::SrsRtpPacket2() cache_payload = 0; original_bytes = NULL; - nn_original_bytes = 0; nn_original_payload = 0; } @@ -355,12 +354,6 @@ void SrsRtpPacket2::set_decode_handler(ISrsRtpPacketDecodeHandler* h) decode_handler = h; } -void SrsRtpPacket2::set_original_bytes(char* buf, int nn_buf) -{ - original_bytes = buf; - nn_original_bytes = nn_buf; -} - int SrsRtpPacket2::nb_bytes() { if (!cache_payload) { diff --git a/trunk/src/kernel/srs_kernel_rtp.hpp b/trunk/src/kernel/srs_kernel_rtp.hpp index baaeb0281..5fbd759da 100644 --- a/trunk/src/kernel/srs_kernel_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtp.hpp @@ -114,6 +114,7 @@ public: int padding; // Decoder helper. public: + // TODO: FIXME: Move to video decoder queue SrsRtpVideoQueue. // Helper information for video decoder only. bool video_is_first_packet; bool video_is_last_packet; @@ -122,11 +123,8 @@ public: SrsAvcNaluType nalu_type; // The original payload bytes length. int nn_original_payload; -// Decoder helper. -private: // The original bytes for decoder only, we will free it. char* original_bytes; - int nn_original_bytes; // Fast cache for performance. private: // Cache frequently used payload for performance. @@ -151,8 +149,6 @@ public: SrsRtpFUAPayload2* reuse_fua(); // Set the decode handler. void set_decode_handler(ISrsRtpPacketDecodeHandler* h); - // Set the original bytes. - void set_original_bytes(char* buf, int nn_buf); // interface ISrsEncoder public: virtual int nb_bytes(); From f04e63edbfd64661aa426e63462f15ad8cddbb0d Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 4 May 2020 07:52:29 +0800 Subject: [PATCH 2/4] Refactor code, support NACK and NACK PLI in SDP --- trunk/src/app/srs_app_http_api.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 5516186e5..1004acc99 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -1033,6 +1033,11 @@ srs_error_t SrsGoApiRtcPlay::exchange_sdp(const std::string& app, const std::str // 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 (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 codec. break; @@ -1062,6 +1067,11 @@ srs_error_t SrsGoApiRtcPlay::exchange_sdp(const std::string& app, const std::str // 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 (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; @@ -1364,6 +1374,11 @@ srs_error_t SrsGoApiRtcPublish::exchange_sdp(const std::string& app, const std:: // 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 (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 codec. break; @@ -1394,6 +1409,11 @@ srs_error_t SrsGoApiRtcPublish::exchange_sdp(const std::string& app, const std:: // 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 (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; From d462b750fbd85d1b48a14af6792ff2cbc75e5b38 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 4 May 2020 08:14:37 +0800 Subject: [PATCH 3/4] Add TODO: Should not wait for NACK packets. --- trunk/src/app/srs_app_rtp_queue.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/trunk/src/app/srs_app_rtp_queue.cpp b/trunk/src/app/srs_app_rtp_queue.cpp index 3702e775f..4cbafc582 100644 --- a/trunk/src/app/srs_app_rtp_queue.cpp +++ b/trunk/src/app/srs_app_rtp_queue.cpp @@ -372,6 +372,7 @@ void SrsRtpAudioQueue::collect_frames(SrsRtpNackForReceiver* nack, vectorend; ++next) { SrsRtpPacket2* pkt = queue_->at(next); + // TODO: FIXME: Should not wait for NACK packets. // Not found or in NACK, stop collecting frame. if (!pkt || nack->find(next) != NULL) { srs_trace("wait for nack seq=%u", next); @@ -514,6 +515,7 @@ void SrsRtpVideoQueue::collect_frame(SrsRtpNackForReceiver* nack, SrsRtpPacket2* for (; next != queue_->end; ++next) { SrsRtpPacket2* pkt = queue_->at(next); + // TODO: FIXME: Should not wait for NACK packets. // Not found or in NACK, stop collecting frame. if (!pkt || nack->find(next) != NULL) { srs_trace("wait for nack seq=%u", next); From 4d33070c5970fe25ea63b7c24885d995ca73d11b Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 4 May 2020 14:47:58 +0800 Subject: [PATCH 4/4] Support NACK for RTC player --- trunk/research/players/rtc_player.html | 2 +- trunk/src/app/srs_app_http_api.cpp | 77 ++++++++++- trunk/src/app/srs_app_http_api.hpp | 13 ++ trunk/src/app/srs_app_listener.cpp | 2 +- trunk/src/app/srs_app_listener.hpp | 2 +- trunk/src/app/srs_app_rtc_conn.cpp | 177 ++++++++++++++++++++----- trunk/src/app/srs_app_rtc_conn.hpp | 46 ++++--- trunk/src/app/srs_app_rtp_queue.cpp | 1 + trunk/src/app/srs_app_server.cpp | 4 +- trunk/src/app/srs_app_source.cpp | 5 - trunk/src/kernel/srs_kernel_error.hpp | 2 + trunk/src/kernel/srs_kernel_rtp.cpp | 6 +- trunk/src/kernel/srs_kernel_rtp.hpp | 6 +- 13 files changed, 274 insertions(+), 69 deletions(-) diff --git a/trunk/research/players/rtc_player.html b/trunk/research/players/rtc_player.html index 28416fd4b..03d23bd13 100644 --- a/trunk/research/players/rtc_player.html +++ b/trunk/research/players/rtc_player.html @@ -46,7 +46,7 @@ - +