diff options
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_; |