blob: 688380edea809d3f2aba4fb6efea0ce2049257de [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_pipe.mojom.h"
namespace mojo {
namespace media {
class MediaPipeBase : public MediaPipe {
public:
class MediaPacketState {
public:
~MediaPacketState();
const MediaPacketPtr& GetPacket() const { return packet_; }
void SetResult(MediaResult result);
private:
friend class MediaPipeBase;
MediaPacketState(MediaPacketPtr packet,
const SendPacketCallback& cbk);
MediaPacketPtr packet_;
SendPacketCallback cbk_;
std::atomic<MediaResult> 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<MediaPipe> request,
uint64_t shared_buffer_size);
bool IsInitialized() const;
protected:
// Interface to be implemented by derived classes
virtual void OnPacketReceived(MediaPacketStatePtr state) = 0;
virtual void OnFlushRequested(const FlushCallback& cbk) = 0;
const size_t buffer_size() const { return buffer_size_; }
const void* buffer() const { return buffer_; }
private:
void Cleanup();
// MediaPipe.mojom implementation.
void GetState(const GetStateCallback& cbk) final;
void SendPacket(MediaPacketPtr packet,
const SendPacketCallback& cbk) final;
void Flush(const FlushCallback& cbk) final;
ScopedSharedBufferHandle buffer_handle_;
size_t buffer_size_;
void* buffer_ = nullptr;
Binding<MediaPipe> binding_;
};
} // namespace media
} // namespace mojo
#endif // SERVICES_MEDIA_COMMON_MEDIA_PIPE_BASE_H_