From f395836748334521dd3bcc306bbf4b7044ff0d4c Mon Sep 17 00:00:00 2001 From: "justinlin@chromium.org" Date: Tue, 16 Apr 2013 01:11:53 +0000 Subject: Use NTP time for video frame timestamp. Add tracing for capture timestamps. BUG=225209 TEST=Check that AppRTC still works. Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=192670 Review URL: https://codereview.chromium.org/13554003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@194268 0039d316-1c4b-4281-b951-d872f2087c98 --- .../media/web_contents_video_capture_device.cc | 5 +++-- content/renderer/media/rtc_video_capturer.cc | 23 +++++++++++++++++++++- content/renderer/media/rtc_video_capturer.h | 1 + content/renderer/media/rtc_video_renderer.cc | 14 +++++++++---- 4 files changed, 36 insertions(+), 7 deletions(-) (limited to 'content') diff --git a/content/browser/renderer_host/media/web_contents_video_capture_device.cc b/content/browser/renderer_host/media/web_contents_video_capture_device.cc index de783dc..8530cf4 100644 --- a/content/browser/renderer_host/media/web_contents_video_capture_device.cc +++ b/content/browser/renderer_host/media/web_contents_video_capture_device.cc @@ -529,8 +529,9 @@ void CaptureOracle::DidCaptureFrame( bool success) { base::AutoLock guard(lock_); - TRACE_EVENT_ASYNC_END1("mirroring", "Capture", frame.get(), - "success", success); + TRACE_EVENT_ASYNC_END2("mirroring", "Capture", frame.get(), + "success", success, + "timestamp", timestamp.ToInternalValue()); if (!consumer_ || !is_started_) return; // Capture is stopped. diff --git a/content/renderer/media/rtc_video_capturer.cc b/content/renderer/media/rtc_video_capturer.cc index 02b52f0..f60e6c8 100644 --- a/content/renderer/media/rtc_video_capturer.cc +++ b/content/renderer/media/rtc_video_capturer.cc @@ -5,6 +5,7 @@ #include "content/renderer/media/rtc_video_capturer.h" #include "base/bind.h" +#include "base/debug/trace_event.h" namespace content { @@ -15,6 +16,17 @@ RtcVideoCapturer::RtcVideoCapturer( : is_screencast_(is_screencast), delegate_(new RtcVideoCaptureDelegate(id, vc_manager)), state_(VIDEO_CAPTURE_STATE_STOPPED) { + base::Time::Exploded exploded = {}; + exploded.year = 1900; + exploded.month = 1; + exploded.day_of_week = 0; + exploded.day_of_month = 1; + exploded.hour = 0; + exploded.minute = 0; + exploded.second = 0; + exploded.millisecond = 0; + DCHECK(exploded.HasValidValues()); + ntp_epoch_ = base::Time::FromUTCExploded(exploded); } RtcVideoCapturer::~RtcVideoCapturer() { @@ -100,11 +112,20 @@ void RtcVideoCapturer::OnFrameCaptured( // cricket::CapturedFrame time is in nanoseconds. frame.elapsed_time = (buf.timestamp - start_time_).InMicroseconds() * base::Time::kNanosecondsPerMicrosecond; - frame.time_stamp = frame.elapsed_time; + // Timestamp in NTP time (seconds since 0:00 UTC 1 January 1900) in ms. + frame.time_stamp = (buf.timestamp - ntp_epoch_).InMilliseconds(); frame.data = buf.memory_pointer; frame.pixel_height = 1; frame.pixel_width = 1; + TRACE_EVENT_INSTANT2("rtc_video_capturer", + "OnFrameCaptured", + TRACE_EVENT_SCOPE_THREAD, + "elapsed time", + frame.elapsed_time, + "timestamp", + frame.time_stamp); + // This signals to libJingle that a new VideoFrame is available. // libJingle have no assumptions on what thread this signal come from. SignalFrameCaptured(this, &frame); diff --git a/content/renderer/media/rtc_video_capturer.h b/content/renderer/media/rtc_video_capturer.h index 84d6c84..b526514 100644 --- a/content/renderer/media/rtc_video_capturer.h +++ b/content/renderer/media/rtc_video_capturer.h @@ -51,6 +51,7 @@ class RtcVideoCapturer scoped_refptr delegate_; VideoCaptureState state_; base::Time start_time_; + base::Time ntp_epoch_; DISALLOW_COPY_AND_ASSIGN(RtcVideoCapturer); }; diff --git a/content/renderer/media/rtc_video_renderer.cc b/content/renderer/media/rtc_video_renderer.cc index 6af00f9..5087711 100644 --- a/content/renderer/media/rtc_video_renderer.cc +++ b/content/renderer/media/rtc_video_renderer.cc @@ -11,7 +11,6 @@ #include "base/message_loop_proxy.h" #include "media/base/video_frame.h" #include "media/base/video_util.h" -#include "third_party/libjingle/source/talk/base/timeutils.h" #include "third_party/libjingle/source/talk/media/base/videoframe.h" using media::CopyYPlane; @@ -74,15 +73,22 @@ void RTCVideoRenderer::SetSize(int width, int height) { } void RTCVideoRenderer::RenderFrame(const cricket::VideoFrame* frame) { - base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds( - frame->GetTimeStamp() / talk_base::kNumNanosecsPerMillisec); + TRACE_EVENT_INSTANT2("rtc_video_renderer", + "RenderFrame", + TRACE_EVENT_SCOPE_THREAD, + "elapsed time", + frame->GetElapsedTime(), + "timestamp", + frame->GetTimeStamp()); + gfx::Size size(frame->GetWidth(), frame->GetHeight()); scoped_refptr video_frame = media::VideoFrame::CreateFrame(media::VideoFrame::YV12, size, gfx::Rect(size), size, - timestamp); + base::TimeDelta::FromMilliseconds( + frame->GetTimeStamp())); // Aspect ratio unsupported; DCHECK when there are non-square pixels. DCHECK_EQ(frame->GetPixelWidth(), 1u); -- cgit v1.1