| // 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_ |