summaryrefslogtreecommitdiffstats
path: root/media/video
diff options
context:
space:
mode:
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_;