Home | History | Annotate | Download | only in linux
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Linux specific implementation of VideoCaptureDevice.
      6 // V4L2 is used for capturing. V4L2 does not provide its own thread for
      7 // capturing so this implementation uses a Chromium thread for fetching frames
      8 // from V4L2.
      9 
     10 #ifndef MEDIA_VIDEO_CAPTURE_LINUX_VIDEO_CAPTURE_DEVICE_LINUX_H_
     11 #define MEDIA_VIDEO_CAPTURE_LINUX_VIDEO_CAPTURE_DEVICE_LINUX_H_
     12 
     13 #include <string>
     14 
     15 #include "base/threading/thread.h"
     16 #include "media/video/capture/video_capture_device.h"
     17 #include "media/video/capture/video_capture_types.h"
     18 
     19 namespace media {
     20 
     21 class VideoCaptureDeviceLinux : public VideoCaptureDevice {
     22  public:
     23   explicit VideoCaptureDeviceLinux(const Name& device_name);
     24   virtual ~VideoCaptureDeviceLinux();
     25 
     26   // VideoCaptureDevice implementation.
     27   virtual void AllocateAndStart(const VideoCaptureParams& params,
     28                                 scoped_ptr<Client> client) OVERRIDE;
     29 
     30   virtual void StopAndDeAllocate() OVERRIDE;
     31 
     32  private:
     33   enum InternalState {
     34     kIdle,  // The device driver is opened but camera is not in use.
     35     kCapturing,  // Video is being captured.
     36     kError  // Error accessing HW functions.
     37             // User needs to recover by destroying the object.
     38   };
     39 
     40   // Buffers used to receive video frames from with v4l2.
     41   struct Buffer {
     42     Buffer() : start(0), length(0) {}
     43     void* start;
     44     size_t length;
     45   };
     46 
     47   // Called on the v4l2_thread_.
     48   void OnAllocateAndStart(int width,
     49                           int height,
     50                           int frame_rate,
     51                           scoped_ptr<Client> client);
     52   void OnStopAndDeAllocate();
     53   void OnCaptureTask();
     54 
     55   bool AllocateVideoBuffers();
     56   void DeAllocateVideoBuffers();
     57   void SetErrorState(const std::string& reason);
     58 
     59   InternalState state_;
     60   scoped_ptr<VideoCaptureDevice::Client> client_;
     61   Name device_name_;
     62   int device_fd_;  // File descriptor for the opened camera device.
     63   base::Thread v4l2_thread_;  // Thread used for reading data from the device.
     64   Buffer* buffer_pool_;
     65   int buffer_pool_size_;  // Number of allocated buffers.
     66   int timeout_count_;
     67   VideoCaptureFormat capture_format_;
     68 
     69   DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureDeviceLinux);
     70 };
     71 
     72 }  // namespace media
     73 
     74 #endif  // MEDIA_VIDEO_CAPTURE_LINUX_VIDEO_CAPTURE_DEVICE_LINUX_H_
     75