From f2d45442c115a614e733f439288feffd6bb9e00a Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 19 Jan 2021 15:56:42 +0800 Subject: [PATCH] RTC: Refine RTP packet decoder to track and stream --- trunk/src/app/srs_app_rtc_conn.cpp | 11 ++--------- trunk/src/app/srs_app_rtc_source.cpp | 27 +++++++++++++++++++++++++++ trunk/src/app/srs_app_rtc_source.hpp | 9 +++++++-- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 81ea393f8..f339d707e 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1310,16 +1310,9 @@ void SrsRtcPublishStream::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer SrsRtcVideoRecvTrack* video_track = get_video_track(ssrc); if (audio_track) { - *ppayload = new SrsRtpRawPayload(); + audio_track->on_before_decode_payload(pkt, buf, ppayload); } else if (video_track) { - uint8_t v = (uint8_t)pkt->nalu_type; - if (v == kStapA) { - *ppayload = new SrsRtpSTAPPayload(); - } else if (v == kFuA) { - *ppayload = new SrsRtpFUAPayload2(); - } else { - *ppayload = new SrsRtpRawPayload(); - } + video_track->on_before_decode_payload(pkt, buf, ppayload); } } diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 979078b15..9213d2676 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1831,6 +1831,16 @@ SrsRtcAudioRecvTrack::~SrsRtcAudioRecvTrack() { } +void SrsRtcAudioRecvTrack::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload) +{ + // No payload, ignore. + if (buf->empty()) { + return; + } + + *ppayload = new SrsRtpRawPayload(); +} + srs_error_t SrsRtcAudioRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt) { srs_error_t err = srs_success; @@ -1875,6 +1885,23 @@ SrsRtcVideoRecvTrack::~SrsRtcVideoRecvTrack() { } +void SrsRtcVideoRecvTrack::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload) +{ + // No payload, ignore. + if (buf->empty()) { + return; + } + + uint8_t v = (uint8_t)pkt->nalu_type; + if (v == kStapA) { + *ppayload = new SrsRtpSTAPPayload(); + } else if (v == kFuA) { + *ppayload = new SrsRtpFUAPayload2(); + } else { + *ppayload = new SrsRtpRawPayload(); + } +} + srs_error_t SrsRtcVideoRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt) { srs_error_t err = srs_success; diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index bd6328aa7..78564b30c 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -36,6 +36,7 @@ #include #include #include +#include class SrsRequest; class SrsMetaCache; @@ -531,21 +532,25 @@ protected: virtual srs_error_t do_check_send_nacks(uint32_t& timeout_nacks); }; -class SrsRtcAudioRecvTrack : public SrsRtcRecvTrack +class SrsRtcAudioRecvTrack : virtual public SrsRtcRecvTrack, virtual public ISrsRtpPacketDecodeHandler { public: SrsRtcAudioRecvTrack(SrsRtcConnection* session, SrsRtcTrackDescription* track_desc); virtual ~SrsRtcAudioRecvTrack(); +public: + virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload); public: virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt); virtual srs_error_t check_send_nacks(); }; -class SrsRtcVideoRecvTrack : public SrsRtcRecvTrack +class SrsRtcVideoRecvTrack : virtual public SrsRtcRecvTrack, virtual public ISrsRtpPacketDecodeHandler { public: SrsRtcVideoRecvTrack(SrsRtcConnection* session, SrsRtcTrackDescription* stream_descs); virtual ~SrsRtcVideoRecvTrack(); +public: + virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload); public: virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt); virtual srs_error_t check_send_nacks();