1c978162a05d7695cd05c62d467446958e3bc5055Jie Sun// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2c978162a05d7695cd05c62d467446958e3bc5055Jie Sun// Use of this source code is governed by a BSD-style license that can be
3c978162a05d7695cd05c62d467446958e3bc5055Jie Sun// found in the LICENSE file.
4c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
5c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#ifndef MEDIA_V4L2_DEVICE_H_
6c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#define MEDIA_V4L2_DEVICE_H_
7c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
8c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <errno.h>
9c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <fcntl.h>
10c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <linux/videodev2.h>
11c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <malloc.h>
12c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <stdint.h>
13c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <stdio.h>
14c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <stdlib.h>
15c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <string.h>
16c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <sys/ioctl.h>
17c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <sys/mman.h>
18c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#include <unistd.h>
19c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
20c978162a05d7695cd05c62d467446958e3bc5055Jie Sunclass V4L2Device {
21c978162a05d7695cd05c62d467446958e3bc5055Jie Sun public:
22c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  enum IOMethod {
23c978162a05d7695cd05c62d467446958e3bc5055Jie Sun    IO_METHOD_READ,
24c978162a05d7695cd05c62d467446958e3bc5055Jie Sun    IO_METHOD_MMAP,
25c978162a05d7695cd05c62d467446958e3bc5055Jie Sun    IO_METHOD_USERPTR,
26c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  };
27c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
28c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  struct Buffer {
29c978162a05d7695cd05c62d467446958e3bc5055Jie Sun    void* start;
30c978162a05d7695cd05c62d467446958e3bc5055Jie Sun    size_t length;
31c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  };
32c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
33c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  V4L2Device(const char* dev_name,
34c978162a05d7695cd05c62d467446958e3bc5055Jie Sun             IOMethod io,
35c978162a05d7695cd05c62d467446958e3bc5055Jie Sun             uint32_t buffers);
36c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  virtual ~V4L2Device() {}
37c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
38c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  virtual bool OpenDevice();
39c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  virtual void CloseDevice();
40c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  virtual bool InitDevice(uint32_t width,
41c978162a05d7695cd05c62d467446958e3bc5055Jie Sun                          uint32_t height,
42c978162a05d7695cd05c62d467446958e3bc5055Jie Sun                          uint32_t pixfmt,
43c978162a05d7695cd05c62d467446958e3bc5055Jie Sun                          uint32_t fps);
44c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  virtual bool UninitDevice();
45c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  virtual bool StartCapture();
46c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  virtual bool StopCapture();
475132330c9a6ecf21e52a90ed874f5aba70547a97Jie Sun  virtual bool Run(uint32_t frames, uint32_t time_in_sec = 0);
48c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
49c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  // Helper methods.
50c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool EnumInput();
51c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool EnumStandard();
52c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool EnumControl(bool show_menu = true);
53c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool EnumControlMenu(const v4l2_queryctrl& query_ctrl);
54c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool EnumFormat(uint32_t* num_formats, bool show_fmt = true);
55c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool EnumFrameSize(uint32_t pixfmt, bool show_frmsize = true);
56c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
57c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool QueryControl(uint32_t id, v4l2_queryctrl* ctrl);
58c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool SetControl(uint32_t id, int32_t value);
59c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool ProbeCaps(v4l2_capability* cap, bool show_caps = false);
60c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool GetCropCap(v4l2_cropcap* cropcap);
61c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool GetCrop(v4l2_crop* crop);
62c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool SetCrop(v4l2_crop* crop);
63c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool GetParam(v4l2_streamparm* param);
64c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool SetParam(v4l2_streamparm* param);
65c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool SetFrameRate(uint32_t fps);
66c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  uint32_t GetPixelFormat(uint32_t index);
67c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  uint32_t GetFrameRate();
68c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool Stop();
69c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
70c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  // Getter.
71c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  int32_t GetActualWidth() {
72c978162a05d7695cd05c62d467446958e3bc5055Jie Sun    return width_;
73c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  }
74c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
75c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  int32_t GetActualHeight() {
76c978162a05d7695cd05c62d467446958e3bc5055Jie Sun    return height_;
77c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  }
78c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
79c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  v4l2_format& GetActualPixelFormat() {
80c978162a05d7695cd05c62d467446958e3bc5055Jie Sun    return pixfmt_;
81c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  }
82c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
83c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  static uint32_t MapFourCC(const char* fourcc);
84c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
85c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  virtual void ProcessImage(const void* p);
86c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
87c978162a05d7695cd05c62d467446958e3bc5055Jie Sun private:
88c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  int32_t DoIoctl(int32_t request, void* arg);
89c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  int32_t ReadOneFrame();
90c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool InitReadIO(uint32_t buffer_size);
91c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool InitMmapIO();
92c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool InitUserPtrIO(uint32_t buffer_size);
93c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool AllocateBuffer(uint32_t buffer_count);
94c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool FreeBuffer();
955132330c9a6ecf21e52a90ed874f5aba70547a97Jie Sun  uint64_t Now();
96c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
97c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  const char* dev_name_;
98c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  IOMethod io_;
99c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  int32_t fd_;
100c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  Buffer* v4l2_buffers_;
101c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  uint32_t num_buffers_;  // Actual buffers allocation.
102c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  uint32_t min_buffers_;  // Minimum buffers requirement.
103c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  bool stopped_;
104c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
105c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  // Valid only after |InitDevice()|.
106c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  uint32_t width_, height_;
107c978162a05d7695cd05c62d467446958e3bc5055Jie Sun  v4l2_format pixfmt_;
108c978162a05d7695cd05c62d467446958e3bc5055Jie Sun};
109c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
110c978162a05d7695cd05c62d467446958e3bc5055Jie Sun#endif  // MEDIA_V4L2_DEVICE_H_
111c978162a05d7695cd05c62d467446958e3bc5055Jie Sun
112