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