// Copyright 2015 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_COMMON_MEDIA_PIPE_BASE_H_
#define SERVICES_MEDIA_COMMON_MEDIA_PIPE_BASE_H_

#include <atomic>
#include <deque>
#include <memory>

#include "base/synchronization/lock.h"
#include "base/task_runner.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/system/buffer.h"
#include "mojo/services/media/common/interfaces/media_transport.mojom.h"

namespace mojo {
namespace media {

class MediaPipeBase : public MediaConsumer {
 protected:
  class MappedSharedBuffer;
  using MappedSharedBufferPtr = std::shared_ptr<MappedSharedBuffer>;

 public:
  class MediaPacketState {
   public:
    ~MediaPacketState();

    const MediaPacketPtr& packet() const { return packet_; }
    const MappedSharedBufferPtr& buffer() const { return buffer_; }
    void SetResult(MediaConsumer::SendResult result);

   private:
    friend class MediaPipeBase;
    MediaPacketState(MediaPacketPtr packet,
                     const MappedSharedBufferPtr& buffer,
                     const SendPacketCallback& cbk);

    MediaPacketPtr packet_;
    MappedSharedBufferPtr buffer_;
    SendPacketCallback cbk_;
    std::atomic<MediaConsumer::SendResult> result_;
  };
  using MediaPacketStatePtr = std::unique_ptr<MediaPacketState>;

  // Default constructor and destructor
  MediaPipeBase();
  ~MediaPipeBase() override;

  // Initialize the internal state of the pipe (allocate resources, etc..)
  MojoResult Init(InterfaceRequest<MediaConsumer> request);

  bool IsInitialized() const;
  void Reset();

 protected:
  class MappedSharedBuffer {
   public:
    static MappedSharedBufferPtr Create(ScopedSharedBufferHandle handle,
                                        uint64_t size);
    ~MappedSharedBuffer();

    const ScopedSharedBufferHandle& handle() const { return handle_; }
    uint64_t size() const { return size_; }
    void*    base() const { return base_; }

   private:
    MappedSharedBuffer(ScopedSharedBufferHandle handle, size_t size);

    ScopedSharedBufferHandle handle_;
    size_t size_;
    void*  base_ = nullptr;
  };

  // Interface to be implemented by derived classes
  virtual void OnPacketReceived(MediaPacketStatePtr state) = 0;
  virtual bool OnFlushRequested(const FlushCallback& cbk) = 0;

  MappedSharedBufferPtr buffer_;

 private:
  Binding<MediaConsumer> binding_;

  // MediaConsumer.mojom implementation.
  void SetBuffer(ScopedSharedBufferHandle handle,
                uint64_t size,
                const SetBufferCallback& cbk) final;
  void SendPacket(MediaPacketPtr packet,
                  const SendPacketCallback& cbk) final;
  void Prime(const PrimeCallback& cbk) final;
  void Flush(const FlushCallback& cbk) final;
};

}  // namespace media
}  // namespace mojo

#endif  // SERVICES_MEDIA_COMMON_MEDIA_PIPE_BASE_H_
