// Copyright 2016 The Chromium 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 SERVICES_MEDIA_FRAMEWORK_MOJO_MOJO_PACKET_CONSUMER_H_
#define SERVICES_MEDIA_FRAMEWORK_MOJO_MOJO_PACKET_CONSUMER_H_

#include "base/single_thread_task_runner.h"
#include "base/task_runner.h"
#include "mojo/common/binding_set.h"
#include "mojo/services/media/common/cpp/mapped_shared_buffer.h"
#include "mojo/services/media/common/interfaces/media_transport.mojom.h"
#include "services/media/framework/models/active_source.h"

namespace mojo {
namespace media {

// Implements MediaPacketConsumer::Flush on behalf of MediaPacketConsumer to
// avoid name
// conflict with Part::Flush.
class MojoPacketConsumerMediaPacketConsumer : public MediaPacketConsumer {
  // MediaPacketConsumer implementation.
  void Flush(const FlushCallback& callback) override;

  // Implements MediaPacketConsumer::Flush.
  virtual void MediaPacketConsumerFlush(const FlushCallback& callback) = 0;
};

// Implements MediaPacketConsumer to receive a stream from across mojo.
class MojoPacketConsumer : public MojoPacketConsumerMediaPacketConsumer,
                     public ActiveSource {
 public:
  using PrimeRequestedCallback = std::function<void(const PrimeCallback&)>;
  using FlushRequestedCallback = std::function<void(const FlushCallback&)>;

  static std::shared_ptr<MojoPacketConsumer> Create() {
    return std::shared_ptr<MojoPacketConsumer>(new MojoPacketConsumer());
  }

  ~MojoPacketConsumer() override;

  // Adds a binding.
  void AddBinding(InterfaceRequest<MediaPacketConsumer> consumer);

  // Sets a callback signalling that a prime has been requested from the
  // MediaPacketConsumer client.
  void SetPrimeRequestedCallback(const PrimeRequestedCallback& callback);

  // Sets a callback signalling that a flush has been requested from the
  // MediaPacketConsumer client.
  void SetFlushRequestedCallback(const FlushRequestedCallback& callback);

  // MediaPacketConsumer implementation.
  void SetBuffer(ScopedSharedBufferHandle buffer,
                 const SetBufferCallback& callback) override;

  void SendPacket(MediaPacketPtr packet,
                  const SendPacketCallback& callback) override;

  void Prime(const PrimeCallback& callback) override;

  void MediaPacketConsumerFlush(const FlushCallback& callback) override;

  // ActiveSource implementation.
  bool can_accept_allocator() const override;

  void set_allocator(PayloadAllocator* allocator) override;

  void SetSupplyCallback(const SupplyCallback& supply_callback) override;

  void SetDownstreamDemand(Demand demand) override;

 private:
  MojoPacketConsumer();

  // Specialized packet implementation.
  class PacketImpl : public Packet {
   public:
    static PacketPtr Create(
        MediaPacketPtr media_packet,
        const SendPacketCallback& callback,
        scoped_refptr<base::SingleThreadTaskRunner> task_runner,
        const MappedSharedBuffer& buffer) {
      return PacketPtr(
          new PacketImpl(media_packet.Pass(), callback, task_runner, buffer));
    }

   protected:
    void Release() override;

   private:
    PacketImpl(MediaPacketPtr media_packet,
               const SendPacketCallback& callback,
               scoped_refptr<base::SingleThreadTaskRunner> task_runner,
               const MappedSharedBuffer& buffer);

    ~PacketImpl() override;

    static void RunCallback(const SendPacketCallback& callback);

    MediaPacketPtr media_packet_;
    const SendPacketCallback callback_;
    scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
  };

  BindingSet<MediaPacketConsumer> bindings_;
  PrimeRequestedCallback prime_requested_callback_;
  FlushRequestedCallback flush_requested_callback_;
  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
  MappedSharedBuffer buffer_;
  SupplyCallback supply_callback_;
};

}  // namespace media
}  // namespace mojo

#endif  // SERVICES_MEDIA_FRAMEWORK_MOJO_MOJO_PACKET_CONSUMER_H_
