1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

RTC: Add stat for track.

This commit is contained in:
winlin 2020-07-26 22:58:22 +08:00
parent 133e07e670
commit 5f7de58095
2 changed files with 96 additions and 10 deletions

View file

@ -1504,10 +1504,31 @@ SrsRtcTrackDescription* SrsRtcStreamDescription::find_track_description_by_ssrc(
return NULL; 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) SrsRtcRecvTrack::SrsRtcRecvTrack(SrsRtcConnection* session, SrsRtcTrackDescription* track_desc, bool is_audio)
{ {
session_ = session; session_ = session;
track_desc_ = track_desc->copy(); track_desc_ = track_desc->copy();
statistic_ = new SrsRtcTrackStatistic();
if (is_audio) { if (is_audio) {
rtp_queue_ = new SrsRtpRingBuffer(100); rtp_queue_ = new SrsRtpRingBuffer(100);
nack_receiver_ = new SrsRtpNackForReceiver(rtp_queue_, 100 * 2 / 3); nack_receiver_ = new SrsRtpNackForReceiver(rtp_queue_, 100 * 2 / 3);
@ -1522,6 +1543,7 @@ SrsRtcRecvTrack::~SrsRtcRecvTrack()
srs_freep(rtp_queue_); srs_freep(rtp_queue_);
srs_freep(nack_receiver_); srs_freep(nack_receiver_);
srs_freep(track_desc_); srs_freep(track_desc_);
srs_freep(statistic_);
} }
bool SrsRtcRecvTrack::has_ssrc(uint32_t ssrc) bool SrsRtcRecvTrack::has_ssrc(uint32_t ssrc)
@ -1601,6 +1623,7 @@ srs_error_t SrsRtcRecvTrack::on_nack(SrsRtpPacket2* pkt)
// send_nack // send_nack
uint32_t sent_nacks = 0; uint32_t sent_nacks = 0;
session_->check_send_nacks(nack_receiver_, ssrc, sent_nacks); session_->check_send_nacks(nack_receiver_, ssrc, sent_nacks);
statistic_->nacks += sent_nacks;
return err; return err;
} }
@ -1691,16 +1714,20 @@ SrsRtcSendTrack::SrsRtcSendTrack(SrsRtcConnection* session, SrsRtcTrackDescripti
{ {
session_ = session; session_ = session;
track_desc_ = track_desc->copy(); track_desc_ = track_desc->copy();
statistic_ = new SrsRtcTrackStatistic();
if (is_audio) { if (is_audio) {
rtp_queue_ = new SrsRtpRingBuffer(100); rtp_queue_ = new SrsRtpRingBuffer(100);
} else { } else {
rtp_queue_ = new SrsRtpRingBuffer(1000); rtp_queue_ = new SrsRtpRingBuffer(1000);
} }
} }
SrsRtcSendTrack::~SrsRtcSendTrack() SrsRtcSendTrack::~SrsRtcSendTrack()
{ {
srs_freep(rtp_queue_); srs_freep(rtp_queue_);
srs_freep(track_desc_); srs_freep(track_desc_);
srs_freep(statistic_);
} }
bool SrsRtcSendTrack::has_ssrc(uint32_t ssrc) bool SrsRtcSendTrack::has_ssrc(uint32_t ssrc)
@ -1759,7 +1786,6 @@ srs_error_t SrsRtcAudioSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta
return err; return err;
} }
std::vector<SrsRtpPacket2*> pkts;
pkt->header.set_ssrc(track_desc_->ssrc_); pkt->header.set_ssrc(track_desc_->ssrc_);
// Put rtp packet to NACK/ARQ queue // 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); rtp_queue_->set(nack->header.get_sequence(), nack);
} }
pkts.push_back(pkt);
// Update stats. // Update stats.
info.nn_bytes += pkt->nb_bytes(); info.nn_bytes += pkt->nb_bytes();
info.nn_audios++; info.nn_audios++;
session_->stat_->nn_out_audios++; session_->stat_->nn_out_audios++;
if ((err = session_->do_send_packets(pkts, info)) != srs_success) { // track level statistic
return srs_error_wrap(err, "raw send"); statistic_->packets++;
statistic_->bytes += pkt->nb_bytes();
if (true) {
std::vector<SrsRtpPacket2*> pkts;
pkts.push_back(pkt);
if ((err = session_->do_send_packets(pkts, info)) != srs_success) {
return srs_error_wrap(err, "raw send");
}
} }
return err; return err;
@ -1806,23 +1839,32 @@ srs_error_t SrsRtcVideoSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta
return err; return err;
} }
std::vector<SrsRtpPacket2*> pkts; SrsRtcTrackStatistic* statistic = statistic_;
pkt->header.set_ssrc(track_desc_->ssrc_); pkt->header.set_ssrc(track_desc_->ssrc_);
// Put rtp packet to NACK/ARQ queue // Put rtp packet to NACK/ARQ queue
if (true) { if (true) {
SrsRtpPacket2* nack = pkt->copy(); SrsRtpPacket2* nack = pkt->copy();
rtp_queue_->set(nack->header.get_sequence(), nack); rtp_queue_->set(nack->header.get_sequence(), nack);
} }
pkts.push_back(pkt);
// Update stats. // Update stats.
info.nn_bytes += pkt->nb_bytes(); info.nn_bytes += pkt->nb_bytes();
info.nn_videos++; info.nn_videos++;
session_->stat_->nn_out_videos++; session_->stat_->nn_out_videos++;
if ((err = session_->do_send_packets(pkts, info)) != srs_success) { // track level statistic
return srs_error_wrap(err, "raw send"); statistic->packets++;
statistic->bytes += pkt->nb_bytes();
if (true) {
std::vector<SrsRtpPacket2*> pkts;
pkts.push_back(pkt);
if ((err = session_->do_send_packets(pkts, info)) != srs_success) {
return srs_error_wrap(err, "raw send");
}
} }
return err; return err;

View file

@ -404,10 +404,52 @@ public:
SrsRtcTrackDescription* find_track_description_by_ssrc(uint32_t ssrc); 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 class SrsRtcRecvTrack
{ {
protected: protected:
SrsRtcTrackDescription* track_desc_; SrsRtcTrackDescription* track_desc_;
SrsRtcTrackStatistic* statistic_;
SrsRtcConnection* session_; SrsRtcConnection* session_;
SrsRtpRingBuffer* rtp_queue_; SrsRtpRingBuffer* rtp_queue_;
@ -458,7 +500,9 @@ class SrsRtcSendTrack
protected: protected:
// send track description // send track description
SrsRtcTrackDescription* track_desc_; SrsRtcTrackDescription* track_desc_;
SrsRtcTrackStatistic* statistic_;
// The owner connection for this track.
SrsRtcConnection* session_; SrsRtcConnection* session_;
// NACK ARQ ring buffer. // NACK ARQ ring buffer.
SrsRtpRingBuffer* rtp_queue_; SrsRtpRingBuffer* rtp_queue_;