summaryrefslogtreecommitdiffstats
path: root/media/capture
diff options
context:
space:
mode:
authorqiangchen <qiangchen@chromium.org>2015-09-10 17:04:12 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-11 00:05:04 +0000
commitb22216f19a3864c98588f5008a112fb9fc715371 (patch)
tree72442bac8093098f660b0fb5acf8d0fbd08ce83a /media/capture
parentdf58b20defbccafbd9fa35ba2842e56b687a07fc (diff)
downloadchromium_src-b22216f19a3864c98588f5008a112fb9fc715371.zip
chromium_src-b22216f19a3864c98588f5008a112fb9fc715371.tar.gz
chromium_src-b22216f19a3864c98588f5008a112fb9fc715371.tar.bz2
WebRTC render smoothness test shows on windows platform the timestamps on the video frames are quite irregular. The reason is that we read the system clock time, when the frame is available to chromium, but the system clock may not be high definition.
In this CL, we changed the behavior to reading timestamp from the capture driver. BUG=529949 TEST=all unit test and browser test passing, apprtc working as before. Review URL: https://codereview.chromium.org/1324683004 Cr-Commit-Position: refs/heads/master@{#348291}
Diffstat (limited to 'media/capture')
-rw-r--r--media/capture/video/win/sink_filter_observer_win.h3
-rw-r--r--media/capture/video/win/sink_input_pin_win.cc12
-rw-r--r--media/capture/video/win/video_capture_device_win.cc7
-rw-r--r--media/capture/video/win/video_capture_device_win.h3
4 files changed, 20 insertions, 5 deletions
diff --git a/media/capture/video/win/sink_filter_observer_win.h b/media/capture/video/win/sink_filter_observer_win.h
index 9dfd08b..acfc70f 100644
--- a/media/capture/video/win/sink_filter_observer_win.h
+++ b/media/capture/video/win/sink_filter_observer_win.h
@@ -14,7 +14,8 @@ class SinkFilterObserver {
public:
// SinkFilter will call this function with all frames delivered to it.
// buffer in only valid during this function call.
- virtual void FrameReceived(const uint8* buffer, int length) = 0;
+ virtual void FrameReceived(const uint8* buffer, int length,
+ base::TimeTicks timestamp) = 0;
protected:
virtual ~SinkFilterObserver();
diff --git a/media/capture/video/win/sink_input_pin_win.cc b/media/capture/video/win/sink_input_pin_win.cc
index cbfaa82..91baf2a 100644
--- a/media/capture/video/win/sink_input_pin_win.cc
+++ b/media/capture/video/win/sink_input_pin_win.cc
@@ -198,7 +198,17 @@ HRESULT SinkInputPin::Receive(IMediaSample* sample) {
if (FAILED(sample->GetPointer(&buffer)))
return S_FALSE;
- observer_->FrameReceived(buffer, length);
+ REFERENCE_TIME start_time, end_time;
+ base::TimeTicks timestamp;
+ if (SUCCEEDED(sample->GetTime(&start_time, &end_time))) {
+ DCHECK(start_time <= end_time);
+ timestamp += base::TimeDelta::FromMicroseconds(start_time / 10);
+ } else {
+ timestamp = base::TimeTicks::Now();
+ }
+
+
+ observer_->FrameReceived(buffer, length, timestamp);
return S_OK;
}
diff --git a/media/capture/video/win/video_capture_device_win.cc b/media/capture/video/win/video_capture_device_win.cc
index 60e4fe8..055fc21 100644
--- a/media/capture/video/win/video_capture_device_win.cc
+++ b/media/capture/video/win/video_capture_device_win.cc
@@ -446,9 +446,12 @@ void VideoCaptureDeviceWin::StopAndDeAllocate() {
}
// Implements SinkFilterObserver::SinkFilterObserver.
-void VideoCaptureDeviceWin::FrameReceived(const uint8* buffer, int length) {
+void VideoCaptureDeviceWin::FrameReceived(
+ const uint8* buffer,
+ int length,
+ base::TimeTicks timestamp) {
client_->OnIncomingCapturedData(buffer, length, capture_format_, 0,
- base::TimeTicks::Now());
+ timestamp);
}
bool VideoCaptureDeviceWin::CreateCapabilityMap() {
diff --git a/media/capture/video/win/video_capture_device_win.h b/media/capture/video/win/video_capture_device_win.h
index 62dcbc4..dec02c1 100644
--- a/media/capture/video/win/video_capture_device_win.h
+++ b/media/capture/video/win/video_capture_device_win.h
@@ -77,7 +77,8 @@ class VideoCaptureDeviceWin : public VideoCaptureDevice,
};
// Implements SinkFilterObserver.
- void FrameReceived(const uint8* buffer, int length) override;
+ void FrameReceived(const uint8* buffer, int length,
+ base::TimeTicks timestamp) override;
bool CreateCapabilityMap();
void SetAntiFlickerInCaptureFilter(const VideoCaptureParams& params);