// 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_PRODUCER_IMPL_H_
#define MEDIA_PERCEPTION_PRODUCER_IMPL_H_

#include <base/bind.h>
#include <map>
#include <memory>

#include "media_perception/shared_memory_provider.h"
#include "mojom/video_source_provider.mojom.h"

namespace mri {

class ProducerImpl : public video_capture::mojom::Producer {
 public:
  ProducerImpl() : binding_(this) {}

  // factory is owned by the caller.
  void RegisterVirtualDevice(
      video_capture::mojom::VideoSourceProviderPtr* provider,
      media::mojom::VideoCaptureDeviceInfoPtr info);

  void PushNextFrame(std::shared_ptr<ProducerImpl> producer_impl,
                     base::TimeDelta timestamp,
                     std::unique_ptr<const uint8_t[]> data, int data_size,
                     media::mojom::VideoCapturePixelFormat pixel_format,
                     int width, int height);

  // video_capture::mojom::Producer overrides.
  void OnNewBuffer(int32_t buffer_id,
                   media::mojom::VideoBufferHandlePtr buffer_handle,
                   const OnNewBufferCallback& callback) override;
  void OnBufferRetired(int32_t buffer_id) override;

 private:
  // Creates a ProducerPtr that is bound to this instance through a message
  // pipe. When calling this more than once, the previously return ProducerPtr
  // will get unbound.
  video_capture::mojom::ProducerPtr CreateInterfacePtr();

  void OnFrameBufferReceived(std::shared_ptr<ProducerImpl> producer_impl,
                             base::TimeDelta timestamp,
                             std::unique_ptr<const uint8_t[]> data,
                             int data_size,
                             media::mojom::VideoCapturePixelFormat pixel_format,
                             int width, int height, int32_t buffer_id);

  // Binding of the Producer interface to message pipe.
  mojo::Binding<video_capture::mojom::Producer> binding_;

  // Provides an interface to a created virtual device.
  video_capture::mojom::SharedMemoryVirtualDevicePtr virtual_device_;

  std::map<int32_t /*buffer_id*/, std::unique_ptr<SharedMemoryProvider>>
      outgoing_buffer_id_to_buffer_map_;
};

}  // namespace mri

#endif  // MEDIA_PERCEPTION_PRODUCER_IMPL_H_
