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:
parent
133e07e670
commit
5f7de58095
2 changed files with 96 additions and 10 deletions
|
@ -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;
|
||||||
|
@ -1805,24 +1838,33 @@ srs_error_t SrsRtcVideoSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta
|
||||||
if (!track_desc_->is_active_) {
|
if (!track_desc_->is_active_) {
|
||||||
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;
|
||||||
|
|
|
@ -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_;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue