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:
parent
e9e4253a3c
commit
e6f84ae8a6
@ -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) {}
|
||||||
|
|
||||||
|
@ -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_;
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user