| // 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. |
| |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/message_loop/message_loop.h" |
| #include "services/media/framework_mojo/mojo_consumer.h" |
| |
| namespace mojo { |
| namespace media { |
| |
| void MojoConsumerMediaConsumer::Flush(const FlushCallback& callback) { |
| MediaConsumerFlush(callback); |
| } |
| |
| MojoConsumer::MojoConsumer() {} |
| |
| MojoConsumer::~MojoConsumer() {} |
| |
| void MojoConsumer::AddBinding(InterfaceRequest<MediaConsumer> consumer) { |
| bindings_.AddBinding(this, consumer.Pass()); |
| DCHECK(base::MessageLoop::current()); |
| task_runner_ = base::MessageLoop::current()->task_runner(); |
| DCHECK(task_runner_); |
| } |
| |
| void MojoConsumer::SetFlushRequestedCallback( |
| const FlushRequestedCallback& callback) { |
| flush_requested_callback_ = callback; |
| } |
| |
| void MojoConsumer::SetBuffer( |
| ScopedSharedBufferHandle buffer, |
| uint64_t size, |
| const SetBufferCallback& callback) { |
| buffer_.InitFromHandle(buffer.Pass(), size); |
| callback.Run(); |
| } |
| |
| void MojoConsumer::PushPacket( |
| MediaPacketPtr media_packet, |
| const PushPacketCallback& callback) { |
| DCHECK(supply_callback_); |
| supply_callback_(PacketImpl::Create( |
| media_packet.Pass(), |
| callback, |
| task_runner_, |
| buffer_)); |
| } |
| |
| void MojoConsumer::MediaConsumerFlush(const FlushCallback& callback) { |
| if (flush_requested_callback_) { |
| flush_requested_callback_(callback); |
| } else { |
| LOG(WARNING) << "flush requested but no callback registered"; |
| callback.Run(); |
| } |
| } |
| |
| bool MojoConsumer::can_accept_allocator() const { |
| return false; |
| } |
| |
| void MojoConsumer::set_allocator(PayloadAllocator* allocator) { |
| NOTREACHED(); |
| } |
| |
| void MojoConsumer::SetSupplyCallback(const SupplyCallback& supply_callback) { |
| supply_callback_ = supply_callback; |
| } |
| |
| void MojoConsumer::SetDownstreamDemand(Demand demand) {} |
| |
| MojoConsumer::PacketImpl::PacketImpl( |
| MediaPacketPtr media_packet, |
| const PushPacketCallback& callback, |
| scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| const MappedSharedBuffer& buffer) : |
| media_packet_(media_packet.Pass()), |
| callback_(callback), |
| task_runner_(task_runner), |
| payload_(buffer.PtrFromOffset(media_packet_->payload->offset)) {} |
| |
| MojoConsumer::PacketImpl::~PacketImpl() {} |
| |
| // static |
| void MojoConsumer::PacketImpl::RunCallback(const PushPacketCallback& callback) { |
| callback.Run(); |
| } |
| |
| void MojoConsumer::PacketImpl::Release() { |
| // TODO(dalesat): Is there a cleaner way to do this? |
| task_runner_->PostTask(FROM_HERE, base::Bind(&RunCallback, callback_)); |
| delete this; |
| } |
| |
| } // namespace media |
| } // namespace mojo |