diff --git a/talk/app/webrtc/statscollector.cc b/talk/app/webrtc/statscollector.cc index 67d64fbe8..86a88c159 100644 --- a/talk/app/webrtc/statscollector.cc +++ b/talk/app/webrtc/statscollector.cc @@ -137,6 +137,8 @@ const char StatsReport::kStatsValueNameLocalCandidateType[] = "googLocalCandidateType"; const char StatsReport::kStatsValueNameLocalCertificateId[] = "googLocalCertificateId"; +const char StatsReport::kStatsValueNameAdaptationChanges[] = + "googAdaptationChanges"; const char StatsReport::kStatsValueNameNacksReceived[] = "googNacksReceived"; const char StatsReport::kStatsValueNameNacksSent[] = "googNacksSent"; const char StatsReport::kStatsValueNamePlisReceived[] = "googPlisReceived"; @@ -422,6 +424,8 @@ void ExtractStats(const cricket::VideoSenderInfo& info, StatsReport* report) { (info.adapt_reason & 0x2) > 0); report->AddBoolean(StatsReport::kStatsValueNameViewLimitedResolution, (info.adapt_reason & 0x4) > 0); + report->AddValue(StatsReport::kStatsValueNameAdaptationChanges, + info.adapt_changes); report->AddValue(StatsReport::kStatsValueNameAvgEncodeMs, info.avg_encode_ms); report->AddValue(StatsReport::kStatsValueNameCaptureJitterMs, info.capture_jitter_ms); diff --git a/talk/app/webrtc/statstypes.h b/talk/app/webrtc/statstypes.h index 22e281cf7..0a2aa03a5 100644 --- a/talk/app/webrtc/statstypes.h +++ b/talk/app/webrtc/statstypes.h @@ -141,6 +141,7 @@ class StatsReport { static const char kStatsValueNameBandwidthLimitedResolution[]; static const char kStatsValueNameCpuLimitedResolution[]; static const char kStatsValueNameViewLimitedResolution[]; + static const char kStatsValueNameAdaptationChanges[]; static const char kStatsValueNameEchoCancellationQualityMin[]; static const char kStatsValueNameEchoDelayMedian[]; static const char kStatsValueNameEchoDelayStdDev[]; diff --git a/talk/media/base/mediachannel.h b/talk/media/base/mediachannel.h index 34d2deff7..60cdebda3 100644 --- a/talk/media/base/mediachannel.h +++ b/talk/media/base/mediachannel.h @@ -901,6 +901,7 @@ struct VideoSenderInfo : public MediaSenderInfo { nominal_bitrate(0), preferred_bitrate(0), adapt_reason(0), + adapt_changes(0), capture_jitter_ms(0), avg_encode_ms(0), encode_usage_percent(0), @@ -922,6 +923,7 @@ struct VideoSenderInfo : public MediaSenderInfo { int nominal_bitrate; int preferred_bitrate; int adapt_reason; + int adapt_changes; int capture_jitter_ms; int avg_encode_ms; int encode_usage_percent; diff --git a/talk/media/base/videoadapter.h b/talk/media/base/videoadapter.h index 0634942d9..888183790 100644 --- a/talk/media/base/videoadapter.h +++ b/talk/media/base/videoadapter.h @@ -72,6 +72,8 @@ class VideoAdapter { void set_scale_third(bool enable); bool scale_third() const { return scale_third_; } + int adaptation_changes() const { return adaption_changes_; } + protected: float FindClosestScale(int width, int height, int target_num_pixels); float FindClosestViewScale(int width, int height, int target_num_pixels); diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc index 1ca92cf73..13034f034 100644 --- a/talk/media/webrtc/webrtcvideoengine.cc +++ b/talk/media/webrtc/webrtcvideoengine.cc @@ -586,9 +586,9 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { video_capturer_(NULL), encoder_observer_(channel_id), external_capture_(external_capture), - capturer_updated_(false), interval_(0), - cpu_monitor_(cpu_monitor) { + cpu_monitor_(cpu_monitor), + old_adaptation_changes_(0) { } int channel_id() const { return channel_id_; } @@ -625,12 +625,17 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { int64 interval() { return interval_; } int CurrentAdaptReason() const { - const CoordinatedVideoAdapter* adapter = video_adapter(); - if (!adapter) { + if (!video_adapter()) { return CoordinatedVideoAdapter::ADAPTREASON_NONE; } return video_adapter()->adapt_reason(); } + int AdaptChanges() const { + if (!video_adapter()) { + return old_adaptation_changes_; + } + return old_adaptation_changes_ + video_adapter()->adaptation_changes(); + } StreamParams* stream_params() { return stream_params_.get(); } void set_stream_params(const StreamParams& sp) { @@ -655,6 +660,8 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { CoordinatedVideoAdapter* old_video_adapter = video_adapter(); if (old_video_adapter) { + // Get adaptation changes from old video adapter. + old_adaptation_changes_ += old_video_adapter->adaptation_changes(); // Disconnect signals from old video adapter. SignalCpuAdaptationUnable.disconnect(old_video_adapter); if (cpu_monitor_) { @@ -662,7 +669,6 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { } } - capturer_updated_ = true; video_capturer_ = video_capturer; vie_wrapper->base()->RegisterCpuOveruseObserver(channel_id_, NULL); @@ -817,13 +823,13 @@ class WebRtcVideoChannelSendInfo : public sigslot::has_slots<> { WebRtcLocalStreamInfo local_stream_info_; - bool capturer_updated_; - int64 interval_; talk_base::CpuMonitor* cpu_monitor_; talk_base::scoped_ptr overuse_observer_; + int old_adaptation_changes_; + VideoOptions video_options_; }; @@ -2506,6 +2512,7 @@ bool WebRtcVideoMediaChannel::GetStats(const StatsOptions& options, send_codec_->maxBitrate, kMaxVideoBitrate); } sinfo.adapt_reason = send_channel->CurrentAdaptReason(); + sinfo.adapt_changes = send_channel->AdaptChanges(); #ifdef USE_WEBRTC_DEV_BRANCH webrtc::CpuOveruseMetrics metrics;