Home | History | Annotate | Download | only in src
      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 class V4L2Device {
     21  public:
     22   enum IOMethod {
     23     IO_METHOD_READ,
     24     IO_METHOD_MMAP,
     25     IO_METHOD_USERPTR,
     26   };
     27 
     28   struct Buffer {
     29     void* start;
     30     size_t length;
     31   };
     32 
     33   V4L2Device(const char* dev_name,
     34              IOMethod io,
     35              uint32_t buffers);
     36   virtual ~V4L2Device() {}
     37 
     38   virtual bool OpenDevice();
     39   virtual void CloseDevice();
     40   virtual bool InitDevice(uint32_t width,
     41                           uint32_t height,
     42                           uint32_t pixfmt,
     43                           uint32_t fps);
     44   virtual bool UninitDevice();
     45   virtual bool StartCapture();
     46   virtual bool StopCapture();
     47   virtual bool Run(uint32_t frames, uint32_t time_in_sec = 0);
     48 
     49   // Helper methods.
     50   bool EnumInput();
     51   bool EnumStandard();
     52   bool EnumControl(bool show_menu = true);
     53   bool EnumControlMenu(const v4l2_queryctrl& query_ctrl);
     54   bool EnumFormat(uint32_t* num_formats, bool show_fmt = true);
     55   bool EnumFrameSize(uint32_t pixfmt, bool show_frmsize = true);
     56 
     57   bool QueryControl(uint32_t id, v4l2_queryctrl* ctrl);
     58   bool SetControl(uint32_t id, int32_t value);
     59   bool ProbeCaps(v4l2_capability* cap, bool show_caps = false);
     60   bool GetCropCap(v4l2_cropcap* cropcap);
     61   bool GetCrop(v4l2_crop* crop);
     62   bool SetCrop(v4l2_crop* crop);
     63   bool GetParam(v4l2_streamparm* param);
     64   bool SetParam(v4l2_streamparm* param);
     65   bool SetFrameRate(uint32_t fps);
     66   uint32_t GetPixelFormat(uint32_t index);
     67   uint32_t GetFrameRate();
     68   bool Stop();
     69 
     70   // Getter.
     71   int32_t GetActualWidth() {
     72     return width_;
     73   }
     74 
     75   int32_t GetActualHeight() {
     76     return height_;
     77   }
     78 
     79   v4l2_format& GetActualPixelFormat() {
     80     return pixfmt_;
     81   }
     82 
     83   static uint32_t MapFourCC(const char* fourcc);
     84 
     85   virtual void ProcessImage(const void* p);
     86 
     87  private:
     88   int32_t DoIoctl(int32_t request, void* arg);
     89   int32_t ReadOneFrame();
     90   bool InitReadIO(uint32_t buffer_size);
     91   bool InitMmapIO();
     92   bool InitUserPtrIO(uint32_t buffer_size);
     93   bool AllocateBuffer(uint32_t buffer_count);
     94   bool FreeBuffer();
     95   uint64_t Now();
     96 
     97   const char* dev_name_;
     98   IOMethod io_;
     99   int32_t fd_;
    100   Buffer* v4l2_buffers_;
    101   uint32_t num_buffers_;  // Actual buffers allocation.
    102   uint32_t min_buffers_;  // Minimum buffers requirement.
    103   bool stopped_;
    104 
    105   // Valid only after |InitDevice()|.
    106   uint32_t width_, height_;
    107   v4l2_format pixfmt_;
    108 };
    109 
    110 #endif  // MEDIA_V4L2_DEVICE_H_
    111 
    112