From c30565b4c0588e531925f5702be33f3a951c9725 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 16 Jun 2020 16:41:04 +0800 Subject: [PATCH] RTC: Support keep original seq --- trunk/conf/full.conf | 4 +++ trunk/src/app/srs_app_config.cpp | 21 +++++++++++++- trunk/src/app/srs_app_config.hpp | 1 + trunk/src/app/srs_app_rtc_conn.cpp | 14 +++++++--- trunk/src/app/srs_app_rtc_conn.hpp | 2 ++ trunk/src/app/srs_app_rtc_source.cpp | 42 +++++++++++++++++----------- trunk/src/app/srs_app_rtc_source.hpp | 2 ++ 7 files changed, 64 insertions(+), 22 deletions(-) diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index fb3dc6f4a..9844f51bd 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -491,6 +491,10 @@ vhost rtc.vhost.srs.com { # The strick check when process stun. # default: off stun_strict_check on; + # Whether keep original sequence number. + # If off, we will regenerate the sequence number for RTP packet. + # default: off + keep_sequence off; } # whether enable min delay mode for vhost. # default: on, for RTC. diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index ebd55c380..36ccf02c3 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -3937,7 +3937,8 @@ srs_error_t SrsConfig::check_normal_config() } else if (n == "rtc") { for (int j = 0; j < (int)conf->directives.size(); j++) { string m = conf->at(j)->name; - if (m != "enabled" && m != "bframe" && m != "aac" && m != "stun_timeout" && m != "stun_strict_check") { + if (m != "enabled" && m != "bframe" && m != "aac" && m != "stun_timeout" && m != "stun_strict_check" + && m != "keep_sequence") { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal vhost.rtc.%s of %s", m.c_str(), vhost->arg0().c_str()); } } @@ -5020,6 +5021,24 @@ bool SrsConfig::get_rtc_stun_strict_check(string vhost) return SRS_CONF_PERFER_FALSE(conf->arg0()); } +bool SrsConfig::get_rtc_keep_sequence(string vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = get_rtc(vhost); + + if (!conf) { + return DEFAULT; + } + + conf = conf->get("keep_sequence"); + if (!conf || conf->arg0().empty()) { + return DEFAULT; + } + + return SRS_CONF_PERFER_FALSE(conf->arg0()); +} + bool SrsConfig::get_rtc_nack_enabled(string vhost) { static bool DEFAULT = true; diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 32f0c381d..70ec389b6 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -544,6 +544,7 @@ public: bool get_rtc_aac_discard(std::string vhost); srs_utime_t get_rtc_stun_timeout(std::string vhost); bool get_rtc_stun_strict_check(std::string vhost); + bool get_rtc_keep_sequence(std::string vhost); bool get_rtc_nack_enabled(std::string vhost); bool get_rtc_twcc_enabled(std::string vhost); diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 66f02213a..06c3be170 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -505,6 +505,7 @@ SrsRtcPlayer::SrsRtcPlayer(SrsRtcSession* s, int parent_cid) nn_simulate_nack_drop = 0; nack_enabled_ = false; + keep_sequence_ = false; _srs_config->subscribe(this); } @@ -530,8 +531,9 @@ srs_error_t SrsRtcPlayer::initialize(const uint32_t& vssrc, const uint32_t& assr // TODO: FIXME: Support reload. nack_enabled_ = _srs_config->get_rtc_nack_enabled(session_->req->vhost); - srs_trace("RTC publisher video(ssrc=%d, pt=%d), audio(ssrc=%d, pt=%d), nack=%d", - video_ssrc, video_payload_type, audio_ssrc, audio_payload_type, nack_enabled_); + keep_sequence_ = _srs_config->get_rtc_keep_sequence(session_->req->vhost); + srs_trace("RTC publisher video(ssrc=%d, pt=%d), audio(ssrc=%d, pt=%d), nack=%d, keep-seq=%d", + video_ssrc, video_payload_type, audio_ssrc, audio_payload_type, nack_enabled_, keep_sequence_); if (_srs_rtc_hijacker) { if ((err = _srs_rtc_hijacker->on_start_play(session_, this, session_->req)) != srs_success) { @@ -708,7 +710,9 @@ srs_error_t SrsRtcPlayer::send_packets(SrsRtcSource* source, const vectoris_audio()) { info.nn_audios++; - pkt->header.set_sequence(audio_sequence++); + if (!keep_sequence_) { + pkt->header.set_sequence(audio_sequence++); + } pkt->header.set_ssrc(audio_ssrc); pkt->header.set_payload_type(audio_payload_type); @@ -721,7 +725,9 @@ srs_error_t SrsRtcPlayer::send_packets(SrsRtcSource* source, const vectorheader.set_sequence(video_sequence++); + if (!keep_sequence_) { + pkt->header.set_sequence(video_sequence++); + } pkt->header.set_ssrc(video_ssrc); pkt->header.set_payload_type(video_payload_type); } diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index fac2775b2..b4ebe2075 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -213,6 +213,8 @@ private: bool realtime; // Whether enabled nack. bool nack_enabled_; + // Whether keep original sequence number. + bool keep_sequence_; public: SrsRtcPlayer(SrsRtcSession* s, int parent_cid); virtual ~SrsRtcPlayer(); diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 0e5675a7d..ac62ed417 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -425,6 +425,8 @@ SrsRtcFromRtmpBridger::SrsRtcFromRtmpBridger(SrsRtcSource* source) merge_nalus = false; meta = new SrsMetaCache(); audio_timestamp = 0; + audio_sequence = 0; + video_sequence = 0; } SrsRtcFromRtmpBridger::~SrsRtcFromRtmpBridger() @@ -593,6 +595,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_opus(char* data, int size, SrsRtpPack SrsRtpPacket2* pkt = new SrsRtpPacket2(); pkt->frame_type = SrsFrameTypeAudio; pkt->header.set_marker(true); + pkt->header.set_sequence(audio_sequence++); pkt->header.set_timestamp(audio_timestamp); // TODO: FIXME: Why 960? Need Refactoring? @@ -654,25 +657,25 @@ srs_error_t SrsRtcFromRtmpBridger::on_video(SrsSharedPtrMessage* msg) if ((err = package_nalus(msg, samples, pkts)) != srs_success) { return srs_error_wrap(err, "package nalus as one"); } - } - - // By default, we package each NALU(sample) to a RTP or FUA packet. - for (int i = 0; i < nn_samples; i++) { - SrsSample* sample = samples[i]; - - // We always ignore bframe here, if config to discard bframe, - // the bframe flag will not be set. - if (sample->bframe) { - continue; - } + } else { + // By default, we package each NALU(sample) to a RTP or FUA packet. + for (int i = 0; i < nn_samples; i++) { + SrsSample* sample = samples[i]; - if (sample->size <= kRtpMaxPayloadSize) { - if ((err = package_single_nalu(msg, sample, pkts)) != srs_success) { - return srs_error_wrap(err, "package single nalu"); + // We always ignore bframe here, if config to discard bframe, + // the bframe flag will not be set. + if (sample->bframe) { + continue; } - } else { - if ((err = package_fu_a(msg, sample, kRtpMaxPayloadSize, pkts)) != srs_success) { - return srs_error_wrap(err, "package fu-a"); + + if (sample->size <= kRtpMaxPayloadSize) { + if ((err = package_single_nalu(msg, sample, pkts)) != srs_success) { + return srs_error_wrap(err, "package single nalu"); + } + } else { + if ((err = package_fu_a(msg, sample, kRtpMaxPayloadSize, pkts)) != srs_success) { + return srs_error_wrap(err, "package fu-a"); + } } } } @@ -733,6 +736,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_stap_a(SrsRtcSource* source, SrsShare SrsRtpPacket2* pkt = new SrsRtpPacket2(); pkt->frame_type = SrsFrameTypeVideo; pkt->header.set_marker(false); + pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); SrsRtpSTAPPayload* stap = new SrsRtpSTAPPayload(); @@ -802,6 +806,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_nalus(SrsSharedPtrMessage* msg, const // Package NALUs in a single RTP packet. SrsRtpPacket2* pkt = new SrsRtpPacket2(); pkt->frame_type = SrsFrameTypeVideo; + pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); pkt->payload = raw; pkt->shared_msg = msg->copy(); @@ -831,6 +836,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_nalus(SrsSharedPtrMessage* msg, const SrsRtpPacket2* pkt = new SrsRtpPacket2(); pkt->frame_type = SrsFrameTypeVideo; + pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); fua->nri = (SrsAvcNaluType)header; @@ -856,6 +862,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_single_nalu(SrsSharedPtrMessage* msg, SrsRtpPacket2* pkt = new SrsRtpPacket2(); pkt->frame_type = SrsFrameTypeVideo; + pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); SrsRtpRawPayload* raw = new SrsRtpRawPayload(); @@ -885,6 +892,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_fu_a(SrsSharedPtrMessage* msg, SrsSam SrsRtpPacket2* pkt = new SrsRtpPacket2(); pkt->frame_type = SrsFrameTypeVideo; + pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); SrsRtpFUAPayload2* fua = new SrsRtpFUAPayload2(); diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index e21f6c828..cc9f74986 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -174,6 +174,8 @@ private: bool discard_bframe; bool merge_nalus; uint32_t audio_timestamp; + uint16_t audio_sequence; + uint16_t video_sequence; public: SrsRtcFromRtmpBridger(SrsRtcSource* source); virtual ~SrsRtcFromRtmpBridger();