/*
 * Copyright (C) 2013-2017 Intel Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Copyright 2018 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_INCLUDE_CROS_CAMERA_V4L2_DEVICE_H_
#define CAMERA_INCLUDE_CROS_CAMERA_V4L2_DEVICE_H_

#include <linux/v4l2-subdev.h>
#include <linux/videodev2.h>
#include <poll.h>

#include <atomic>
#include <string>
#include <vector>

#include <base/synchronization/lock.h>

#include "cros-camera/export.h"

namespace cros {

/*
 * Wrapper for v4l2_buffer to provide compatible
 * interfaces for multi-plane buffers.
 */
class CROS_CAMERA_EXPORT V4L2Buffer {
 public:
  V4L2Buffer();
  explicit V4L2Buffer(const V4L2Buffer& buf);
  uint32_t Index() const { return v4l2_buf_.index; }
  void SetIndex(uint32_t index) { v4l2_buf_.index = index; }
  uint32_t Type() const { return v4l2_buf_.type; }
  void SetType(uint32_t type);
  uint32_t Flags() const { return v4l2_buf_.flags; }
  void SetFlags(uint32_t flags) { v4l2_buf_.flags = flags; }
  uint32_t Field() const { return v4l2_buf_.field; }
  void SetField(uint32_t field) { v4l2_buf_.field = field; }
  struct timeval Timestamp() const {
    return v4l2_buf_.timestamp;
  }
  void SetTimestamp(struct timeval timestamp) {
    v4l2_buf_.timestamp = timestamp;
  }
  struct v4l2_timecode Timecode() const {
    return v4l2_buf_.timecode;
  }
  void SetTimecode(struct v4l2_timecode timecode) {
    v4l2_buf_.timecode = timecode;
  }
  uint32_t Sequence() const { return v4l2_buf_.sequence; }
  void SetSequence(uint32_t sequence) { v4l2_buf_.sequence = sequence; }
  uint32_t Memory() const { return v4l2_buf_.memory; }
  void SetMemory(uint32_t memory) { v4l2_buf_.memory = memory; }
  uint32_t Offset(uint32_t plane) const;
  void SetOffset(uint32_t offset, uint32_t plane);
  uint32_t DataOffset(uint32_t plane) const;
  void SetDataOffset(uint32_t offset, uint32_t plane);
  uintptr_t Userptr(uint32_t plane) const;
  void SetUserptr(uintptr_t userptr, uint32_t plane);
  int RequestFd() const;
  int SetRequestFd(int fd);
  int ResetRequestFd();
  int Fd(uint32_t plane) const;
  void SetFd(int fd, uint32_t plane);
  uint32_t BytesUsed(uint32_t plane) const;
  void SetBytesUsed(uint32_t bytesused, uint32_t plane);
  uint32_t Length(uint32_t plane) const;
  void SetLength(uint32_t length, uint32_t plane);
  const struct v4l2_buffer* Get() const { return &v4l2_buf_; }
  const V4L2Buffer& operator=(const V4L2Buffer& buf);

 private:
  struct v4l2_buffer v4l2_buf_;
  std::vector<struct v4l2_plane> planes_;  // For multi-planar buffers.
};

/*
 * Wrapper for v4l2_format to provide compatible
 * interfaces for multi-plane buffers.
 */
class CROS_CAMERA_EXPORT V4L2Format {
 public:
  V4L2Format();
  explicit V4L2Format(const struct v4l2_format& fmt);
  explicit V4L2Format(const V4L2Format& fmt) = default;
  V4L2Format& operator=(const V4L2Format& fmt) = default;
  uint32_t Type() const { return type_; }
  void SetType(uint32_t type);
  uint32_t Width() const;
  void SetWidth(uint32_t width);
  uint32_t Height() const;
  void SetHeight(uint32_t height);
  uint32_t PixelFormat() const;
  void SetPixelFormat(uint32_t format);
  uint32_t Field() const;
  void SetField(uint32_t field);
  uint32_t BytesPerLine(uint32_t plane) const;
  void SetBytesPerLine(uint32_t bytesperline, uint32_t plane);
  uint32_t SizeImage(uint32_t plane) const;
  void SetSizeImage(uint32_t size, uint32_t plane);
  uint32_t ColorSpace() const;
  void SetColorSpace(uint32_t profile);
  uint32_t Quantization() const;
  void SetQuantization(uint32_t quantization);
  struct v4l2_format* Get();

 private:
  uint32_t type_;
  uint32_t width_;
  uint32_t height_;
  uint32_t pixel_fmt_;
  uint32_t field_;
  uint32_t color_space_;
  uint32_t quantization_;
  std::vector<uint32_t> plane_bytes_per_line_;
  std::vector<uint32_t> plane_size_image_;
  struct v4l2_format v4l2_fmt_;
};

/**
 * A class encapsulating simple V4L2 device operations.
 *
 * Base class that contains common V4L2 operations used by video nodes and
 * subdevices. It provides a slightly higher interface than IOCTLS to access
 * the devices. It also stores:
 * - Name
 * - File descriptor
 */
class CROS_CAMERA_EXPORT V4L2Device {
 public:
  friend class V4L2DevicePoller;

  explicit V4L2Device(const std::string name);

  virtual ~V4L2Device();

  // This method opens the V4L2 device.
  //
  // Args:
  //    |flags|: open flags, e.g. O_RDWR, O_NONBLOCK.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  virtual int Open(int flags);

  // This method closes the V4L2 device.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  virtual int Close();

  // These methods sets the control of V4L2 device.
  //
  // Args:
  //    |id|: control identifier.
  //    |value|: new value.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int SetControl(int id, int32_t value);
  int SetControl(int id, int64_t value);
  int SetControl(int id, const std::string value);
  int SetControl(struct v4l2_control* control);

  // These methods gets the control of V4L2 device.
  //
  // Args:
  //    |id|: control identifier.
  //    |value|: current value.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int GetControl(int id, int32_t* value);
  int GetControl(int id, int64_t* value);
  int GetControl(int id, std::string* value);

  // This method enumerates the menu control items of V4L2 device.
  //
  // Args:
  //    |menu|: menu control.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int QueryMenu(v4l2_querymenu* menu);

  // This method enumerates the control of V4L2 device.
  //
  // Args:
  //    |control|: control.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int QueryControl(v4l2_queryctrl* control);

  // This method subscribes event of V4L2 device.
  //
  // Args:
  //    |event|: event type.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int SubscribeEvent(int event);

  // This method unsubscribes event of V4L2 device.
  //
  // Args:
  //    |event|: event type.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int UnsubscribeEvent(int event);

  // This method dequeues event of V4L2 device.
  //
  // Args:
  //    |event|: V4L2 event.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int DequeueEvent(struct v4l2_event* event);

  // This method checks whether V4L2 device is opened.
  //
  // Returns:
  //    True if it is opened.
  bool IsOpened() { return fd_ != -1; }

  int Poll(int timeout);

  // This method gets the name of V4L2 device.
  //
  // Returns:
  //    Device name.
  const std::string Name() { return name_; }

 private:
  int SetControl(struct v4l2_ext_control* ext_control);

  int GetControl(struct v4l2_ext_control* ext_control);

  void GetDescriptiveName();

 protected:
  std::string name_; /*!< path to device in file system, ex: /dev/video0 */
  std::string descriptive_name_; /*!< name for log, ex: EasyCamera */

  int fd_; /*!< file descriptor obtained when device is open */
};

class CROS_CAMERA_EXPORT V4L2DevicePoller {
 public:
  // |flush_fd|: file descriptor of the pipe device that will be used to return
  // from Poll() in case of flush request, i.e., to abort poll before timeout
  explicit V4L2DevicePoller(std::vector<V4L2Device*> devices, int flush_fd);

  virtual ~V4L2DevicePoller() {}

  // This method polls the V4L2 device.
  //
  // Args:
  //    |timeout_ms|: the number of milliseconds that Poll() should block
  //      waiting for devices to become ready.
  //    |events|: a bit mask specifying the events the client is
  //      interested in.
  //    |ready_devices|: devices that become ready
  //
  // Returns:
  //    On success, a positive number is returned; this is the number of
  //    devices which have the specified events occurred. A value of 0
  //    indicates that the call timed out and no file descriptors were ready.
  //    On error, -1 is returned.
  int Poll(int timeout_ms, int events, std::vector<V4L2Device*>* ready_devices);

 private:
  std::vector<V4L2Device*> devices_;

  int flush_fd_;

  std::vector<struct pollfd> poll_fds_;
};

/**
 * A class encapsulating simple V4L2 video device node operations.
 *
 * This class extends V4L2Device and adds extra internal state
 * and more convenience methods to manage an associated buffer pool
 * with the device.
 * This class introduces new methods specific to control video device nodes.
 */
class CROS_CAMERA_EXPORT V4L2VideoNode final : public V4L2Device {
 public:
  explicit V4L2VideoNode(const std::string name);

  ~V4L2VideoNode();

  // This method opens the video device.
  //
  // Args:
  //    |flags|: open flags, e.g. O_RDWR, O_NONBLOCK.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int Open(int flags) final;

  // This method closes the video device.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int Close() final;

  // This method gets the data format of video device.
  //
  // Args:
  //    |format|: V4L2 format returned.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int GetFormat(V4L2Format* format);

  // This method configures the data format of video device.
  //
  // Args:
  //    |format|: V4L2 format.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int SetFormat(const V4L2Format& format);

  // This method configures the selection rectangles of video device.
  //
  // Args:
  //    |selection|: V4L2 selection rectangle.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int SetSelection(const struct v4l2_selection& selection);

  // This method get the memory type of video device.
  //
  // Returns:
  //    V4L2 memory type.
  enum v4l2_memory GetMemoryType();

  // This method get the buffer type of video device.
  //
  // Returns:
  //    V4L2 buffer type.
  enum v4l2_buf_type GetBufferType();

  // This method maps video device buffers into memory.
  //
  // Args:
  //    |index|: number of the buffer.
  //    |prot|: desired memory protection of the mapping.
  //    |flags|: mapping flags.
  //    |mapped|: mapped addresses.
  //
  // Returns:
  //    A pointer to the mapped area; MAP_FAILED on failure.
  int MapMemory(unsigned int index,
                int prot,
                int flags,
                std::vector<void*>* mapped);

  // This method sets up buffers of the video device. If USERPTR memory type is
  // specified, the caller may need to fill in the userptr field of returned
  // buffers.
  //
  // Args:
  //    |num_buffers|: number of buffers to set up
  //    |is_cached|: whether the buffers are cached or not
  //    |memory_type_|: memory type of buffers
  //    |buffers|: buffers returned
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int SetupBuffers(size_t num_buffers,
                   bool is_cached,
                   enum v4l2_memory memory_type,
                   std::vector<V4L2Buffer>* buffers);

  // This method stops streaming of the video device.
  //
  // Args:
  //    |releaseBuffers|: request 0 buffers if it's true; default value is true.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int Stop(bool releaseBuffers = true);

  // This method starts streaming of the video device.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int Start();

  // This method grabs a buffer from the video device's outgoing queue.
  //
  // Args:
  //    |buf|: V4L2 buffer.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int GrabFrame(V4L2Buffer* buf);

  // This method enqueues a buffer in the video device's outgoing queue.
  //
  // Args:
  //    |buf|: V4L2 buffer.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int PutFrame(V4L2Buffer* buf);

  // This method exports a buffer as DMABUF file descriptors.
  //
  // Args:
  //    |index|: number of the buffer.
  //    |fds|: exported file descriptors.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int ExportFrame(unsigned int index, std::vector<int>* fds);

  // This method queries the capabilities of the video device.
  //
  // Args:
  //    |cap|: V4L2 capabilities
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int QueryCap(struct v4l2_capability* cap);

 private:
  int Qbuf(V4L2Buffer* buf);

  int Dqbuf(V4L2Buffer* buf);

  int QueryBuffer(int index, enum v4l2_memory memory_type, V4L2Buffer* buf);

  int RequestBuffers(size_t num_buffers, enum v4l2_memory memory_type);

  int StopLocked(bool releaseBuffers = true);

  void DestroyBufferPool();

  void PrintBufferInfo(const std::string func, const V4L2Buffer& buf);

  enum class VideoNodeState {
    CLOSED = 0, /*!< kernel device closed */
    OPEN,       /*!< device node opened */
    CONFIGURED, /*!< device format set, IOC_S_FMT */
    PREPARED,   /*!< device has requested buffers (set_buffer_pool)*/
    STARTED,    /*!< stream started, IOC_STREAMON */
    ERROR       /*!< undefined state */
  };

  // Lock to protect |state_|
  base::Lock state_lock_;

  VideoNodeState state_;

  // Device capture configuration
  V4L2Format format_;

  bool is_buffer_cached_;

  enum v4l2_buf_type buffer_type_;

  enum v4l2_memory memory_type_;
};

/**
 * A class encapsulating simple V4L2 sub device node operations.
 *
 * Sub-devices are control points to the new V4L2 media controller
 * architecture.
 */
class CROS_CAMERA_EXPORT V4L2Subdevice final : public V4L2Device {
 public:
  explicit V4L2Subdevice(const std::string name);

  ~V4L2Subdevice();

  // This method opens the sub-device.
  //
  // Args:
  //    |flags|: open flags, e.g. O_RDWR, O_NONBLOCK.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int Open(int flags) final;

  // This method closes the sub-device.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int Close() final;

  // This method configures format of the sub-device.
  //
  // Args:
  //    |format|: V4L2 sub-device format.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int SetFormat(const struct v4l2_subdev_format& format);

  // This method configures the selection rectangles of sub-device pad.
  //
  // Args:
  //    |selection|: V4L2 sub-device selection rectangle.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int SetSelection(const struct v4l2_subdev_selection& selection);

  // This method gets the format of sub-device pad.
  //
  // Args:
  //    |pad_index|: pad number.
  //    |width|: image width.
  //    |height|: image height.
  //    |code|: format code.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  int GetPadFormat(int pad_index, int* width, int* height, int* code);

 private:
  int GetFormat(struct v4l2_subdev_format* format);

 private:
  enum class SubdevState {
    CLOSED = 0, /*!< kernel device closed */
    OPEN,       /*!< device node opened */
    CONFIGURED, /*!< device format set, IOC_S_FMT */
    STARTED,    /*!< device has been started */
    ERROR       /*!< undefined state */
  };

  // Lock to protect |state_|
  base::Lock state_lock_;

  SubdevState state_;
};

}  // namespace cros
#endif  // CAMERA_INCLUDE_CROS_CAMERA_V4L2_DEVICE_H_
