diff options
author | wjia@chromium.org <wjia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-17 21:46:09 +0000 |
---|---|---|
committer | wjia@chromium.org <wjia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-17 21:46:09 +0000 |
commit | 84a6ca3faf40bb5af170dada647d35368687ba02 (patch) | |
tree | fb33baf320cc3e4bcf29525034704248aa4310b7 /media/video | |
parent | 7a4d58a41fd045da4d0945e1eadcdb5168d19f84 (diff) | |
download | chromium_src-84a6ca3faf40bb5af170dada647d35368687ba02.zip chromium_src-84a6ca3faf40bb5af170dada647d35368687ba02.tar.gz chromium_src-84a6ca3faf40bb5af170dada647d35368687ba02.tar.bz2 |
Throttle video frame delivery when camera pumps it too fast on Android.
This allows JS to get desired frame rate when camera delivers frames too fast.
BUG=285394
R=qinmin@chromium.org
Review URL: https://codereview.chromium.org/23440037
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223702 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/video')
-rw-r--r-- | media/video/capture/android/video_capture_device_android.cc | 26 | ||||
-rw-r--r-- | media/video/capture/android/video_capture_device_android.h | 4 |
2 files changed, 27 insertions, 3 deletions
diff --git a/media/video/capture/android/video_capture_device_android.cc b/media/video/capture/android/video_capture_device_android.cc index 152cfda..3574760 100644 --- a/media/video/capture/android/video_capture_device_android.cc +++ b/media/video/capture/android/video_capture_device_android.cc @@ -94,6 +94,7 @@ bool VideoCaptureDeviceAndroid::RegisterVideoCaptureDevice(JNIEnv* env) { VideoCaptureDeviceAndroid::VideoCaptureDeviceAndroid(const Name& device_name) : state_(kIdle), + got_first_frame_(false), observer_(NULL), device_name_(device_name), current_settings_() { @@ -155,6 +156,12 @@ void VideoCaptureDeviceAndroid::Allocate( CHECK(current_settings_.width > 0 && !(current_settings_.width % 2)); CHECK(current_settings_.height > 0 && !(current_settings_.height % 2)); + if (capture_format.frame_rate > 0) { + frame_interval_ = base::TimeDelta::FromMicroseconds( + (base::Time::kMicrosecondsPerSecond + capture_format.frame_rate - 1) / + capture_format.frame_rate); + } + DVLOG(1) << "VideoCaptureDeviceAndroid::Allocate: queried width=" << current_settings_.width << ", height=" @@ -169,6 +176,7 @@ void VideoCaptureDeviceAndroid::Start() { DVLOG(1) << "VideoCaptureDeviceAndroid::Start"; { base::AutoLock lock(lock_); + got_first_frame_ = false; DCHECK_EQ(state_, kAllocated); } @@ -249,9 +257,21 @@ void VideoCaptureDeviceAndroid::OnFrameAvailable( return; } - observer_->OnIncomingCapturedFrame( - reinterpret_cast<uint8*>(buffer), length, base::Time::Now(), - rotation, flip_vert, flip_horiz); + base::TimeTicks current_time = base::TimeTicks::Now(); + if (!got_first_frame_) { + // Set aside one frame allowance for fluctuation. + expected_next_frame_time_ = current_time - frame_interval_; + got_first_frame_ = true; + } + + // Deliver the frame when it doesn't arrive too early. + if (expected_next_frame_time_ <= current_time) { + expected_next_frame_time_ += frame_interval_; + + observer_->OnIncomingCapturedFrame( + reinterpret_cast<uint8*>(buffer), length, base::Time::Now(), + rotation, flip_vert, flip_horiz); + } env->ReleaseByteArrayElements(data, buffer, JNI_ABORT); } diff --git a/media/video/capture/android/video_capture_device_android.h b/media/video/capture/android/video_capture_device_android.h index 297a66d..845d278 100644 --- a/media/video/capture/android/video_capture_device_android.h +++ b/media/video/capture/android/video_capture_device_android.h @@ -11,6 +11,7 @@ #include "base/android/scoped_java_ref.h" #include "base/synchronization/lock.h" #include "base/threading/thread.h" +#include "base/time/time.h" #include "media/base/media_export.h" #include "media/video/capture/video_capture_device.h" @@ -61,6 +62,9 @@ class MEDIA_EXPORT VideoCaptureDeviceAndroid : public VideoCaptureDevice1 { // accessed from different threads. base::Lock lock_; InternalState state_; + bool got_first_frame_; + base::TimeTicks expected_next_frame_time_; + base::TimeDelta frame_interval_; VideoCaptureDevice::EventHandler* observer_; Name device_name_; |