Add stats of incoming frame delays for debugging bandwidth estimation.

BUG=crbug/338380
R=stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/8119004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5519 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
jiayl@webrtc.org 2014-02-10 19:12:14 +00:00
parent 82387e4608
commit 1f64f06784
10 changed files with 84 additions and 0 deletions

View File

@ -37,6 +37,27 @@ class RemoteBitrateObserver {
virtual ~RemoteBitrateObserver() {} virtual ~RemoteBitrateObserver() {}
}; };
struct ReceiveBandwidthEstimatorStats {
ReceiveBandwidthEstimatorStats() : total_propagation_time_delta_ms(0) {}
// The "propagation_time_delta" of a frame is defined as (d_arrival - d_sent),
// where d_arrival is the delta of the arrival times of the frame and the
// previous frame, d_sent is the delta of the sent times of the frame and
// the previous frame. The sent time is calculated from the RTP timestamp.
// |total_propagation_time_delta_ms| is the sum of the propagation_time_deltas
// of all received frames, except that it's is adjusted to 0 when it becomes
// negative.
int64_t total_propagation_time_delta_ms;
// The propagation_time_deltas for the frames arrived in the last
// kProcessIntervalMs using the clock passed to
// RemoteBitrateEstimatorFactory::Create.
std::vector<int64_t> recent_propagation_time_delta_ms;
// The arrival times for the frames arrived in the last kProcessIntervalMs
// using the clock passed to RemoteBitrateEstimatorFactory::Create.
std::vector<int64_t> recent_arrival_time_ms;
};
class RemoteBitrateEstimator : public CallStatsObserver, public Module { class RemoteBitrateEstimator : public CallStatsObserver, public Module {
public: public:
virtual ~RemoteBitrateEstimator() {} virtual ~RemoteBitrateEstimator() {}
@ -58,6 +79,9 @@ class RemoteBitrateEstimator : public CallStatsObserver, public Module {
virtual bool LatestEstimate(std::vector<unsigned int>* ssrcs, virtual bool LatestEstimate(std::vector<unsigned int>* ssrcs,
unsigned int* bitrate_bps) const = 0; unsigned int* bitrate_bps) const = 0;
// Returns true if the statistics are available.
virtual bool GetStats(ReceiveBandwidthEstimatorStats* output) const = 0;
protected: protected:
static const int kProcessIntervalMs = 1000; static const int kProcessIntervalMs = 1000;
static const int kStreamTimeOutMs = 2000; static const int kStreamTimeOutMs = 2000;

View File

@ -55,6 +55,9 @@ class RemoteBitrateEstimatorSingleStream : public RemoteBitrateEstimator {
virtual bool LatestEstimate(std::vector<unsigned int>* ssrcs, virtual bool LatestEstimate(std::vector<unsigned int>* ssrcs,
unsigned int* bitrate_bps) const OVERRIDE; unsigned int* bitrate_bps) const OVERRIDE;
virtual bool GetStats(
ReceiveBandwidthEstimatorStats* output) const OVERRIDE;
private: private:
typedef std::map<unsigned int, OveruseDetector> SsrcOveruseDetectorMap; typedef std::map<unsigned int, OveruseDetector> SsrcOveruseDetectorMap;
@ -210,6 +213,12 @@ bool RemoteBitrateEstimatorSingleStream::LatestEstimate(
return true; return true;
} }
bool RemoteBitrateEstimatorSingleStream::GetStats(
ReceiveBandwidthEstimatorStats* output) const {
// Not implemented.
return false;
}
void RemoteBitrateEstimatorSingleStream::GetSsrcs( void RemoteBitrateEstimatorSingleStream::GetSsrcs(
std::vector<unsigned int>* ssrcs) const { std::vector<unsigned int>* ssrcs) const {
assert(ssrcs); assert(ssrcs);

View File

@ -27,6 +27,7 @@
namespace webrtc { namespace webrtc {
class VideoEngine; class VideoEngine;
struct ReceiveBandwidthEstimatorStats;
// This enumerator sets the RTCP mode. // This enumerator sets the RTCP mode.
enum ViERTCPMode { enum ViERTCPMode {
@ -389,6 +390,13 @@ class WEBRTC_DLLEXPORT ViERTP_RTCP {
const int video_channel, const int video_channel,
unsigned int* estimated_bandwidth) const = 0; unsigned int* estimated_bandwidth) const = 0;
// This function gets the receive-side bandwidth esitmator statistics.
// TODO(jiayl): remove the default impl when libjingle's FakeWebRtcVideoEngine
// is updated.
virtual int GetReceiveBandwidthEstimatorStats(
const int video_channel,
ReceiveBandwidthEstimatorStats* output) const { return -1; }
// This function enables capturing of RTP packets to a binary file on a // This function enables capturing of RTP packets to a binary file on a
// specific channel and for a given direction. The file can later be // specific channel and for a given direction. The file can later be
// replayed using e.g. RTP Tools rtpplay since the binary file format is // replayed using e.g. RTP Tools rtpplay since the binary file format is

View File

@ -1457,6 +1457,11 @@ void ViEChannel::GetEstimatedReceiveBandwidth(
vie_receiver_.EstimatedReceiveBandwidth(estimated_bandwidth); vie_receiver_.EstimatedReceiveBandwidth(estimated_bandwidth);
} }
void ViEChannel::GetReceiveBandwidthEstimatorStats(
ReceiveBandwidthEstimatorStats* output) const {
vie_receiver_.GetReceiveBandwidthEstimatorStats(output);
}
int32_t ViEChannel::StartRTPDump(const char file_nameUTF8[1024], int32_t ViEChannel::StartRTPDump(const char file_nameUTF8[1024],
RTPDirections direction) { RTPDirections direction) {
WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, channel_id_), "%s", WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, channel_id_), "%s",

View File

@ -209,6 +209,8 @@ class ViEChannel
uint32_t* nackBitrateSent) const; uint32_t* nackBitrateSent) const;
bool GetSendSideDelay(int* avg_send_delay, int* max_send_delay) const; bool GetSendSideDelay(int* avg_send_delay, int* max_send_delay) const;
void GetEstimatedReceiveBandwidth(uint32_t* estimated_bandwidth) const; void GetEstimatedReceiveBandwidth(uint32_t* estimated_bandwidth) const;
void GetReceiveBandwidthEstimatorStats(
ReceiveBandwidthEstimatorStats* output) const;
// Called on any new send bitrate estimate. // Called on any new send bitrate estimate.
void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer); void RegisterSendBitrateObserver(BitrateStatisticsObserver* observer);

View File

@ -85,6 +85,11 @@ class WrappingBitrateEstimator : public RemoteBitrateEstimator {
return rbe_->LatestEstimate(ssrcs, bitrate_bps); return rbe_->LatestEstimate(ssrcs, bitrate_bps);
} }
virtual bool GetStats(ReceiveBandwidthEstimatorStats* output) const {
CriticalSectionScoped cs(crit_sect_.get());
return rbe_->GetStats(output);
}
private: private:
// Instantiate RBE for Time Offset or Absolute Send Time extensions. // Instantiate RBE for Time Offset or Absolute Send Time extensions.
void PickEstimator(const RTPHeader& header) { void PickEstimator(const RTPHeader& header) {

View File

@ -458,6 +458,11 @@ void ViEReceiver::EstimatedReceiveBandwidth(
} }
} }
void ViEReceiver::GetReceiveBandwidthEstimatorStats(
ReceiveBandwidthEstimatorStats* output) const {
remote_bitrate_estimator_->GetStats(output);
}
ReceiveStatistics* ViEReceiver::GetReceiveStatistics() const { ReceiveStatistics* ViEReceiver::GetReceiveStatistics() const {
return rtp_receive_statistics_.get(); return rtp_receive_statistics_.get();
} }

View File

@ -34,6 +34,7 @@ class RTPPayloadRegistry;
class RtpReceiver; class RtpReceiver;
class RtpRtcp; class RtpRtcp;
class VideoCodingModule; class VideoCodingModule;
struct ReceiveBandwidthEstimatorStats;
class ViEReceiver : public RtpData { class ViEReceiver : public RtpData {
public: public:
@ -85,6 +86,9 @@ class ViEReceiver : public RtpData {
void EstimatedReceiveBandwidth(unsigned int* available_bandwidth) const; void EstimatedReceiveBandwidth(unsigned int* available_bandwidth) const;
void GetReceiveBandwidthEstimatorStats(
ReceiveBandwidthEstimatorStats* output) const;
ReceiveStatistics* GetReceiveStatistics() const; ReceiveStatistics* GetReceiveStatistics() const;
private: private:

View File

@ -1003,6 +1003,26 @@ int ViERTP_RTCPImpl::GetEstimatedReceiveBandwidth(
return 0; return 0;
} }
int ViERTP_RTCPImpl::GetReceiveBandwidthEstimatorStats(
const int video_channel,
ReceiveBandwidthEstimatorStats* output) const {
WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
ViEId(shared_data_->instance_id(), video_channel),
"%s(channel: %d)", __FUNCTION__, video_channel);
ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
ViEChannel* vie_channel = cs.Channel(video_channel);
if (!vie_channel) {
WEBRTC_TRACE(kTraceError, kTraceVideo,
ViEId(shared_data_->instance_id(), video_channel),
"%s: Could not get channel %d", __FUNCTION__,
video_channel);
shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
return -1;
}
vie_channel->GetReceiveBandwidthEstimatorStats(output);
return 0;
}
int ViERTP_RTCPImpl::StartRTPDump(const int video_channel, int ViERTP_RTCPImpl::StartRTPDump(const int video_channel,
const char file_nameUTF8[1024], const char file_nameUTF8[1024],
RTPDirections direction) { RTPDirections direction) {

View File

@ -110,6 +110,8 @@ class ViERTP_RTCPImpl
virtual int GetEstimatedReceiveBandwidth( virtual int GetEstimatedReceiveBandwidth(
const int video_channel, const int video_channel,
unsigned int* estimated_bandwidth) const; unsigned int* estimated_bandwidth) const;
virtual int GetReceiveBandwidthEstimatorStats(
const int video_channel, ReceiveBandwidthEstimatorStats* output) const;
virtual int StartRTPDump(const int video_channel, virtual int StartRTPDump(const int video_channel,
const char file_nameUTF8[1024], const char file_nameUTF8[1024],
RTPDirections direction); RTPDirections direction);