diff --git a/webrtc/api/peerconnection.cc b/webrtc/api/peerconnection.cc index 58174f08c1..b638f35dce 100644 --- a/webrtc/api/peerconnection.cc +++ b/webrtc/api/peerconnection.cc @@ -1445,9 +1445,9 @@ void PeerConnection::OnMessage(rtc::Message* msg) { } case MSG_GETSTATS: { GetStatsMsg* param = static_cast(msg->pdata); - StatsReports reports; - stats_->GetStats(param->track, &reports); - param->observer->OnComplete(reports); + std::unique_ptr reports(new StatsReports); + stats_->GetStats(param->track, reports.get()); + param->observer->OnCompleteReports(std::move(reports)); delete param; break; } diff --git a/webrtc/api/peerconnectioninterface.h b/webrtc/api/peerconnectioninterface.h index d4daf2435e..9c2301ca19 100644 --- a/webrtc/api/peerconnectioninterface.h +++ b/webrtc/api/peerconnectioninterface.h @@ -109,7 +109,14 @@ class StreamCollectionInterface : public rtc::RefCountInterface { class StatsObserver : public rtc::RefCountInterface { public: - virtual void OnComplete(const StatsReports& reports) = 0; + // TODO(nisse, hbos): Old version, not passing ownership. Should + // perhaps be deprecated, but since all of this is a legacy + // interface anyway, probably best to leave as is until this class + // can be deleted. + virtual void OnComplete(const StatsReports& reports) {} + virtual void OnCompleteReports(std::unique_ptr reports) { + OnComplete(*reports); + } protected: virtual ~StatsObserver() {} diff --git a/webrtc/api/test/mockpeerconnectionobservers.h b/webrtc/api/test/mockpeerconnectionobservers.h index 23647f6de3..2bf0a3a83f 100644 --- a/webrtc/api/test/mockpeerconnectionobservers.h +++ b/webrtc/api/test/mockpeerconnectionobservers.h @@ -108,12 +108,12 @@ class MockStatsObserver : public webrtc::StatsObserver { MockStatsObserver() : called_(false), stats_() {} virtual ~MockStatsObserver() {} - virtual void OnComplete(const StatsReports& reports) { + void OnCompleteReports(std::unique_ptr reports) override { ASSERT(!called_); called_ = true; stats_.Clear(); - stats_.number_of_reports = reports.size(); - for (const auto* r : reports) { + stats_.number_of_reports = reports->size(); + for (const auto* r : *reports) { if (r->type() == StatsReport::kStatsReportTypeSsrc) { stats_.timestamp = r->timestamp(); GetIntValue(r, StatsReport::kStatsValueNameAudioOutputLevel, diff --git a/webrtc/sdk/android/src/jni/peerconnection_jni.cc b/webrtc/sdk/android/src/jni/peerconnection_jni.cc index da55299775..c9c8ed35af 100644 --- a/webrtc/sdk/android/src/jni/peerconnection_jni.cc +++ b/webrtc/sdk/android/src/jni/peerconnection_jni.cc @@ -671,9 +671,9 @@ class StatsObserverWrapper : public StatsObserver { virtual ~StatsObserverWrapper() {} - void OnComplete(const StatsReports& reports) override { + void OnCompleteReports(std::unique_ptr reports) override { ScopedLocalRefFrame local_ref_frame(jni()); - jobjectArray j_reports = ReportsToJava(jni(), reports); + jobjectArray j_reports = ReportsToJava(jni(), *reports); jmethodID m = GetMethodID(jni(), *j_observer_class_, "onComplete", "([Lorg/webrtc/StatsReport;)V"); jni()->CallVoidMethod(*j_observer_global_, m, j_reports); diff --git a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection+Stats.mm b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection+Stats.mm index 2c4571e0b3..4eb3e708f1 100644 --- a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection+Stats.mm +++ b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection+Stats.mm @@ -29,10 +29,10 @@ class StatsObserverAdapter : public StatsObserver { completion_handler_ = nil; } - void OnComplete(const StatsReports& reports) override { + void OnCompleteReports(std::unique_ptr reports) override { RTC_DCHECK(completion_handler_); - NSMutableArray *stats = [NSMutableArray arrayWithCapacity:reports.size()]; - for (const auto* report : reports) { + NSMutableArray *stats = [NSMutableArray arrayWithCapacity:reports->size()]; + for (const auto* report : *reports) { RTCLegacyStatsReport *statsReport = [[RTCLegacyStatsReport alloc] initWithNativeReport:*report]; [stats addObject:statsReport];