| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/bind_helpers.h" | 6 #include "base/bind_helpers.h" |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "services/media/framework_mojo/mojo_producer.h" | 9 #include "services/media/framework_mojo/mojo_packet_producer.h" |
| 10 | 10 |
| 11 namespace mojo { | 11 namespace mojo { |
| 12 namespace media { | 12 namespace media { |
| 13 | 13 |
| 14 MojoProducer::MojoProducer() { | 14 MojoPacketProducer::MojoPacketProducer() { |
| 15 task_runner_ = base::MessageLoop::current()->task_runner(); | 15 task_runner_ = base::MessageLoop::current()->task_runner(); |
| 16 DCHECK(task_runner_); | 16 DCHECK(task_runner_); |
| 17 } | 17 } |
| 18 | 18 |
| 19 MojoProducer::~MojoProducer() { | 19 MojoPacketProducer::~MojoPacketProducer() { |
| 20 base::AutoLock lock(lock_); | 20 base::AutoLock lock(lock_); |
| 21 } | 21 } |
| 22 | 22 |
| 23 void MojoProducer::AddBinding(InterfaceRequest<MediaProducer> producer) { | 23 void MojoPacketProducer::AddBinding( |
| 24 InterfaceRequest<MediaPacketProducer> producer) { |
| 24 bindings_.AddBinding(this, producer.Pass()); | 25 bindings_.AddBinding(this, producer.Pass()); |
| 25 } | 26 } |
| 26 | 27 |
| 27 void MojoProducer::PrimeConnection(const PrimeConnectionCallback& callback) { | 28 void MojoPacketProducer::PrimeConnection( |
| 29 const PrimeConnectionCallback& callback) { |
| 28 Demand demand; | 30 Demand demand; |
| 29 | 31 |
| 30 if (consumer_.is_bound()) { | 32 if (consumer_.is_bound()) { |
| 31 base::AutoLock lock(lock_); | 33 base::AutoLock lock(lock_); |
| 32 max_pushes_outstanding_ = 4; // TODO(dalesat): Made up! | 34 max_pushes_outstanding_ = 4; // TODO(dalesat): Made up! |
| 33 demand = current_pushes_outstanding_ < max_pushes_outstanding_ | 35 demand = current_pushes_outstanding_ < max_pushes_outstanding_ |
| 34 ? Demand::kPositive | 36 ? Demand::kPositive |
| 35 : Demand::kNegative; | 37 : Demand::kNegative; |
| 36 } else { | 38 } else { |
| 37 demand = Demand::kNeutral; | 39 demand = Demand::kNeutral; |
| 38 if (!mojo_allocator_.initialized()) { | 40 if (!mojo_allocator_.initialized()) { |
| 39 mojo_allocator_.InitNew(4096 * 1024); // TODO(dalesat): Made up! | 41 mojo_allocator_.InitNew(4096 * 1024); // TODO(dalesat): Made up! |
| 40 } | 42 } |
| 41 } | 43 } |
| 42 | 44 |
| 43 DCHECK(demand_callback_); | 45 DCHECK(demand_callback_); |
| 44 demand_callback_(demand); | 46 demand_callback_(demand); |
| 45 | 47 |
| 46 if (consumer_.is_bound()) { | 48 if (consumer_.is_bound()) { |
| 47 consumer_->Prime([this, callback]() { callback.Run(); }); | 49 consumer_->Prime([this, callback]() { callback.Run(); }); |
| 48 } else { | 50 } else { |
| 49 callback.Run(); | 51 callback.Run(); |
| 50 } | 52 } |
| 51 } | 53 } |
| 52 | 54 |
| 53 void MojoProducer::FlushConnection(const FlushConnectionCallback& callback) { | 55 void MojoPacketProducer::FlushConnection( |
| 56 const FlushConnectionCallback& callback) { |
| 54 { | 57 { |
| 55 base::AutoLock lock(lock_); | 58 base::AutoLock lock(lock_); |
| 56 max_pushes_outstanding_ = 0; | 59 max_pushes_outstanding_ = 0; |
| 57 } | 60 } |
| 58 | 61 |
| 59 DCHECK(demand_callback_); | 62 DCHECK(demand_callback_); |
| 60 demand_callback_(Demand::kNegative); | 63 demand_callback_(Demand::kNegative); |
| 61 | 64 |
| 62 if (consumer_.is_bound()) { | 65 if (consumer_.is_bound()) { |
| 63 consumer_->Flush(callback); | 66 consumer_->Flush(callback); |
| 64 } else { | 67 } else { |
| 65 callback.Run(); | 68 callback.Run(); |
| 66 } | 69 } |
| 67 } | 70 } |
| 68 | 71 |
| 69 PayloadAllocator* MojoProducer::allocator() { | 72 PayloadAllocator* MojoPacketProducer::allocator() { |
| 70 return &mojo_allocator_; | 73 return &mojo_allocator_; |
| 71 } | 74 } |
| 72 | 75 |
| 73 void MojoProducer::SetDemandCallback(const DemandCallback& demand_callback) { | 76 void MojoPacketProducer::SetDemandCallback( |
| 77 const DemandCallback& demand_callback) { |
| 74 demand_callback_ = demand_callback; | 78 demand_callback_ = demand_callback; |
| 75 } | 79 } |
| 76 | 80 |
| 77 Demand MojoProducer::SupplyPacket(PacketPtr packet) { | 81 Demand MojoPacketProducer::SupplyPacket(PacketPtr packet) { |
| 78 DCHECK(packet); | 82 DCHECK(packet); |
| 79 | 83 |
| 80 // If we're not connected, throw the packet away. | 84 // If we're not connected, throw the packet away. |
| 81 if (!consumer_.is_bound()) { | 85 if (!consumer_.is_bound()) { |
| 82 return packet->end_of_stream() ? Demand::kNegative : Demand::kNeutral; | 86 return packet->end_of_stream() ? Demand::kNegative : Demand::kNeutral; |
| 83 } | 87 } |
| 84 | 88 |
| 85 Demand demand; | 89 Demand demand; |
| 86 | 90 |
| 87 { | 91 { |
| 88 base::AutoLock lock(lock_); | 92 base::AutoLock lock(lock_); |
| 89 DCHECK(current_pushes_outstanding_ < max_pushes_outstanding_); | 93 DCHECK(current_pushes_outstanding_ < max_pushes_outstanding_); |
| 90 | 94 |
| 91 ++current_pushes_outstanding_; | 95 ++current_pushes_outstanding_; |
| 92 | 96 |
| 93 if (packet->end_of_stream()) { | 97 if (packet->end_of_stream()) { |
| 94 demand = Demand::kNegative; | 98 demand = Demand::kNegative; |
| 95 max_pushes_outstanding_ = 0; | 99 max_pushes_outstanding_ = 0; |
| 96 } else { | 100 } else { |
| 97 demand = current_pushes_outstanding_ < max_pushes_outstanding_ | 101 demand = current_pushes_outstanding_ < max_pushes_outstanding_ |
| 98 ? Demand::kPositive | 102 ? Demand::kPositive |
| 99 : Demand::kNegative; | 103 : Demand::kNegative; |
| 100 } | 104 } |
| 101 } | 105 } |
| 102 | 106 |
| 103 MediaPacketPtr media_packet = CreateMediaPacket(packet); | 107 MediaPacketPtr media_packet = CreateMediaPacket(packet); |
| 104 task_runner_->PostTask( | 108 task_runner_->PostTask( |
| 105 FROM_HERE, | 109 FROM_HERE, |
| 106 base::Bind(&MojoProducer::SendPacket, base::Unretained(this), | 110 base::Bind(&MojoPacketProducer::SendPacket, base::Unretained(this), |
| 107 packet.release(), base::Passed(media_packet.Pass()))); | 111 packet.release(), base::Passed(media_packet.Pass()))); |
| 108 | 112 |
| 109 return demand; | 113 return demand; |
| 110 } | 114 } |
| 111 | 115 |
| 112 void MojoProducer::Connect(InterfaceHandle<MediaConsumer> consumer, | 116 void MojoPacketProducer::Connect(InterfaceHandle<MediaPacketConsumer> consumer, |
| 113 const ConnectCallback& callback) { | 117 const ConnectCallback& callback) { |
| 114 DCHECK(consumer); | 118 DCHECK(consumer); |
| 115 | 119 |
| 116 consumer_ = MediaConsumerPtr::Create(std::move(consumer)); | 120 consumer_ = MediaPacketConsumerPtr::Create(std::move(consumer)); |
| 117 | 121 |
| 118 if (!mojo_allocator_.initialized()) { | 122 if (!mojo_allocator_.initialized()) { |
| 119 mojo_allocator_.InitNew(4096 * 1024); // TODO(dalesat): Made up! | 123 mojo_allocator_.InitNew(4096 * 1024); // TODO(dalesat): Made up! |
| 120 } | 124 } |
| 121 | 125 |
| 122 consumer_->SetBuffer(mojo_allocator_.GetDuplicateHandle(), | 126 consumer_->SetBuffer(mojo_allocator_.GetDuplicateHandle(), |
| 123 [callback]() { callback.Run(); }); | 127 [callback]() { callback.Run(); }); |
| 124 } | 128 } |
| 125 | 129 |
| 126 void MojoProducer::Disconnect() { | 130 void MojoPacketProducer::Disconnect() { |
| 127 DCHECK(demand_callback_); | 131 DCHECK(demand_callback_); |
| 128 demand_callback_(Demand::kNegative); | 132 demand_callback_(Demand::kNegative); |
| 129 consumer_.reset(); | 133 consumer_.reset(); |
| 130 } | 134 } |
| 131 | 135 |
| 132 void MojoProducer::SendPacket(Packet* packet_raw_ptr, | 136 void MojoPacketProducer::SendPacket(Packet* packet_raw_ptr, |
| 133 MediaPacketPtr media_packet) { | 137 MediaPacketPtr media_packet) { |
| 134 consumer_->SendPacket( | 138 consumer_->SendPacket( |
| 135 media_packet.Pass(), | 139 media_packet.Pass(), |
| 136 [this, packet_raw_ptr](MediaConsumer::SendResult send_result) { | 140 [this, packet_raw_ptr](MediaPacketConsumer::SendResult send_result) { |
| 137 PacketPtr packet = PacketPtr(packet_raw_ptr); | 141 PacketPtr packet = PacketPtr(packet_raw_ptr); |
| 138 Demand demand; | 142 Demand demand; |
| 139 | 143 |
| 140 { | 144 { |
| 141 base::AutoLock lock(lock_); | 145 base::AutoLock lock(lock_); |
| 142 demand = --current_pushes_outstanding_ < max_pushes_outstanding_ | 146 demand = --current_pushes_outstanding_ < max_pushes_outstanding_ |
| 143 ? Demand::kPositive | 147 ? Demand::kPositive |
| 144 : Demand::kNegative; | 148 : Demand::kNegative; |
| 145 } | 149 } |
| 146 | 150 |
| 147 DCHECK(demand_callback_); | 151 DCHECK(demand_callback_); |
| 148 demand_callback_(demand); | 152 demand_callback_(demand); |
| 149 }); | 153 }); |
| 150 } | 154 } |
| 151 | 155 |
| 152 MediaPacketPtr MojoProducer::CreateMediaPacket(const PacketPtr& packet) { | 156 MediaPacketPtr MojoPacketProducer::CreateMediaPacket(const PacketPtr& packet) { |
| 153 DCHECK(packet); | 157 DCHECK(packet); |
| 154 | 158 |
| 155 MediaPacketRegionPtr region = MediaPacketRegion::New(); | 159 MediaPacketRegionPtr region = MediaPacketRegion::New(); |
| 156 region->offset = packet->size() == 0 | 160 region->offset = packet->size() == 0 |
| 157 ? 0 | 161 ? 0 |
| 158 : mojo_allocator_.OffsetFromPtr(packet->payload()); | 162 : mojo_allocator_.OffsetFromPtr(packet->payload()); |
| 159 region->length = packet->size(); | 163 region->length = packet->size(); |
| 160 | 164 |
| 161 MediaPacketPtr media_packet = MediaPacket::New(); | 165 MediaPacketPtr media_packet = MediaPacket::New(); |
| 162 media_packet->pts = packet->pts(); | 166 media_packet->pts = packet->pts(); |
| 163 media_packet->end_of_stream = packet->end_of_stream(); | 167 media_packet->end_of_stream = packet->end_of_stream(); |
| 164 media_packet->payload = region.Pass(); | 168 media_packet->payload = region.Pass(); |
| 165 | 169 |
| 166 return media_packet.Pass(); | 170 return media_packet.Pass(); |
| 167 } | 171 } |
| 168 | 172 |
| 169 } // namespace media | 173 } // namespace media |
| 170 } // namespace mojo | 174 } // namespace mojo |
| OLD | NEW |