From 94cc50d1461d5c50172692f87003005983b885bb Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 7 Jun 2022 20:24:43 +0800 Subject: [PATCH] SRT: Wrap SRT stat object. --- trunk/src/app/srs_app_srt_conn.cpp | 24 +++++----- trunk/src/protocol/srs_protocol_srt.cpp | 59 +++++++++++++++++++++++-- trunk/src/protocol/srs_protocol_srt.hpp | 25 +++++++++-- 3 files changed, 87 insertions(+), 21 deletions(-) diff --git a/trunk/src/app/srs_app_srt_conn.cpp b/trunk/src/app/srs_app_srt_conn.cpp index 4b44fba33..a524605f4 100644 --- a/trunk/src/app/srs_app_srt_conn.cpp +++ b/trunk/src/app/srs_app_srt_conn.cpp @@ -384,14 +384,12 @@ srs_error_t SrsMpegtsSrtConn::do_publishing() // reportable if (pprint->can_print()) { - SRT_TRACEBSTATS srt_stats; - srs_error_t err_tmp = srs_srt_get_stats(srt_fd_, &srt_stats, true); - if (err_tmp != srs_success) { - srs_freep(err_tmp); + SrsSrtStat s; + if ((err = s.fetch(srt_fd_, true)) != srs_success) { + srs_freep(err); } else { - srs_trace("<- " SRS_CONSTS_LOG_SRT_PUBLISH " Transport Stats # " - "pktRecv=%ld, pktRcvLoss=%d, pktRcvRetrans=%d, pktRcvDrop=%d", - srt_stats.pktRecv, srt_stats.pktRcvLoss, srt_stats.pktRcvRetrans, srt_stats.pktRcvDrop); + srs_trace("<- " SRS_CONSTS_LOG_SRT_PUBLISH " Transport Stats # pktRecv=%" PRId64 ", pktRcvLoss=%d, pktRcvRetrans=%d, pktRcvDrop=%d", + s.pktRecv(), s.pktRcvLoss(), s.pktRcvRetrans(), s.pktRcvDrop()); } kbps_->sample(); @@ -467,14 +465,12 @@ srs_error_t SrsMpegtsSrtConn::do_playing() // reportable if (pprint->can_print()) { - SRT_TRACEBSTATS srt_stats; - srs_error_t err_tmp = srs_srt_get_stats(srt_fd_, &srt_stats, true); - if (err_tmp != srs_success) { - srs_freep(err_tmp); + SrsSrtStat s; + if ((err = s.fetch(srt_fd_, true)) != srs_success) { + srs_freep(err); } else { - srs_trace("-> " SRS_CONSTS_LOG_SRT_PLAY " Transport Stats # " - "pktSent=%ld, pktSndLoss=%d, pktRetrans=%d, pktSndDrop=%d", - srt_stats.pktSent, srt_stats.pktSndLoss, srt_stats.pktRetrans, srt_stats.pktSndDrop); + srs_trace("-> " SRS_CONSTS_LOG_SRT_PLAY " Transport Stats # pktSent=%" PRId64 ", pktSndLoss=%d, pktRetrans=%d, pktSndDrop=%d", + s.pktSent(), s.pktSndLoss(), s.pktRetrans(), s.pktSndDrop()); } kbps_->sample(); diff --git a/trunk/src/protocol/srs_protocol_srt.cpp b/trunk/src/protocol/srs_protocol_srt.cpp index 76520c3d7..6892a4839 100644 --- a/trunk/src/protocol/srs_protocol_srt.cpp +++ b/trunk/src/protocol/srs_protocol_srt.cpp @@ -376,13 +376,64 @@ srs_error_t srs_srt_get_remote_ip_port(SRTSOCKET srt_fd, std::string& ip, int& p return err; } -srs_error_t srs_srt_get_stats(SRTSOCKET srt_fd, SRT_TRACEBSTATS* srt_stats, bool clear) +SrsSrtStat::SrsSrtStat() +{ + stat_ = new SRT_TRACEBSTATS(); +} + +SrsSrtStat::~SrsSrtStat() +{ + SRT_TRACEBSTATS* p = (SRT_TRACEBSTATS*)stat_; + srs_freep(p); +} + +int64_t SrsSrtStat::pktRecv() +{ + return ((SRT_TRACEBSTATS*)stat_)->pktRecv; +} + +int SrsSrtStat::pktRcvLoss() +{ + return ((SRT_TRACEBSTATS*)stat_)->pktRcvLoss; +} + +int SrsSrtStat::pktRcvRetrans() +{ + return ((SRT_TRACEBSTATS*)stat_)->pktRcvRetrans; +} + +int SrsSrtStat::pktRcvDrop() +{ + return ((SRT_TRACEBSTATS*)stat_)->pktRcvDrop; +} + +int64_t SrsSrtStat::pktSent() +{ + return ((SRT_TRACEBSTATS*)stat_)->pktSent; +} + +int SrsSrtStat::pktSndLoss() +{ + return ((SRT_TRACEBSTATS*)stat_)->pktSndLoss; +} + +int SrsSrtStat::pktRetrans() +{ + return ((SRT_TRACEBSTATS*)stat_)->pktRetrans; +} + +int SrsSrtStat::pktSndDrop() +{ + return ((SRT_TRACEBSTATS*)stat_)->pktSndDrop; +} + +srs_error_t SrsSrtStat::fetch(SRTSOCKET srt_fd, bool clear) { srs_error_t err = srs_success; - int ret = srt_bstats(srt_fd, srt_stats, clear); - if (ret != 0) { - return srs_error_new(ERROR_SRT_STATS, "srt_bstats"); + int r0 = srt_bstats(srt_fd, (SRT_TRACEBSTATS*)stat_, clear); + if (r0) { + return srs_error_new(ERROR_SRT_STATS, "srt_bstats r0=%d", r0); } return err; diff --git a/trunk/src/protocol/srs_protocol_srt.hpp b/trunk/src/protocol/srs_protocol_srt.hpp index 64116892f..4cbb5a7f8 100644 --- a/trunk/src/protocol/srs_protocol_srt.hpp +++ b/trunk/src/protocol/srs_protocol_srt.hpp @@ -15,6 +15,8 @@ #include +class SrsSrtSocket; + // Create srt socket only, with libsrt's default option. extern srs_error_t srs_srt_socket(SRTSOCKET* pfd); @@ -62,9 +64,26 @@ extern srs_error_t srs_srt_get_local_ip_port(SRTSOCKET srt_fd, std::string& ip, extern srs_error_t srs_srt_get_remote_ip_port(SRTSOCKET srt_fd, std::string& ip, int& port); // Get SRT stats. -extern srs_error_t srs_srt_get_stats(SRTSOCKET srt_fd, SRT_TRACEBSTATS* srt_stats, bool clear); - -class SrsSrtSocket; +class SrsSrtStat +{ +private: + void* stat_; +public: + SrsSrtStat(); + virtual ~SrsSrtStat(); +public: + int64_t pktRecv(); + int pktRcvLoss(); + int pktRcvRetrans(); + int pktRcvDrop(); +public: + int64_t pktSent(); + int pktSndLoss(); + int pktRetrans(); + int pktSndDrop(); +public: + srs_error_t fetch(SRTSOCKET srt_fd, bool clear); +}; // Srt poller, subscribe/unsubscribed events and wait them fired. class SrsSrtPoller