// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CAMERA_HAL_USB_V4L2_TEST_MEDIA_V4L2_DEVICE_H_
#define CAMERA_HAL_USB_V4L2_TEST_MEDIA_V4L2_DEVICE_H_

#include <errno.h>
#include <fcntl.h>
#include <linux/videodev2.h>
#include <malloc.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <unistd.h>

#include <vector>

class V4L2Device {
 public:
  enum IOMethod {
    IO_METHOD_UNDEFINED,
    IO_METHOD_MMAP,
    IO_METHOD_USERPTR,
  };

  enum ConstantFramerate {
    DEFAULT_FRAMERATE_SETTING,
    ENABLE_CONSTANT_FRAMERATE,
    DISABLE_CONSTANT_FRAMERATE,
  };

  struct Buffer {
    void* start;
    size_t length;
  };

  V4L2Device(const char* dev_name, uint32_t buffers);
  virtual ~V4L2Device();

  virtual bool OpenDevice(bool show_err = true);
  virtual void CloseDevice();
  // After this function is called, the driver may adjust the settings if they
  // are unsupported.  Caller can use GetV4L2Format() and GetFrameRate() to know
  // the actual settings.  If V4L2_CAP_TIMEPERFRAME is unsupported, fps will be
  // ignored.
  virtual bool InitDevice(IOMethod io,
                          uint32_t width,
                          uint32_t height,
                          uint32_t pixfmt,
                          float fps,
                          ConstantFramerate constant_framerate,
                          uint32_t num_skip_frames);
  virtual bool UninitDevice();
  virtual bool StartCapture();
  virtual bool StopCapture();
  virtual bool Run(uint32_t time_in_sec);
  virtual int32_t ReadOneFrame(uint32_t* buffer_index, uint32_t* data_size);
  virtual bool EnqueueBuffer(uint32_t buffer_index);

  // Helper methods.
  bool EnumInput();
  bool EnumStandard();
  bool EnumControl(bool show_menu = true);
  bool EnumControlMenu(const v4l2_queryctrl& query_ctrl);
  bool EnumFormat(uint32_t* num_formats, bool show_fmt = true);
  bool EnumFrameSize(uint32_t pixfmt,
                     uint32_t* num_sizes,
                     bool show_frmsize = true);
  bool EnumFrameInterval(uint32_t pixfmt,
                         uint32_t width,
                         uint32_t height,
                         uint32_t* num_intervals,
                         bool show_intervals = true);

  bool QueryControl(uint32_t id, v4l2_queryctrl* ctrl);
  bool SetControl(uint32_t id, int32_t value);
  bool ProbeCaps(v4l2_capability* cap, bool show_caps = false);
  bool GetCropCap(v4l2_cropcap* cropcap);
  bool GetCrop(v4l2_crop* crop);
  bool SetCrop(v4l2_crop* crop);
  bool GetParam(v4l2_streamparm* param);
  bool SetParam(v4l2_streamparm* param);
  bool SetFrameRate(float fps);
  bool GetPixelFormat(uint32_t index, uint32_t* pixfmt);
  bool GetFrameSize(uint32_t index,
                    uint32_t pixfmt,
                    uint32_t* width,
                    uint32_t* height);
  bool GetFrameInterval(uint32_t index,
                        uint32_t pixfmt,
                        uint32_t width,
                        uint32_t height,
                        float* frame_rate);
  float GetFrameRate();
  bool GetV4L2Format(v4l2_format* format);
  bool GetSelection(uint32_t target, v4l2_selection* selection);
  bool SetSelection(uint32_t target, const v4l2_rect& rect);
  bool Stop();

  // Getter.
  uint32_t GetNumFrames() const { return frame_timestamps_.size(); }

  const std::vector<int64_t>& GetFrameTimestamps() const {
    return frame_timestamps_;
  }

  const Buffer& GetBufferInfo(uint32_t index) { return v4l2_buffers_[index]; }

  static uint32_t MapFourCC(const char* fourcc);

  virtual void ProcessImage(const void* p);

 private:
  int32_t DoIoctl(int32_t request, void* arg);
  bool InitMmapIO();
  bool InitUserPtrIO(uint32_t buffer_size);
  bool AllocateBuffer(uint32_t buffer_count);
  bool FreeBuffer();
  uint64_t Now();

  const char* dev_name_;
  IOMethod io_;
  int32_t fd_;
  Buffer* v4l2_buffers_;
  uint32_t num_buffers_;  // Actual buffers allocation.
  uint32_t min_buffers_;  // Minimum buffers requirement.
  bool stopped_;

  // Sets to true when buffers are initialized.
  bool initialized_;
  // Sets to true if stream on.
  bool stream_on_;
  std::vector<int64_t> frame_timestamps_;
  // The number of frames should be skipped after stream on.
  uint32_t num_skip_frames_;
};

#endif  // CAMERA_HAL_USB_V4L2_TEST_MEDIA_V4L2_DEVICE_H_
