| Index: chrome/browser/chromeos/login/camera.cc
|
| diff --git a/chrome/browser/chromeos/login/camera.cc b/chrome/browser/chromeos/login/camera.cc
|
| index 1fb85f8ee3261f32e48f8a06ba31869a7d73cc4c..59e77d32b3b381e6e8a61158f99d11a56d49923c 100644
|
| --- a/chrome/browser/chromeos/login/camera.cc
|
| +++ b/chrome/browser/chromeos/login/camera.cc
|
| @@ -22,6 +22,7 @@
|
| #include "base/logging.h"
|
| #include "base/string_util.h"
|
| #include "base/stringprintf.h"
|
| +#include "base/thread.h"
|
| #include "base/time.h"
|
| #include "chrome/browser/browser_thread.h"
|
| #include "gfx/size.h"
|
| @@ -113,8 +114,6 @@ gfx::Size get_best_frame_size(int fd,
|
|
|
| // Default camera device name.
|
| const char kDeviceName[] = "/dev/video0";
|
| -// Name for camera thread.
|
| -const char kCameraThreadName[] = "Chrome_CameraThread";
|
| // Default width of each frame received from the camera.
|
| const int kFrameWidth = 640;
|
| // Default height of each frame received from the camera.
|
| @@ -126,18 +125,12 @@ const long kSelectTimeout = 1 * base::Time::kMicrosecondsPerSecond;
|
|
|
| } // namespace
|
|
|
| -// static
|
| -Lock Camera::image_lock_;
|
| -
|
| -// static
|
| -Lock Camera::thread_lock_;
|
| -
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // Camera, public members:
|
|
|
| -Camera::Camera(Delegate* delegate, bool mirrored)
|
| +Camera::Camera(Delegate* delegate, base::Thread* thread, bool mirrored)
|
| : delegate_(delegate),
|
| - camera_thread_(kCameraThreadName),
|
| + thread_(thread),
|
| device_name_(kDeviceName),
|
| device_descriptor_(-1),
|
| is_capturing_(false),
|
| @@ -152,7 +145,6 @@ Camera::~Camera() {
|
| DCHECK_EQ(-1, device_descriptor_) << "Don't forget to uninitialize camera.";
|
| }
|
|
|
| -// If this method is called there's no need to call PostCameraThreadAck().
|
| void Camera::ReportFailure() {
|
| DCHECK(IsOnCameraThread());
|
| if (device_descriptor_ == -1) {
|
| @@ -179,6 +171,7 @@ void Camera::ReportFailure() {
|
| void Camera::Initialize(int desired_width, int desired_height) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| PostCameraTask(
|
| + FROM_HERE,
|
| NewRunnableMethod(this,
|
| &Camera::DoInitialize,
|
| desired_width,
|
| @@ -187,11 +180,9 @@ void Camera::Initialize(int desired_width, int desired_height) {
|
|
|
| void Camera::DoInitialize(int desired_width, int desired_height) {
|
| DCHECK(IsOnCameraThread());
|
| - DCHECK(delegate_);
|
|
|
| if (device_descriptor_ != -1) {
|
| LOG(WARNING) << "Camera is initialized already.";
|
| - PostCameraThreadAck();
|
| return;
|
| }
|
|
|
| @@ -247,34 +238,21 @@ void Camera::DoInitialize(int desired_width, int desired_height) {
|
| frame_height_ = frame_size.height();
|
| desired_width_ = desired_width;
|
| desired_height_ = desired_height;
|
| - // No need to call PostCameraThreadAck() back as this method
|
| - // is being posted instead.
|
| BrowserThread::PostTask(
|
| BrowserThread::UI,
|
| FROM_HERE,
|
| NewRunnableMethod(this, &Camera::OnInitializeSuccess));
|
| }
|
|
|
| -void Camera::CameraThreadAck() {
|
| -}
|
| -
|
| -void Camera::PostCameraThreadAck() {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - NewRunnableMethod(this, &Camera::CameraThreadAck));
|
| -}
|
| -
|
| void Camera::Uninitialize() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - PostCameraTask(NewRunnableMethod(this, &Camera::DoUninitialize));
|
| + PostCameraTask(FROM_HERE, NewRunnableMethod(this, &Camera::DoUninitialize));
|
| }
|
|
|
| void Camera::DoUninitialize() {
|
| DCHECK(IsOnCameraThread());
|
| if (device_descriptor_ == -1) {
|
| LOG(WARNING) << "Calling uninitialize for uninitialized camera.";
|
| - PostCameraThreadAck();
|
| return;
|
| }
|
| DoStopCapturing();
|
| @@ -282,20 +260,18 @@ void Camera::DoUninitialize() {
|
| if (close(device_descriptor_) == -1)
|
| log_errno("Closing the device failed.");
|
| device_descriptor_ = -1;
|
| - // Maintain a reference so that camera object isn't deleted on wrong thread.
|
| - PostCameraThreadAck();
|
| }
|
|
|
| void Camera::StartCapturing() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - PostCameraTask(NewRunnableMethod(this, &Camera::DoStartCapturing));
|
| + PostCameraTask(FROM_HERE,
|
| + NewRunnableMethod(this, &Camera::DoStartCapturing));
|
| }
|
|
|
| void Camera::DoStartCapturing() {
|
| DCHECK(IsOnCameraThread());
|
| if (is_capturing_) {
|
| LOG(WARNING) << "Capturing is already started.";
|
| - PostCameraThreadAck();
|
| return;
|
| }
|
|
|
| @@ -324,18 +300,19 @@ void Camera::DoStartCapturing() {
|
| NewRunnableMethod(this,
|
| &Camera::OnStartCapturingSuccess));
|
| is_capturing_ = true;
|
| - PostCameraTask(NewRunnableMethod(this, &Camera::OnCapture));
|
| + PostCameraTask(FROM_HERE,
|
| + NewRunnableMethod(this, &Camera::OnCapture));
|
| }
|
|
|
| void Camera::StopCapturing() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - PostCameraTask(NewRunnableMethod(this, &Camera::DoStopCapturing));
|
| + PostCameraTask(FROM_HERE,
|
| + NewRunnableMethod(this, &Camera::DoStopCapturing));
|
| }
|
|
|
| void Camera::DoStopCapturing() {
|
| DCHECK(IsOnCameraThread());
|
| if (!is_capturing_) {
|
| - PostCameraThreadAck();
|
| LOG(WARNING) << "Calling StopCapturing when capturing is not started.";
|
| return;
|
| }
|
| @@ -344,8 +321,6 @@ void Camera::DoStopCapturing() {
|
| v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
| if (xioctl(device_descriptor_, VIDIOC_STREAMOFF, &type) == -1)
|
| log_errno("VIDIOC_STREAMOFF failed.");
|
| - // Maintain a reference so that camera object isn't deleted on wrong thread.
|
| - PostCameraThreadAck();
|
| }
|
|
|
| void Camera::GetFrame(SkBitmap* frame) {
|
| @@ -430,11 +405,8 @@ void Camera::UnmapVideoBuffers() {
|
|
|
| void Camera::OnCapture() {
|
| DCHECK(IsOnCameraThread());
|
| - if (!is_capturing_) {
|
| - // Maintain a reference so that camera object isn't deleted on wrong thread.
|
| - PostCameraThreadAck();
|
| + if (!is_capturing_)
|
| return;
|
| - }
|
|
|
| do {
|
| fd_set fds;
|
| @@ -461,7 +433,8 @@ void Camera::OnCapture() {
|
| // EAGAIN - continue select loop.
|
| } while (!ReadFrame());
|
|
|
| - PostCameraTask(NewRunnableMethod(this, &Camera::OnCapture));
|
| + PostCameraTask(FROM_HERE,
|
| + NewRunnableMethod(this, &Camera::OnCapture));
|
| }
|
|
|
| bool Camera::ReadFrame() {
|
| @@ -601,14 +574,16 @@ void Camera::OnCaptureFailure() {
|
|
|
| bool Camera::IsOnCameraThread() const {
|
| AutoLock lock(thread_lock_);
|
| - return MessageLoop::current() == camera_thread_.message_loop();
|
| + return thread_ && MessageLoop::current() == thread_->message_loop();
|
| }
|
|
|
| -void Camera::PostCameraTask(Task* task) {
|
| +void Camera::PostCameraTask(const tracked_objects::Location& from_here,
|
| + Task* task) {
|
| AutoLock lock(thread_lock_);
|
| - if (!camera_thread_.IsRunning())
|
| - camera_thread_.Start();
|
| - camera_thread_.message_loop()->PostTask(FROM_HERE, task);
|
| + if (!thread_)
|
| + return;
|
| + DCHECK(thread_->IsRunning());
|
| + thread_->message_loop()->PostTask(from_here, task);
|
| }
|
|
|
| } // namespace chromeos
|
|
|