Index: webrtc/modules/video_coding/main/source/video_sender.cc |
diff --git a/webrtc/modules/video_coding/main/source/video_sender.cc b/webrtc/modules/video_coding/main/source/video_sender.cc |
index 9b855da16a4cfc6402795770a7205455cc4a69e6..5fc5041cf149ea20a328356e57f97290aebb6d28 100644 |
--- a/webrtc/modules/video_coding/main/source/video_sender.cc |
+++ b/webrtc/modules/video_coding/main/source/video_sender.cc |
@@ -20,6 +20,7 @@ |
#include "webrtc/modules/video_coding/utility/include/quality_scaler.h" |
#include "webrtc/system_wrappers/interface/clock.h" |
#include "webrtc/system_wrappers/interface/logging.h" |
+#include "webrtc/system_wrappers/interface/metrics.h" |
namespace webrtc { |
namespace vcm { |
@@ -51,9 +52,28 @@ VideoSender::VideoSender(Clock* clock, |
} |
VideoSender::~VideoSender() { |
+ UpdateHistograms(); |
delete _sendCritSect; |
} |
+void VideoSender::UpdateHistograms() { |
+ int avg_encode_time_ms; |
+ int max_encode_time_ms; |
+ { |
+ CriticalSectionScoped cs(_sendCritSect); |
+ avg_encode_time_ms = stats_.AvgEncodeTimeMs(); |
+ max_encode_time_ms = stats_.MaxEncodeTimeMs(); |
+ } |
+ if (avg_encode_time_ms != -1) { |
+ RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.AvgEncodeTimeInMs", |
+ avg_encode_time_ms); |
+ } |
+ if (max_encode_time_ms != -1) { |
+ RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.MaxEncodeTimeInMs", |
+ max_encode_time_ms); |
+ } |
+} |
+ |
int32_t VideoSender::Process() { |
int32_t returnValue = VCM_OK; |
@@ -329,12 +349,15 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame, |
CHECK(!converted_frame.IsZeroSize()) |
<< "Frame conversion failed, won't be able to encode frame."; |
} |
+ int64_t encode_start_time_ms = clock_->TimeInMilliseconds(); |
int32_t ret = |
_encoder->Encode(converted_frame, codecSpecificInfo, _nextFrameTypes); |
if (ret < 0) { |
LOG(LS_ERROR) << "Failed to encode frame. Error code: " << ret; |
return ret; |
} |
+ stats_.Update(clock_->TimeInMilliseconds() - encode_start_time_ms); |
+ |
for (size_t i = 0; i < _nextFrameTypes.size(); ++i) { |
_nextFrameTypes[i] = kVideoFrameDelta; // Default frame type. |
} |
@@ -383,5 +406,11 @@ bool VideoSender::VideoSuspended() const { |
CriticalSectionScoped cs(_sendCritSect); |
return _mediaOpt.IsVideoSuspended(); |
} |
+ |
+void VideoSender::EncodedFrameStats::Update(int64_t encode_time_ms) { |
+ sum_encode_time_ms += encode_time_ms; |
+ max_encode_time_ms = std::max(max_encode_time_ms, encode_time_ms); |
+ ++encoded_frames; |
+} |
} // namespace vcm |
} // namespace webrtc |