summaryrefslogtreecommitdiffstats
path: root/media/video
diff options
context:
space:
mode:
authorwjia@chromium.org <wjia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-17 21:46:09 +0000
committerwjia@chromium.org <wjia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-17 21:46:09 +0000
commit84a6ca3faf40bb5af170dada647d35368687ba02 (patch)
treefb33baf320cc3e4bcf29525034704248aa4310b7 /media/video
parent7a4d58a41fd045da4d0945e1eadcdb5168d19f84 (diff)
downloadchromium_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.cc26
-rw-r--r--media/video/capture/android/video_capture_device_android.h4
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_;