video_capture_device_linux.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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
19namespace media {
20
21class VideoCaptureDeviceLinux : public VideoCaptureDevice {
22 public:
23  explicit VideoCaptureDeviceLinux(const Name& device_name);
24  virtual ~VideoCaptureDeviceLinux();
25
26  // VideoCaptureDevice implementation.
27  virtual void AllocateAndStart(const VideoCaptureCapability& capture_format,
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
68  DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureDeviceLinux);
69};
70
71}  // namespace media
72
73#endif  // MEDIA_VIDEO_CAPTURE_LINUX_VIDEO_CAPTURE_DEVICE_LINUX_H_
74