blob: e5d3284cf1a90741dbf54a213829d232e56d4176 [file] [log] [blame]
// 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_