// 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 MEDIA_PERCEPTION_VIDEO_CAPTURE_SERVICE_CLIENT_H_
#define MEDIA_PERCEPTION_VIDEO_CAPTURE_SERVICE_CLIENT_H_

// This header needs to be buildable from both Google3 and outside, so it cannot
// rely on Google3 dependencies.

#include <functional>
#include <memory>
#include <string>
#include <utility>
#include <vector>


namespace mri {

// Typdefs for readability. Serialized protos are passed back and forth across
// the boundary between platform2 code and librtanalytics.so
using SerializedVideoStreamParams = std::vector<uint8_t>;
using SerializedVideoDevice = std::vector<uint8_t>;
using RawPixelFormat = uint32_t;

enum CreatePushSubscriptionResultCode {
  RESULT_UNKNOWN,
  CREATED_WITH_REQUESTED_SETTINGS,
  CREATED_WITH_DIFFERENT_SETTINGS,
  ALREADY_OPEN,
  FAILED
};

// Provides the interface definition for the rtanalytics library to interact
// with the Chrome Video Capture Service. Note that the
// VideoCaptureServiceClient is thread-safe and can be shared between multiple
// clients.
class VideoCaptureServiceClient {
 public:
  using GetDevicesCallback = std::function<void(
      std::vector<SerializedVideoDevice>)>;
  using OpenDeviceCallback = std::function<void(
      std::string, /* device_id */
      CreatePushSubscriptionResultCode,
      SerializedVideoStreamParams)>;
  using VirtualDeviceCallback = std::function<void(SerializedVideoDevice)>;
  using FrameHandler =
      std::function<void(uint64_t timestamp_us, const uint8_t* data,
                         int data_size, int frame_width, int frame_height)>;

  virtual ~VideoCaptureServiceClient() {}

  // Connects to the Video Capture Service over Mojo IPC.
  virtual bool Connect() = 0;

  // Check if the service is connected.
  virtual bool IsConnected() = 0;

  // Gets a list of video devices available.
  virtual void GetDevices(const GetDevicesCallback& callback) = 0;

  // Sets a device to be opened by the Video Capture Service with the exact
  // device_id specified. OpenDeviceCallback provides information on the success
  // or failure of the request.
  // |force_reopen_with_settings| enables a client to command the VCS to reopen
  // a video device with the requested settings. This should be used sparingly
  // as it can disrupt the video experience for frontend facing applications.
  virtual void OpenDevice(
      const std::string& device_id,
      bool force_reopen_with_settings,
      const SerializedVideoStreamParams& capture_format,
      const OpenDeviceCallback& callback) = 0;

  // Determines if a particular device has already started capture and if it
  // has, fills in the |capture_format| with the current parameters used to
  // read frames from the device.
  virtual bool IsVideoCaptureStartedForDevice(
      const std::string& device_id,
      SerializedVideoStreamParams* capture_format) = 0;

  // Add a frame handler for a particular device id. Return value is the handler
  // id. Note that multiple clients can add a frame handler for a single device.
  // AddFrameHandler will start video capture on a device if it is not already
  // started. An return value of 0 indicates a failure to add the handler or
  // start video capture.
  virtual int AddFrameHandler(
      const std::string& device_id,
      FrameHandler handler) = 0;

  // Remove a frame handler for a particular device by specifying the frame
  // handler id. Video capture on a particular device will only stop when all
  // frame handlers are removed for a particular device.
  virtual bool RemoveFrameHandler(
      const std::string& device_id, int frame_handler_id) = 0;

  // Interface for creating a virtual device with a set of parameters.
  virtual void CreateVirtualDevice(
      const SerializedVideoDevice& video_device,
      const VirtualDeviceCallback& callback) = 0;

  // Pushes frame data to the specified virtual device, if opened.
  virtual void PushFrameToVirtualDevice(const std::string& device_id,
                                        uint64_t timestamp_us,
                                        std::unique_ptr<const uint8_t[]> data,
                                        int data_size,
                                        RawPixelFormat pixel_format,
                                        int frame_width, int frame_height) = 0;

  // Closes the specified virtual device.
  virtual void CloseVirtualDevice(const std::string& device_id) = 0;
};

}  // namespace mri

#endif  // MEDIA_PERCEPTION_VIDEO_CAPTURE_SERVICE_CLIENT_H_
