• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium OS 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 #ifndef MEDIA_V4L2_DEVICE_H_
6 #define MEDIA_V4L2_DEVICE_H_
7 
8 #include <errno.h>
9 #include <fcntl.h>
10 #include <linux/videodev2.h>
11 #include <malloc.h>
12 #include <stdint.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <sys/ioctl.h>
17 #include <sys/mman.h>
18 #include <unistd.h>
19 
20 #include <vector>
21 
22 class V4L2Device {
23  public:
24   enum IOMethod {
25     IO_METHOD_UNDEFINED,
26     IO_METHOD_MMAP,
27     IO_METHOD_USERPTR,
28   };
29 
30   enum ConstantFramerate {
31     DEFAULT_FRAMERATE_SETTING,
32     ENABLE_CONSTANT_FRAMERATE,
33     DISABLE_CONSTANT_FRAMERATE,
34   };
35 
36   struct Buffer {
37     void* start;
38     size_t length;
39   };
40 
41   V4L2Device(const char* dev_name,
42              uint32_t buffers);
43   virtual ~V4L2Device();
44 
45   virtual bool OpenDevice();
46   virtual void CloseDevice();
47   // After this function is called, the driver may adjust the settings if they
48   // are unsupported.  Caller can use GetV4L2Format() and GetFrameRate() to know
49   // the actual settings.  If V4L2_CAP_TIMEPERFRAME is unsupported, fps will be
50   // ignored.
51   virtual bool InitDevice(IOMethod io,
52                           uint32_t width,
53                           uint32_t height,
54                           uint32_t pixfmt,
55                           float fps,
56                           ConstantFramerate constant_framerate,
57                           uint32_t num_skip_frames);
58   virtual bool UninitDevice();
59   virtual bool StartCapture();
60   virtual bool StopCapture();
61   virtual bool Run(uint32_t time_in_sec);
62   virtual int32_t ReadOneFrame(uint32_t* buffer_index, uint32_t* data_size);
63   virtual bool EnqueueBuffer(uint32_t buffer_index);
64 
65   // Helper methods.
66   bool EnumInput();
67   bool EnumStandard();
68   bool EnumControl(bool show_menu = true);
69   bool EnumControlMenu(const v4l2_queryctrl& query_ctrl);
70   bool EnumFormat(uint32_t* num_formats, bool show_fmt = true);
71   bool EnumFrameSize(
72       uint32_t pixfmt, uint32_t* num_sizes, bool show_frmsize = true);
73   bool EnumFrameInterval(uint32_t pixfmt, uint32_t width, uint32_t height,
74                          uint32_t* num_intervals, bool show_intervals = true);
75 
76   bool QueryControl(uint32_t id, v4l2_queryctrl* ctrl);
77   bool SetControl(uint32_t id, int32_t value);
78   bool ProbeCaps(v4l2_capability* cap, bool show_caps = false);
79   bool GetCropCap(v4l2_cropcap* cropcap);
80   bool GetCrop(v4l2_crop* crop);
81   bool SetCrop(v4l2_crop* crop);
82   bool GetParam(v4l2_streamparm* param);
83   bool SetParam(v4l2_streamparm* param);
84   bool SetFrameRate(float fps);
85   bool GetPixelFormat(uint32_t index, uint32_t* pixfmt);
86   bool GetFrameSize(
87       uint32_t index, uint32_t pixfmt, uint32_t *width, uint32_t *height);
88   bool GetFrameInterval(
89       uint32_t index, uint32_t pixfmt, uint32_t width, uint32_t height,
90       float* frame_rate);
91   float GetFrameRate();
92   bool GetV4L2Format(v4l2_format* format);
93   bool Stop();
94 
95   // Getter.
GetNumFrames()96   uint32_t GetNumFrames() const { return frame_timestamps_.size(); }
97 
GetFrameTimestamps()98   const std::vector<int64_t>& GetFrameTimestamps() const {
99     return frame_timestamps_;
100   }
101 
GetBufferInfo(uint32_t index)102   const Buffer& GetBufferInfo(uint32_t index) {
103     return v4l2_buffers_[index];
104   }
105 
106   static uint32_t MapFourCC(const char* fourcc);
107 
108   virtual void ProcessImage(const void* p);
109 
110  private:
111   int32_t DoIoctl(int32_t request, void* arg);
112   bool InitMmapIO();
113   bool InitUserPtrIO(uint32_t buffer_size);
114   bool AllocateBuffer(uint32_t buffer_count);
115   bool FreeBuffer();
116   uint64_t Now();
117 
118   const char* dev_name_;
119   IOMethod io_;
120   int32_t fd_;
121   Buffer* v4l2_buffers_;
122   uint32_t num_buffers_;  // Actual buffers allocation.
123   uint32_t min_buffers_;  // Minimum buffers requirement.
124   bool stopped_;
125 
126   // Sets to true when buffers are initialized.
127   bool initialized_;
128   // Sets to true if stream on.
129   bool stream_on_;
130   std::vector<int64_t> frame_timestamps_;
131   // The number of frames should be skipped after stream on.
132   uint32_t num_skip_frames_;
133 };
134 
135 #endif  // MEDIA_V4L2_DEVICE_H_
136