2016-08-30 14:04:35 -07:00
|
|
|
/*
|
|
|
|
|
* Copyright 2016 The WebRTC Project Authors. All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
2016-09-15 23:33:01 -07:00
|
|
|
#ifndef WEBRTC_API_RTCSTATSCOLLECTOR_H_
|
|
|
|
|
#define WEBRTC_API_RTCSTATSCOLLECTOR_H_
|
2016-08-30 14:04:35 -07:00
|
|
|
|
|
|
|
|
#include <memory>
|
2016-09-05 01:36:50 -07:00
|
|
|
#include <vector>
|
2016-08-30 14:04:35 -07:00
|
|
|
|
2016-09-15 23:33:01 -07:00
|
|
|
#include "webrtc/api/stats/rtcstats_objects.h"
|
|
|
|
|
#include "webrtc/api/stats/rtcstatsreport.h"
|
2016-09-05 01:36:50 -07:00
|
|
|
#include "webrtc/base/asyncinvoker.h"
|
|
|
|
|
#include "webrtc/base/refcount.h"
|
2016-08-30 14:04:35 -07:00
|
|
|
#include "webrtc/base/scoped_ref_ptr.h"
|
2016-08-31 07:57:36 -07:00
|
|
|
#include "webrtc/base/timeutils.h"
|
2016-08-30 14:04:35 -07:00
|
|
|
|
|
|
|
|
namespace webrtc {
|
|
|
|
|
|
|
|
|
|
class PeerConnection;
|
|
|
|
|
|
2016-09-05 01:36:50 -07:00
|
|
|
class RTCStatsCollectorCallback : public virtual rtc::RefCountInterface {
|
2016-08-30 14:04:35 -07:00
|
|
|
public:
|
2016-09-05 01:36:50 -07:00
|
|
|
virtual ~RTCStatsCollectorCallback() {}
|
|
|
|
|
|
|
|
|
|
virtual void OnStatsDelivered(
|
|
|
|
|
const rtc::scoped_refptr<const RTCStatsReport>& report) = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// All public methods of the collector are to be called on the signaling thread.
|
|
|
|
|
// Stats are gathered on the signaling, worker and network threads
|
|
|
|
|
// asynchronously. The callback is invoked on the signaling thread. Resulting
|
|
|
|
|
// reports are cached for |cache_lifetime_| ms.
|
|
|
|
|
class RTCStatsCollector : public virtual rtc::RefCountInterface {
|
|
|
|
|
public:
|
|
|
|
|
static rtc::scoped_refptr<RTCStatsCollector> Create(
|
2016-08-30 14:04:35 -07:00
|
|
|
PeerConnection* pc,
|
2016-08-31 07:57:36 -07:00
|
|
|
int64_t cache_lifetime_us = 50 * rtc::kNumMicrosecsPerMillisec);
|
2016-08-30 14:04:35 -07:00
|
|
|
|
|
|
|
|
// Gets a recent stats report. If there is a report cached that is still fresh
|
|
|
|
|
// it is returned, otherwise new stats are gathered and returned. A report is
|
|
|
|
|
// considered fresh for |cache_lifetime_| ms. const RTCStatsReports are safe
|
|
|
|
|
// to use across multiple threads and may be destructed on any thread.
|
2016-09-05 01:36:50 -07:00
|
|
|
void GetStatsReport(rtc::scoped_refptr<RTCStatsCollectorCallback> callback);
|
2016-08-30 14:04:35 -07:00
|
|
|
// Clears the cache's reference to the most recent stats report. Subsequently
|
|
|
|
|
// calling |GetStatsReport| guarantees fresh stats.
|
|
|
|
|
void ClearCachedStatsReport();
|
|
|
|
|
|
2016-09-05 01:36:50 -07:00
|
|
|
protected:
|
|
|
|
|
RTCStatsCollector(PeerConnection* pc, int64_t cache_lifetime_us);
|
|
|
|
|
|
|
|
|
|
// Stats gathering on a particular thread. Calls |AddPartialResults| before
|
|
|
|
|
// returning. Virtual for the sake of testing.
|
|
|
|
|
virtual void ProducePartialResultsOnSignalingThread(int64_t timestamp_us);
|
|
|
|
|
virtual void ProducePartialResultsOnWorkerThread(int64_t timestamp_us);
|
|
|
|
|
virtual void ProducePartialResultsOnNetworkThread(int64_t timestamp_us);
|
|
|
|
|
|
|
|
|
|
// Can be called on any thread.
|
|
|
|
|
void AddPartialResults(
|
|
|
|
|
const rtc::scoped_refptr<RTCStatsReport>& partial_report);
|
|
|
|
|
|
2016-08-30 14:04:35 -07:00
|
|
|
private:
|
2016-09-05 01:36:50 -07:00
|
|
|
void AddPartialResults_s(rtc::scoped_refptr<RTCStatsReport> partial_report);
|
|
|
|
|
void DeliverCachedReport();
|
2016-08-30 14:04:35 -07:00
|
|
|
|
2016-09-05 01:36:50 -07:00
|
|
|
std::unique_ptr<RTCPeerConnectionStats> ProducePeerConnectionStats_s(
|
2016-08-31 07:57:36 -07:00
|
|
|
int64_t timestamp_us) const;
|
2016-08-30 14:04:35 -07:00
|
|
|
|
|
|
|
|
PeerConnection* const pc_;
|
2016-09-05 01:36:50 -07:00
|
|
|
rtc::Thread* const signaling_thread_;
|
|
|
|
|
rtc::Thread* const worker_thread_;
|
|
|
|
|
rtc::Thread* const network_thread_;
|
|
|
|
|
rtc::AsyncInvoker invoker_;
|
|
|
|
|
|
|
|
|
|
int num_pending_partial_reports_;
|
|
|
|
|
int64_t partial_report_timestamp_us_;
|
|
|
|
|
rtc::scoped_refptr<RTCStatsReport> partial_report_;
|
|
|
|
|
std::vector<rtc::scoped_refptr<RTCStatsCollectorCallback>> callbacks_;
|
|
|
|
|
|
2016-08-31 07:57:36 -07:00
|
|
|
// A timestamp, in microseconds, that is based on a timer that is
|
|
|
|
|
// monotonically increasing. That is, even if the system clock is modified the
|
|
|
|
|
// difference between the timer and this timestamp is how fresh the cached
|
|
|
|
|
// report is.
|
|
|
|
|
int64_t cache_timestamp_us_;
|
|
|
|
|
int64_t cache_lifetime_us_;
|
2016-08-30 14:04:35 -07:00
|
|
|
rtc::scoped_refptr<const RTCStatsReport> cached_report_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace webrtc
|
|
|
|
|
|
2016-09-15 23:33:01 -07:00
|
|
|
#endif // WEBRTC_API_RTCSTATSCOLLECTOR_H_
|