Initial WebRtcVideoEngine2::GetStats().

Also forward-declaring and moving WebRtcVideoRenderer out of header.

BUG=1788
R=pthatcher@webrtc.org, wu@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@6729 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
pbos@webrtc.org 2014-07-18 11:11:55 +00:00
parent e9e4253a3c
commit e6f84ae8a6
3 changed files with 118 additions and 10 deletions

View File

@ -638,8 +638,6 @@ class WebRtcVideoRenderFrame : public VideoFrame {
const webrtc::I420VideoFrame* const frame_; const webrtc::I420VideoFrame* const frame_;
}; };
// WebRtcVideoChannel2
WebRtcVideoChannel2::WebRtcVideoChannel2( WebRtcVideoChannel2::WebRtcVideoChannel2(
WebRtcVideoEngine2* engine, WebRtcVideoEngine2* engine,
VoiceMediaChannel* voice_channel, VoiceMediaChannel* voice_channel,
@ -1048,10 +1046,36 @@ bool WebRtcVideoChannel2::GetRenderer(uint32 ssrc, VideoRenderer** renderer) {
bool WebRtcVideoChannel2::GetStats(const StatsOptions& options, bool WebRtcVideoChannel2::GetStats(const StatsOptions& options,
VideoMediaInfo* info) { VideoMediaInfo* info) {
// TODO(pbos): Implement. info->Clear();
FillSenderStats(info);
FillReceiverStats(info);
FillBandwidthEstimationStats(info);
return true; return true;
} }
void WebRtcVideoChannel2::FillSenderStats(VideoMediaInfo* video_media_info) {
for (std::map<uint32, WebRtcVideoSendStream*>::iterator it =
send_streams_.begin();
it != send_streams_.end();
++it) {
video_media_info->senders.push_back(it->second->GetVideoSenderInfo());
}
}
void WebRtcVideoChannel2::FillReceiverStats(VideoMediaInfo* video_media_info) {
for (std::map<uint32, WebRtcVideoReceiveStream*>::iterator it =
receive_streams_.begin();
it != receive_streams_.end();
++it) {
video_media_info->receivers.push_back(it->second->GetVideoReceiverInfo());
}
}
void WebRtcVideoChannel2::FillBandwidthEstimationStats(
VideoMediaInfo* video_media_info) {
// TODO(pbos): Implement.
}
bool WebRtcVideoChannel2::SetCapturer(uint32 ssrc, VideoCapturer* capturer) { bool WebRtcVideoChannel2::SetCapturer(uint32 ssrc, VideoCapturer* capturer) {
LOG(LS_INFO) << "SetCapturer: " << ssrc << " -> " LOG(LS_INFO) << "SetCapturer: " << ssrc << " -> "
<< (capturer != NULL ? "(capturer)" : "NULL"); << (capturer != NULL ? "(capturer)" : "NULL");
@ -1549,6 +1573,60 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::Stop() {
sending_ = false; sending_ = false;
} }
VideoSenderInfo
WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo() {
VideoSenderInfo info;
talk_base::CritScope cs(&lock_);
for (size_t i = 0; i < parameters_.config.rtp.ssrcs.size(); ++i) {
info.add_ssrc(parameters_.config.rtp.ssrcs[i]);
}
webrtc::VideoSendStream::Stats stats = stream_->GetStats();
info.framerate_input = stats.input_frame_rate;
info.framerate_sent = stats.encode_frame_rate;
for (std::map<uint32_t, webrtc::StreamStats>::iterator it =
stats.substreams.begin();
it != stats.substreams.end();
++it) {
// TODO(pbos): Wire up additional stats, such as padding bytes.
webrtc::StreamStats stream_stats = it->second;
info.bytes_sent += stream_stats.rtp_stats.bytes +
stream_stats.rtp_stats.header_bytes +
stream_stats.rtp_stats.padding_bytes;
info.packets_sent += stream_stats.rtp_stats.packets;
info.packets_lost += stream_stats.rtcp_stats.cumulative_lost;
}
if (!stats.substreams.empty()) {
// TODO(pbos): Report fraction lost per SSRC.
webrtc::StreamStats first_stream_stats = stats.substreams.begin()->second;
info.fraction_lost =
static_cast<float>(first_stream_stats.rtcp_stats.fraction_lost) /
(1 << 8);
}
if (capturer_ != NULL && !capturer_->IsMuted()) {
VideoFormat last_captured_frame_format;
capturer_->GetStats(&info.adapt_frame_drops,
&info.effects_frame_drops,
&info.capturer_frame_time,
&last_captured_frame_format);
info.input_frame_width = last_captured_frame_format.width;
info.input_frame_height = last_captured_frame_format.height;
info.send_frame_width =
static_cast<int>(parameters_.video_streams.front().width);
info.send_frame_height =
static_cast<int>(parameters_.video_streams.front().height);
}
// TODO(pbos): Support or remove the following stats.
info.packets_cached = -1;
info.rtt_ms = -1;
return info;
}
void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() { void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() {
if (stream_ != NULL) { if (stream_ != NULL) {
call_->DestroyVideoSendStream(stream_); call_->DestroyVideoSendStream(stream_);
@ -1671,6 +1749,29 @@ void WebRtcVideoChannel2::WebRtcVideoReceiveStream::SetSize(int width,
last_height_ = height; last_height_ = height;
} }
VideoReceiverInfo
WebRtcVideoChannel2::WebRtcVideoReceiveStream::GetVideoReceiverInfo() {
VideoReceiverInfo info;
info.add_ssrc(config_.rtp.remote_ssrc);
webrtc::VideoReceiveStream::Stats stats = stream_->GetStats();
info.bytes_rcvd = stats.rtp_stats.bytes + stats.rtp_stats.header_bytes +
stats.rtp_stats.padding_bytes;
info.packets_rcvd = stats.rtp_stats.packets;
info.framerate_rcvd = stats.network_frame_rate;
info.framerate_decoded = stats.decode_frame_rate;
info.framerate_output = stats.render_frame_rate;
talk_base::CritScope frame_cs(&renderer_lock_);
info.frame_width = last_width_;
info.frame_height = last_height_;
// TODO(pbos): Support or remove the following stats.
info.packets_concealed = -1;
return info;
}
WebRtcVideoChannel2::VideoCodecSettings::VideoCodecSettings() WebRtcVideoChannel2::VideoCodecSettings::VideoCodecSettings()
: rtx_payload_type(-1) {} : rtx_payload_type(-1) {}

View File

@ -80,6 +80,7 @@ struct Device;
class WebRtcVideoEngine2; class WebRtcVideoEngine2;
class WebRtcVideoChannel2; class WebRtcVideoChannel2;
class WebRtcVideoRenderer;
class WebRtcVideoEncoderFactory2 { class WebRtcVideoEncoderFactory2 {
public: public:
@ -277,6 +278,8 @@ class WebRtcVideoChannel2 : public talk_base::MessageHandler,
void Start(); void Start();
void Stop(); void Stop();
VideoSenderInfo GetVideoSenderInfo();
private: private:
// Parameters needed to reconstruct the underlying stream. // Parameters needed to reconstruct the underlying stream.
// webrtc::VideoSendStream doesn't support setting a lot of options on the // webrtc::VideoSendStream doesn't support setting a lot of options on the
@ -337,6 +340,8 @@ class WebRtcVideoChannel2 : public talk_base::MessageHandler,
void SetRenderer(cricket::VideoRenderer* renderer); void SetRenderer(cricket::VideoRenderer* renderer);
cricket::VideoRenderer* GetRenderer(); cricket::VideoRenderer* GetRenderer();
VideoReceiverInfo GetVideoReceiverInfo();
private: private:
void SetSize(int width, int height); void SetSize(int width, int height);
void RecreateWebRtcStream(); void RecreateWebRtcStream();
@ -348,8 +353,8 @@ class WebRtcVideoChannel2 : public talk_base::MessageHandler,
talk_base::CriticalSection renderer_lock_; talk_base::CriticalSection renderer_lock_;
cricket::VideoRenderer* renderer_ GUARDED_BY(renderer_lock_); cricket::VideoRenderer* renderer_ GUARDED_BY(renderer_lock_);
int last_width_; int last_width_ GUARDED_BY(renderer_lock_);
int last_height_; int last_height_ GUARDED_BY(renderer_lock_);
}; };
void Construct(webrtc::Call* call, WebRtcVideoEngine2* engine); void Construct(webrtc::Call* call, WebRtcVideoEngine2* engine);
@ -365,6 +370,10 @@ class WebRtcVideoChannel2 : public talk_base::MessageHandler,
std::vector<VideoCodecSettings> FilterSupportedCodecs( std::vector<VideoCodecSettings> FilterSupportedCodecs(
const std::vector<VideoCodecSettings>& mapped_codecs); const std::vector<VideoCodecSettings>& mapped_codecs);
void FillSenderStats(VideoMediaInfo* info);
void FillReceiverStats(VideoMediaInfo* info);
void FillBandwidthEstimationStats(VideoMediaInfo* info);
uint32_t rtcp_receiver_report_ssrc_; uint32_t rtcp_receiver_report_ssrc_;
bool sending_; bool sending_;
talk_base::scoped_ptr<webrtc::Call> call_; talk_base::scoped_ptr<webrtc::Call> call_;

View File

@ -451,15 +451,13 @@ TEST_F(WebRtcVideoChannel2BaseTest, SetSendSetsTransportBufferSizes) {
Base::SetSendSetsTransportBufferSizes(); Base::SetSendSetsTransportBufferSizes();
} }
// TODO(juberti): Fix this test to tolerate missing stats. TEST_F(WebRtcVideoChannel2BaseTest, GetStats) { Base::GetStats(); }
TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_GetStats) { Base::GetStats(); }
// TODO(juberti): Fix this test to tolerate missing stats. TEST_F(WebRtcVideoChannel2BaseTest, GetStatsMultipleRecvStreams) {
TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_GetStatsMultipleRecvStreams) {
Base::GetStatsMultipleRecvStreams(); Base::GetStatsMultipleRecvStreams();
} }
TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_GetStatsMultipleSendStreams) { TEST_F(WebRtcVideoChannel2BaseTest, GetStatsMultipleSendStreams) {
Base::GetStatsMultipleSendStreams(); Base::GetStatsMultipleSendStreams();
} }