From 5f7de580958352e0825a43b4b9481cd07450839c Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 26 Jul 2020 22:58:22 +0800 Subject: [PATCH] RTC: Add stat for track. --- trunk/src/app/srs_app_rtc_source.cpp | 62 +++++++++++++++++++++++----- trunk/src/app/srs_app_rtc_source.hpp | 44 ++++++++++++++++++++ 2 files changed, 96 insertions(+), 10 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 11845c63f..7d45163e0 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1504,10 +1504,31 @@ SrsRtcTrackDescription* SrsRtcStreamDescription::find_track_description_by_ssrc( return NULL; } +SrsRtcTrackStatistic::SrsRtcTrackStatistic() +{ + last_written = 0; + packets = 0; + last_packets = 0; + bytes = 0; + last_bytes = 0; + nacks = 0; + last_nacks = 0; + padding_packets = 0; + last_padding_packets = 0; + padding_bytes = 0; + last_padding_bytes = 0; + replay_packets = 0; + last_replay_packets = 0; + replay_bytes = 0; + last_replay_bytes = 0; +} + SrsRtcRecvTrack::SrsRtcRecvTrack(SrsRtcConnection* session, SrsRtcTrackDescription* track_desc, bool is_audio) { session_ = session; track_desc_ = track_desc->copy(); + statistic_ = new SrsRtcTrackStatistic(); + if (is_audio) { rtp_queue_ = new SrsRtpRingBuffer(100); nack_receiver_ = new SrsRtpNackForReceiver(rtp_queue_, 100 * 2 / 3); @@ -1522,6 +1543,7 @@ SrsRtcRecvTrack::~SrsRtcRecvTrack() srs_freep(rtp_queue_); srs_freep(nack_receiver_); srs_freep(track_desc_); + srs_freep(statistic_); } bool SrsRtcRecvTrack::has_ssrc(uint32_t ssrc) @@ -1601,6 +1623,7 @@ srs_error_t SrsRtcRecvTrack::on_nack(SrsRtpPacket2* pkt) // send_nack uint32_t sent_nacks = 0; session_->check_send_nacks(nack_receiver_, ssrc, sent_nacks); + statistic_->nacks += sent_nacks; return err; } @@ -1691,16 +1714,20 @@ SrsRtcSendTrack::SrsRtcSendTrack(SrsRtcConnection* session, SrsRtcTrackDescripti { session_ = session; track_desc_ = track_desc->copy(); + statistic_ = new SrsRtcTrackStatistic(); + if (is_audio) { rtp_queue_ = new SrsRtpRingBuffer(100); } else { rtp_queue_ = new SrsRtpRingBuffer(1000); } } + SrsRtcSendTrack::~SrsRtcSendTrack() { srs_freep(rtp_queue_); srs_freep(track_desc_); + srs_freep(statistic_); } bool SrsRtcSendTrack::has_ssrc(uint32_t ssrc) @@ -1759,7 +1786,6 @@ srs_error_t SrsRtcAudioSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta return err; } - std::vector pkts; pkt->header.set_ssrc(track_desc_->ssrc_); // Put rtp packet to NACK/ARQ queue @@ -1768,15 +1794,22 @@ srs_error_t SrsRtcAudioSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta rtp_queue_->set(nack->header.get_sequence(), nack); } - pkts.push_back(pkt); - // Update stats. info.nn_bytes += pkt->nb_bytes(); info.nn_audios++; session_->stat_->nn_out_audios++; - if ((err = session_->do_send_packets(pkts, info)) != srs_success) { - return srs_error_wrap(err, "raw send"); + // track level statistic + statistic_->packets++; + statistic_->bytes += pkt->nb_bytes(); + + if (true) { + std::vector pkts; + pkts.push_back(pkt); + + if ((err = session_->do_send_packets(pkts, info)) != srs_success) { + return srs_error_wrap(err, "raw send"); + } } return err; @@ -1805,24 +1838,33 @@ srs_error_t SrsRtcVideoSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta if (!track_desc_->is_active_) { return err; } - - std::vector pkts; + + SrsRtcTrackStatistic* statistic = statistic_; pkt->header.set_ssrc(track_desc_->ssrc_); + // Put rtp packet to NACK/ARQ queue if (true) { SrsRtpPacket2* nack = pkt->copy(); rtp_queue_->set(nack->header.get_sequence(), nack); } - pkts.push_back(pkt); // Update stats. info.nn_bytes += pkt->nb_bytes(); info.nn_videos++; session_->stat_->nn_out_videos++; - if ((err = session_->do_send_packets(pkts, info)) != srs_success) { - return srs_error_wrap(err, "raw send"); + // track level statistic + statistic->packets++; + statistic->bytes += pkt->nb_bytes(); + + if (true) { + std::vector pkts; + pkts.push_back(pkt); + + if ((err = session_->do_send_packets(pkts, info)) != srs_success) { + return srs_error_wrap(err, "raw send"); + } } return err; diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index 0ae81a817..fcdcf699c 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -404,10 +404,52 @@ public: SrsRtcTrackDescription* find_track_description_by_ssrc(uint32_t ssrc); }; +class SrsRtcTrackStatistic +{ +public: + srs_utime_t last_written; + + // packets received or sent. + uint32_t packets; + // packets received or sent at last statistic time. + uint32_t last_packets; + // bytes received or sent. + uint64_t bytes; + // bytes received or sent at last statistic time. + uint32_t last_bytes; + + // nacks received or sent. + uint32_t nacks; + // nacks received or sent at last statistic time. + uint32_t last_nacks; + + // padding packets received or sent. + uint32_t padding_packets; + // padding packets received or sent at last statistic time. + uint32_t last_padding_packets; + // padding bytes received or sent. + uint32_t padding_bytes; + // padding bytes received or sent at last statistic time. + uint32_t last_padding_bytes; + + // replay packets received or sent. + uint32_t replay_packets; + // replay packets received or sent at last statistic time. + uint32_t last_replay_packets; + // replay bytes received or sent. + uint64_t replay_bytes; + // replay bytes received or sent at last statistic time. + uint64_t last_replay_bytes; + +public: + SrsRtcTrackStatistic(); +}; + class SrsRtcRecvTrack { protected: SrsRtcTrackDescription* track_desc_; + SrsRtcTrackStatistic* statistic_; SrsRtcConnection* session_; SrsRtpRingBuffer* rtp_queue_; @@ -458,7 +500,9 @@ class SrsRtcSendTrack protected: // send track description SrsRtcTrackDescription* track_desc_; + SrsRtcTrackStatistic* statistic_; + // The owner connection for this track. SrsRtcConnection* session_; // NACK ARQ ring buffer. SrsRtpRingBuffer* rtp_queue_;