blob: c464373265813438bddee3761e6b4d880671e1fb [file] [log] [blame]
// 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_CONSUMER_H_
#define SERVICES_MEDIA_FRAMEWORK_MOJO_MOJO_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 MediaConsumer::Flush on behalf of MediaConsumer to avoid name
// conflict with Part::Flush.
class MojoConsumerMediaConsumer : public MediaConsumer {
// MediaConsumer implementation.
void Flush(const FlushCallback& callback) override;
// Implements MediaConsumer::Flush.
virtual void MediaConsumerFlush(const FlushCallback& callback) = 0;
};
// Implements MediaConsumer to receive a stream from across mojo.
class MojoConsumer : public MojoConsumerMediaConsumer, public ActiveSource {
public:
using PrimeRequestedCallback = std::function<void(const PrimeCallback&)>;
using FlushRequestedCallback = std::function<void(const FlushCallback&)>;
static std::shared_ptr<MojoConsumer> Create() {
return std::shared_ptr<MojoConsumer>(new MojoConsumer());
}
~MojoConsumer() override;
// Adds a binding.
void AddBinding(InterfaceRequest<MediaConsumer> consumer);
// Sets a callback signalling that a prime has been requested from the
// MediaConsumer client.
void SetPrimeRequestedCallback(const PrimeRequestedCallback& callback);
// Sets a callback signalling that a flush has been requested from the
// MediaConsumer client.
void SetFlushRequestedCallback(const FlushRequestedCallback& callback);
// MediaConsumer implementation.
void SetBuffer(
ScopedSharedBufferHandle buffer,
const SetBufferCallback& callback) override;
void SendPacket(MediaPacketPtr packet, const SendPacketCallback& callback)
override;
void Prime(const PrimeCallback& callback) override;
void MediaConsumerFlush(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:
MojoConsumer();
// 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<MediaConsumer> 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_CONSUMER_H_