Skip to content

Commit dfdf3ad

Browse files
authored
Add GetStats for RtpSender and RtpReceiver. (#44)
1 parent 80aa2ed commit dfdf3ad

File tree

4 files changed

+56
-144
lines changed

4 files changed

+56
-144
lines changed

include/rtc_peerconnection.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,13 @@ class RTCPeerConnection : public RefCountInterface {
221221

222222
virtual vector<scoped_refptr<RTCMediaStream>> remote_streams() = 0;
223223

224-
virtual bool GetStats(const RTCAudioTrack* track,
225-
scoped_refptr<TrackStatsObserver> observer) = 0;
224+
virtual bool GetStats(scoped_refptr<RTCRtpSender> sender,
225+
OnStatsCollectorSuccess success,
226+
OnStatsCollectorFailure failure) = 0;
226227

227-
virtual bool GetStats(const RTCVideoTrack* track,
228-
scoped_refptr<TrackStatsObserver> observer) = 0;
228+
virtual bool GetStats(scoped_refptr<RTCRtpReceiver> receiver,
229+
OnStatsCollectorSuccess success,
230+
OnStatsCollectorFailure failure) = 0;
229231

230232
virtual void GetStats(OnStatsCollectorSuccess success,
231233
OnStatsCollectorFailure failure) = 0;

src/rtc_media_stream_impl.h

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,6 @@
1010

1111
namespace libwebrtc {
1212

13-
class WebRTCStatsObserver : public webrtc::StatsObserver {
14-
public:
15-
WebRTCStatsObserver(scoped_refptr<TrackStatsObserver> observer,
16-
std::string direction)
17-
: observer_(observer), direction_(direction) {}
18-
19-
virtual ~WebRTCStatsObserver() {}
20-
21-
static rtc::scoped_refptr<WebRTCStatsObserver> Create(
22-
scoped_refptr<TrackStatsObserver> observer,
23-
std::string direction) {
24-
rtc::scoped_refptr<WebRTCStatsObserver> rtc_stats_observer =
25-
rtc::scoped_refptr<WebRTCStatsObserver>(
26-
new rtc::RefCountedObject<WebRTCStatsObserver>(observer,
27-
direction));
28-
rtc_stats_observer->AddRef();
29-
return rtc_stats_observer;
30-
}
31-
32-
virtual void OnComplete(const webrtc::StatsReports& reports) override;
33-
34-
private:
35-
scoped_refptr<TrackStatsObserver> observer_;
36-
std::string direction_;
37-
};
38-
3913
class WebRTCStatsCollectorCallback : public webrtc::RTCStatsCollectorCallback {
4014
public:
4115
WebRTCStatsCollectorCallback(OnStatsCollectorSuccess success,

src/rtc_peerconnection_impl.cc

Lines changed: 44 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ static std::map<libwebrtc::RtcpMuxPolicy,
2727
webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire}};
2828

2929
static std::map<libwebrtc::SdpSemantics, webrtc::SdpSemantics>
30-
sdp_semantics_map = {
31-
{libwebrtc::SdpSemantics::kPlanB, webrtc::SdpSemantics::kPlanB_DEPRECATED},
32-
{libwebrtc::SdpSemantics::kUnifiedPlan,
33-
webrtc::SdpSemantics::kUnifiedPlan}};
30+
sdp_semantics_map = {{libwebrtc::SdpSemantics::kPlanB,
31+
webrtc::SdpSemantics::kPlanB_DEPRECATED},
32+
{libwebrtc::SdpSemantics::kUnifiedPlan,
33+
webrtc::SdpSemantics::kUnifiedPlan}};
3434

3535
static std::map<libwebrtc::CandidateNetworkPolicy,
3636
webrtc::PeerConnectionInterface::CandidateNetworkPolicy>
@@ -69,8 +69,7 @@ static std::map<webrtc::PeerConnectionInterface::PeerConnectionState,
6969
{webrtc::PeerConnectionInterface::PeerConnectionState::kConnected,
7070
libwebrtc::RTCPeerConnectionState::RTCPeerConnectionStateConnected},
7171
{webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected,
72-
libwebrtc::RTCPeerConnectionState::
73-
RTCPeerConnectionStateDisconnected},
72+
libwebrtc::RTCPeerConnectionState::RTCPeerConnectionStateDisconnected},
7473
{webrtc::PeerConnectionInterface::PeerConnectionState::kClosed,
7574
libwebrtc::RTCPeerConnectionState::RTCPeerConnectionStateClosed},
7675
{webrtc::PeerConnectionInterface::PeerConnectionState::kFailed,
@@ -352,8 +351,8 @@ void RTCPeerConnectionImpl::OnIceCandidate(
352351
}
353352

354353
RTC_LOG(LS_INFO) << __FUNCTION__ << ", mid " << candidate->sdp_mid()
355-
<< ", mline " << candidate->sdp_mline_index() << ", sdp"
356-
<< cand_sdp;
354+
<< ", mline " << candidate->sdp_mline_index() << ", sdp"
355+
<< cand_sdp;
357356
}
358357

359358
void RTCPeerConnectionImpl::RegisterRTCPeerConnectionObserver(
@@ -408,7 +407,8 @@ bool RTCPeerConnectionImpl::Initialize() {
408407

409408
RTCMediaConstraintsImpl* media_constraints =
410409
static_cast<RTCMediaConstraintsImpl*>(constraints_.get());
411-
webrtc::MediaConstraints rtc_constraints(media_constraints->GetMandatory(),media_constraints->GetOptional());
410+
webrtc::MediaConstraints rtc_constraints(media_constraints->GetMandatory(),
411+
media_constraints->GetOptional());
412412
CopyConstraintsIntoRtcConfiguration(&rtc_constraints, &config);
413413

414414
webrtc::PeerConnectionFactoryInterface::Options options;
@@ -563,7 +563,8 @@ void RTCPeerConnectionImpl::CreateOffer(
563563
RTCMediaConstraintsImpl* media_constraints =
564564
static_cast<RTCMediaConstraintsImpl*>(constraints.get());
565565
webrtc::PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options;
566-
webrtc::MediaConstraints rtc_constraints(media_constraints->GetMandatory(),media_constraints->GetOptional());
566+
webrtc::MediaConstraints rtc_constraints(media_constraints->GetMandatory(),
567+
media_constraints->GetOptional());
567568
if (CopyConstraintsIntoOfferAnswerOptions(&rtc_constraints,
568569
&offer_answer_options) == false) {
569570
offer_answer_options = offer_answer_options_;
@@ -586,7 +587,8 @@ void RTCPeerConnectionImpl::CreateAnswer(
586587
RTCMediaConstraintsImpl* media_constraints =
587588
static_cast<RTCMediaConstraintsImpl*>(constraints.get());
588589
webrtc::PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options;
589-
webrtc::MediaConstraints rtc_constraints(media_constraints->GetMandatory(),media_constraints->GetOptional());
590+
webrtc::MediaConstraints rtc_constraints(media_constraints->GetMandatory(),
591+
media_constraints->GetOptional());
590592
if (CopyConstraintsIntoOfferAnswerOptions(&rtc_constraints,
591593
&offer_answer_options) == false) {
592594
offer_answer_options = offer_answer_options_;
@@ -662,37 +664,45 @@ int RTCPeerConnectionImpl::RemoveStream(scoped_refptr<RTCMediaStream> stream) {
662664
return 0;
663665
}
664666

665-
scoped_refptr<RTCMediaStream> RTCPeerConnectionImpl::CreateLocalMediaStream(const string stream_id) {
667+
scoped_refptr<RTCMediaStream> RTCPeerConnectionImpl::CreateLocalMediaStream(
668+
const string stream_id) {
666669
if (!rtc_peerconnection_factory_.get()) {
667670
return nullptr;
668671
}
669-
auto stream = rtc_peerconnection_factory_->CreateLocalMediaStream(stream_id.c_string());
672+
auto stream =
673+
rtc_peerconnection_factory_->CreateLocalMediaStream(stream_id.c_string());
670674
auto rtc_stream = new RefCountedObject<MediaStreamImpl>(stream);
671675
local_streams_.push_back(rtc_stream);
672676
return rtc_stream;
673677
}
674678

675-
bool RTCPeerConnectionImpl::GetStats(
676-
const RTCAudioTrack* track,
677-
scoped_refptr<TrackStatsObserver> observer) {
678-
AudioTrackImpl* impl = static_cast<AudioTrackImpl*>((RTCAudioTrack*)track);
679-
rtc::scoped_refptr<WebRTCStatsObserver> rtc_observer =
680-
WebRTCStatsObserver::Create(observer, "stats");
681-
rtc_peerconnection_->GetStats(
682-
rtc_observer.get(), impl->rtc_track().get(),
683-
webrtc::PeerConnectionInterface::kStatsOutputLevelDebug);
679+
bool RTCPeerConnectionImpl::GetStats(scoped_refptr<RTCRtpSender> sender,
680+
OnStatsCollectorSuccess success,
681+
OnStatsCollectorFailure failure) {
682+
rtc::scoped_refptr<WebRTCStatsCollectorCallback> rtc_callback =
683+
WebRTCStatsCollectorCallback::Create(success, failure);
684+
if (!rtc_peerconnection_.get() || !rtc_peerconnection_factory_.get()) {
685+
webrtc::MutexLock cs(callback_crt_sec_.get());
686+
failure("Failed to initialize PeerConnection");
687+
return false;
688+
}
689+
RTCRtpSenderImpl* impl = static_cast<RTCRtpSenderImpl*>(sender.get());
690+
rtc_peerconnection_->GetStats(impl->rtc_rtp_sender(), rtc_callback);
684691
return true;
685692
}
686693

687-
bool RTCPeerConnectionImpl::GetStats(
688-
const RTCVideoTrack* track,
689-
scoped_refptr<TrackStatsObserver> observer) {
690-
VideoTrackImpl* impl = static_cast<VideoTrackImpl*>((RTCVideoTrack*)track);
691-
rtc::scoped_refptr<WebRTCStatsObserver> rtc_observer =
692-
WebRTCStatsObserver::Create(observer, "recv");
693-
rtc_peerconnection_->GetStats(
694-
rtc_observer.get(), impl->rtc_track().get(),
695-
webrtc::PeerConnectionInterface::kStatsOutputLevelDebug);
694+
bool RTCPeerConnectionImpl::GetStats(scoped_refptr<RTCRtpReceiver> receiver,
695+
OnStatsCollectorSuccess success,
696+
OnStatsCollectorFailure failure) {
697+
rtc::scoped_refptr<WebRTCStatsCollectorCallback> rtc_callback =
698+
WebRTCStatsCollectorCallback::Create(success, failure);
699+
if (!rtc_peerconnection_.get() || !rtc_peerconnection_factory_.get()) {
700+
webrtc::MutexLock cs(callback_crt_sec_.get());
701+
failure("Failed to initialize PeerConnection");
702+
return false;
703+
}
704+
RTCRtpReceiverImpl* impl = static_cast<RTCRtpReceiverImpl*>(receiver.get());
705+
rtc_peerconnection_->GetStats(impl->rtp_receiver(), rtc_callback);
696706
return true;
697707
}
698708

@@ -821,8 +831,9 @@ scoped_refptr<RTCRtpSender> RTCPeerConnectionImpl::AddTrack(
821831

822832
bool RTCPeerConnectionImpl::RemoveTrack(scoped_refptr<RTCRtpSender> render) {
823833
RTCRtpSenderImpl* impl = static_cast<RTCRtpSenderImpl*>(render.get());
824-
webrtc::RTCError err = rtc_peerconnection_->RemoveTrackOrError(impl->rtc_rtp_sender());
825-
if(err.ok()) {
834+
webrtc::RTCError err =
835+
rtc_peerconnection_->RemoveTrackOrError(impl->rtc_rtp_sender());
836+
if (err.ok()) {
826837
return true;
827838
}
828839
return false;
@@ -886,83 +897,6 @@ void WebRTCStatsCollectorCallback::OnStatsDelivered(
886897
success_(reports);
887898
}
888899

889-
void WebRTCStatsObserver::OnComplete(const webrtc::StatsReports& reports) {
890-
MediaTrackStatistics stats;
891-
892-
for (auto report : reports) {
893-
// for (auto kv : report->values())
894-
// {
895-
// LOG_WARNING(<< kv.second->display_name() << ": "
896-
// << kv.second->ToString());
897-
// }
898-
899-
const webrtc::StatsReport::Value* kv =
900-
report->FindValue(webrtc::StatsReport::kStatsValueNameBytesReceived);
901-
if (kv) {
902-
stats.bytes_received = kv->int64_val();
903-
}
904-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNameBytesSent);
905-
if (kv) {
906-
stats.bytes_sent = kv->int64_val();
907-
}
908-
909-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNameRtt);
910-
if (kv) {
911-
stats.rtt = kv->int64_val();
912-
}
913-
914-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNamePacketsSent);
915-
if (kv) {
916-
stats.packets_sent = kv->int_val();
917-
}
918-
919-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNameFrameRateSent);
920-
if (kv) {
921-
stats.frame_rate_sent = kv->int_val();
922-
}
923-
924-
kv = report->FindValue(
925-
webrtc::StatsReport::kStatsValueNameFrameRateReceived);
926-
if (kv) {
927-
stats.frame_rate_received = kv->int_val();
928-
}
929-
930-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNamePacketsReceived);
931-
if (kv) {
932-
stats.packets_received = kv->int_val();
933-
}
934-
935-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNamePacketsLost);
936-
if (kv) {
937-
stats.packets_lost = kv->int_val();
938-
}
939-
940-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNameSsrc);
941-
if (kv) {
942-
stats.ssrc = kv->int64_val();
943-
}
944-
945-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNameTrackId);
946-
if (kv) {
947-
stats.msid = string(kv->static_string_val());
948-
}
949-
950-
kv = report->FindValue(webrtc::StatsReport::kStatsValueNameMediaType);
951-
if (kv) {
952-
stats.kind = string(kv->static_string_val());
953-
}
954-
955-
stats.direction = direction_;
956-
}
957-
958-
if (observer_)
959-
observer_->OnComplete(stats);
960-
961-
observer_ = nullptr;
962-
963-
this->Release();
964-
}
965-
966900
MediaRTCStatsImpl::MediaRTCStatsImpl(std::unique_ptr<webrtc::RTCStats> stats)
967901
: stats_(std::move(stats)) {}
968902

src/rtc_peerconnection_impl.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,13 @@ class RTCPeerConnectionImpl : public RTCPeerConnection,
130130
const string label,
131131
RTCDataChannelInit* dataChannelDict) override;
132132

133-
virtual bool GetStats(const RTCAudioTrack* track,
134-
scoped_refptr<TrackStatsObserver> observer) override;
133+
virtual bool GetStats(scoped_refptr<RTCRtpSender> sender,
134+
OnStatsCollectorSuccess success,
135+
OnStatsCollectorFailure failure) override;
135136

136-
virtual bool GetStats(const RTCVideoTrack* track,
137-
scoped_refptr<TrackStatsObserver> observer) override;
137+
virtual bool GetStats(scoped_refptr<RTCRtpReceiver> receiver,
138+
OnStatsCollectorSuccess success,
139+
OnStatsCollectorFailure failure) override;
138140

139141
virtual void GetStats(OnStatsCollectorSuccess success,
140142
OnStatsCollectorFailure failure) override;

0 commit comments

Comments
 (0)