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;
|
||||
}
|
||||
|
||||
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<SrsRtpPacket2*> 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<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;
|
||||
|
@ -1805,24 +1838,33 @@ srs_error_t SrsRtcVideoSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta
|
|||
if (!track_desc_->is_active_) {
|
||||
return err;
|
||||
}
|
||||
|
||||
std::vector<SrsRtpPacket2*> 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<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;
|
||||
|
|
|
@ -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_;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue