camera.h revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_CAMERA_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_LOGIN_CAMERA_H_
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/timer.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SkBitmap;
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace base {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TimeDelta;
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace base
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Class that wraps interaction with video capturing device. Returns
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// frames captured with specified intervals of time via delegate interface.
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Camera {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Delegate {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Delegate() {}
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Called with specified intervals with decoded frame as a parameter.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void OnVideoFrameCaptured(const SkBitmap& frame) = 0;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit Camera(Delegate* delegate);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~Camera();
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initializes camera device. Returns true if succeeded, false otherwise.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Does nothing on subsequent calls until Uninitialize is called.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the desired width and height of the frame to receive from camera.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool Initialize(int desired_width, int desired_height);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Uninitializes the camera. Can be called anytime, any number of times.
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Uninitialize();
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts capturing video frames with specified interval.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Does nothing on subsequent calls until StopCapturing is called.
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if succeeded, false otherwise.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool StartCapturing(const base::TimeDelta& interval);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stops capturing video frames. Can be called anytime, any number of
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // times.
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StopCapturing();
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_mirrored(bool mirrored) { mirrored_ = mirrored; }
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tries to open the device with specified name. Returns opened device
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // descriptor if succeeds, -1 otherwise.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int OpenDevice(const char* device_name) const;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initializes reading mode for the device. Returns true on success, false
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // otherwise.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool InitializeReadingMode(int fd);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Unmaps video buffers stored in |buffers_|.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UnmapVideoBuffers();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by |timer_| to get the frame from video device and send it to
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |delegate_| via its method.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnCapture();
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reads a frame from the video device. If retry is needed, returns false.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Otherwise, returns true despite of success status.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ReadFrame();
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Transforms raw data received from camera into SkBitmap with desired
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // size and notifies the delegate that the image is ready.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ProcessImage(void* data);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Defines a buffer in memory where one frame from the camera is stored.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct VideoBuffer {
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void* start;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    size_t length;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delegate that receives the frames from the camera.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Delegate* delegate_;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Name of the device file, i.e. "/dev/video0".
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string device_name_;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // File descriptor of the opened device.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int device_descriptor_;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Vector of buffers where to store video frames from camera.
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<VideoBuffer> buffers_;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Timer for getting frames.
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::RepeatingTimer<Camera> timer_;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Desired size of the frame to get from camera. If it doesn't match
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // camera's supported resolution, higher resolution is selected (if
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // available) and frame is cropped. If higher resolution is not available,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the highest is selected and resized.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int desired_width_;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int desired_height_;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Size of the frame that camera will give to us. It may not match the
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // desired size.
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int frame_width_;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int frame_height_;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If set to true, the returned image will be reflected from the Y axis to
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // mimic mirror behavior.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool mirrored_;
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(Camera);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_CAMERA_H_
122