diff options
author | buildbot@webrtc.org <buildbot@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2014-05-06 21:36:31 +0000 |
---|---|---|
committer | buildbot@webrtc.org <buildbot@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2014-05-06 21:36:31 +0000 |
commit | 0581f0ba0a28fb4a85019efda2dd3fadcd081172 (patch) | |
tree | 6bd0b390593f67c6dc0b8110c26e58ce83a7a268 | |
parent | a18b4c96afef956f5b570f671d92624911f17f77 (diff) | |
download | webrtc-0581f0ba0a28fb4a85019efda2dd3fadcd081172.tar.gz |
(Auto)update libjingle 66303009-> 66322380
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6065 4adac7df-926f-26a2-2b94-8c16560cd09d
-rw-r--r-- | talk/app/webrtc/statscollector.cc | 6 | ||||
-rw-r--r-- | talk/app/webrtc/statstypes.h | 1 | ||||
-rw-r--r-- | talk/media/base/mediachannel.h | 6 | ||||
-rw-r--r-- | talk/media/webrtc/webrtcvideoengine.cc | 46 |
4 files changed, 51 insertions, 8 deletions
diff --git a/talk/app/webrtc/statscollector.cc b/talk/app/webrtc/statscollector.cc index b87f45b4c0..013e83f252 100644 --- a/talk/app/webrtc/statscollector.cc +++ b/talk/app/webrtc/statscollector.cc @@ -105,6 +105,9 @@ const char StatsReport::kStatsValueNameMinPlayoutDelayMs[] = "googMinPlayoutDelayMs"; const char StatsReport::kStatsValueNameRenderDelayMs[] = "googRenderDelayMs"; +const char StatsReport::kStatsValueNameCaptureStartNtpTimeMs[] = + "googCaptureStartNtpTimeMs"; + const char StatsReport::kStatsValueNameFrameRateInput[] = "googFrameRateInput"; const char StatsReport::kStatsValueNameFrameRateSent[] = "googFrameRateSent"; const char StatsReport::kStatsValueNameFrameWidthInput[] = @@ -338,6 +341,9 @@ void ExtractStats(const cricket::VideoReceiverInfo& info, StatsReport* report) { info.min_playout_delay_ms); report->AddValue(StatsReport::kStatsValueNameRenderDelayMs, info.render_delay_ms); + + report->AddValue(StatsReport::kStatsValueNameCaptureStartNtpTimeMs, + info.capture_start_ntp_time_ms); } void ExtractStats(const cricket::VideoSenderInfo& info, StatsReport* report) { diff --git a/talk/app/webrtc/statstypes.h b/talk/app/webrtc/statstypes.h index abaf4e1564..dd9da0dba8 100644 --- a/talk/app/webrtc/statstypes.h +++ b/talk/app/webrtc/statstypes.h @@ -161,6 +161,7 @@ class StatsReport { static const char kStatsValueNameJitterBufferMs[]; static const char kStatsValueNameMinPlayoutDelayMs[]; static const char kStatsValueNameRenderDelayMs[]; + static const char kStatsValueNameCaptureStartNtpTimeMs[]; static const char kStatsValueNameFrameRateInput[]; static const char kStatsValueNameFrameRateSent[]; static const char kStatsValueNameFrameWidthInput[]; diff --git a/talk/media/base/mediachannel.h b/talk/media/base/mediachannel.h index fd20619630..02c3d003bc 100644 --- a/talk/media/base/mediachannel.h +++ b/talk/media/base/mediachannel.h @@ -911,7 +911,8 @@ struct VideoReceiverInfo : public MediaReceiverInfo { min_playout_delay_ms(0), render_delay_ms(0), target_delay_ms(0), - current_delay_ms(0) { + current_delay_ms(0), + capture_start_ntp_time_ms(0) { } std::vector<SsrcGroup> ssrc_groups; @@ -948,6 +949,9 @@ struct VideoReceiverInfo : public MediaReceiverInfo { int target_delay_ms; // Current overall delay, possibly ramping towards target_delay_ms. int current_delay_ms; + + // Estimated capture start time in NTP time in ms. + int64 capture_start_ntp_time_ms; }; struct DataSenderInfo : public MediaSenderInfo { diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc index 7f70a3c25c..7c55e93967 100644 --- a/talk/media/webrtc/webrtcvideoengine.cc +++ b/talk/media/webrtc/webrtcvideoengine.cc @@ -81,6 +81,8 @@ void DestroyWebRtcMediaEngine(cricket::MediaEngineInterface* media_engine) { } #endif +static const int kVideoCodecClockratekHz = cricket::kVideoCodecClockrate / 1000; + namespace cricket { @@ -169,7 +171,13 @@ struct FlushBlackFrameData : public talk_base::MessageData { class WebRtcRenderAdapter : public webrtc::ExternalRenderer { public: WebRtcRenderAdapter(VideoRenderer* renderer, int channel_id) - : renderer_(renderer), channel_id_(channel_id), width_(0), height_(0) { + : renderer_(renderer), + channel_id_(channel_id), + width_(0), + height_(0), + first_frame_arrived_(false), + capture_start_rtp_time_stamp_(0), + capture_start_ntp_time_ms_(0) { } virtual ~WebRtcRenderAdapter() { @@ -213,19 +221,31 @@ class WebRtcRenderAdapter : public webrtc::ExternalRenderer { virtual int DeliverFrame(unsigned char* buffer, int buffer_size, - uint32_t time_stamp, + uint32_t rtp_time_stamp, #ifdef USE_WEBRTC_DEV_BRANCH int64_t ntp_time_ms, #endif int64_t render_time, void* handle) { talk_base::CritScope cs(&crit_); + if (!first_frame_arrived_) { + first_frame_arrived_ = true; + capture_start_rtp_time_stamp_ = rtp_time_stamp; + } +#ifdef USE_WEBRTC_DEV_BRANCH + if (ntp_time_ms > 0) { + uint32 elapsed_time_ms = + (rtp_time_stamp - capture_start_rtp_time_stamp_) / + kVideoCodecClockratekHz; + capture_start_ntp_time_ms_ = ntp_time_ms - elapsed_time_ms; + } +#endif frame_rate_tracker_.Update(1); if (renderer_ == NULL) { return 0; } // Convert 90K rtp timestamp to ns timestamp. - int64 rtp_time_stamp_in_ns = (time_stamp / 90) * + int64 rtp_time_stamp_in_ns = (rtp_time_stamp / kVideoCodecClockratekHz) * talk_base::kNumNanosecsPerMillisec; // Convert milisecond render time to ns timestamp. int64 render_time_stamp_in_ns = render_time * @@ -244,10 +264,10 @@ class WebRtcRenderAdapter : public webrtc::ExternalRenderer { virtual bool IsTextureSupported() { return true; } int DeliverBufferFrame(unsigned char* buffer, int buffer_size, - int64 elapsed_time, int64 time_stamp) { + int64 elapsed_time, int64 rtp_time_stamp_in_ns) { WebRtcVideoFrame video_frame; video_frame.Alias(buffer, buffer_size, width_, height_, - 1, 1, elapsed_time, time_stamp, 0); + 1, 1, elapsed_time, rtp_time_stamp_in_ns, 0); // Sanity check on decoded frame size. if (buffer_size != static_cast<int>(VideoFrame::SizeOf(width_, height_))) { @@ -260,10 +280,12 @@ class WebRtcRenderAdapter : public webrtc::ExternalRenderer { return ret; } - int DeliverTextureFrame(void* handle, int64 elapsed_time, int64 time_stamp) { + int DeliverTextureFrame(void* handle, + int64 elapsed_time, + int64 rtp_time_stamp_in_ns) { WebRtcTextureVideoFrame video_frame( static_cast<webrtc::NativeHandle*>(handle), width_, height_, - elapsed_time, time_stamp); + elapsed_time, rtp_time_stamp_in_ns); return renderer_->RenderFrame(&video_frame); } @@ -287,6 +309,11 @@ class WebRtcRenderAdapter : public webrtc::ExternalRenderer { return renderer_; } + int64 capture_start_ntp_time_ms() { + talk_base::CritScope cs(&crit_); + return capture_start_ntp_time_ms_; + } + private: talk_base::CriticalSection crit_; VideoRenderer* renderer_; @@ -294,6 +321,9 @@ class WebRtcRenderAdapter : public webrtc::ExternalRenderer { unsigned int width_; unsigned int height_; talk_base::RateTracker frame_rate_tracker_; + bool first_frame_arrived_; + uint32 capture_start_rtp_time_stamp_; + int64 capture_start_ntp_time_ms_; }; class WebRtcDecoderObserver : public webrtc::ViEDecoderObserver { @@ -2538,6 +2568,8 @@ bool WebRtcVideoMediaChannel::GetStats(const StatsOptions& options, int fps = channel->render_adapter()->framerate(); rinfo.framerate_decoded = fps; rinfo.framerate_output = fps; + rinfo.capture_start_ntp_time_ms = + channel->render_adapter()->capture_start_ntp_time_ms(); channel->decoder_observer()->ExportTo(&rinfo); webrtc::RtcpPacketTypeCounter rtcp_sent; |