diff options
Diffstat (limited to 'chromium/third_party/webrtc/video/send_statistics_proxy.cc')
-rw-r--r-- | chromium/third_party/webrtc/video/send_statistics_proxy.cc | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/chromium/third_party/webrtc/video/send_statistics_proxy.cc b/chromium/third_party/webrtc/video/send_statistics_proxy.cc new file mode 100644 index 00000000000..c9bd05c1709 --- /dev/null +++ b/chromium/third_party/webrtc/video/send_statistics_proxy.cc @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2013 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. + */ + +#include "webrtc/video/send_statistics_proxy.h" + +#include <map> + +#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" + +namespace webrtc { + +SendStatisticsProxy::SendStatisticsProxy( + const VideoSendStream::Config& config, + SendStatisticsProxy::StatsProvider* stats_provider) + : config_(config), + stats_provider_(stats_provider), + crit_(CriticalSectionWrapper::CreateCriticalSection()) { +} + +SendStatisticsProxy::~SendStatisticsProxy() {} + +void SendStatisticsProxy::OutgoingRate(const int video_channel, + const unsigned int framerate, + const unsigned int bitrate) { + CriticalSectionScoped lock(crit_.get()); + stats_.encode_frame_rate = framerate; +} + +void SendStatisticsProxy::SuspendChange(int video_channel, bool is_suspended) { + CriticalSectionScoped lock(crit_.get()); + stats_.suspended = is_suspended; +} + +void SendStatisticsProxy::CapturedFrameRate(const int capture_id, + const unsigned char frame_rate) { + CriticalSectionScoped lock(crit_.get()); + stats_.input_frame_rate = frame_rate; +} + +VideoSendStream::Stats SendStatisticsProxy::GetStats() const { + VideoSendStream::Stats stats; + { + CriticalSectionScoped lock(crit_.get()); + stats = stats_; + } + stats_provider_->GetSendSideDelay(&stats); + stats.c_name = stats_provider_->GetCName(); + return stats; +} + +StreamStats* SendStatisticsProxy::GetStatsEntry(uint32_t ssrc) { + std::map<uint32_t, StreamStats>::iterator it = stats_.substreams.find(ssrc); + if (it != stats_.substreams.end()) + return &it->second; + + if (std::find(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end(), ssrc) == + config_.rtp.ssrcs.end()) + return NULL; + + return &stats_.substreams[ssrc]; // Insert new entry and return ptr. +} + +void SendStatisticsProxy::StatisticsUpdated(const RtcpStatistics& statistics, + uint32_t ssrc) { + CriticalSectionScoped lock(crit_.get()); + StreamStats* stats = GetStatsEntry(ssrc); + if (stats == NULL) + return; + + stats->rtcp_stats = statistics; +} + +void SendStatisticsProxy::DataCountersUpdated( + const StreamDataCounters& counters, + uint32_t ssrc) { + CriticalSectionScoped lock(crit_.get()); + StreamStats* stats = GetStatsEntry(ssrc); + if (stats == NULL) + return; + + stats->rtp_stats = counters; +} + +void SendStatisticsProxy::Notify(const BitrateStatistics& bitrate, + uint32_t ssrc) { + CriticalSectionScoped lock(crit_.get()); + StreamStats* stats = GetStatsEntry(ssrc); + if (stats == NULL) + return; + + stats->bitrate_bps = bitrate.bitrate_bps; +} + +void SendStatisticsProxy::FrameCountUpdated(FrameType frame_type, + uint32_t frame_count, + const unsigned int ssrc) { + CriticalSectionScoped lock(crit_.get()); + StreamStats* stats = GetStatsEntry(ssrc); + if (stats == NULL) + return; + + switch (frame_type) { + case kVideoFrameDelta: + stats->delta_frames = frame_count; + break; + case kVideoFrameKey: + stats->key_frames = frame_count; + break; + case kFrameEmpty: + case kAudioFrameSpeech: + case kAudioFrameCN: + break; + } +} + +} // namespace webrtc |