| 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_producer.h" |
| 10 | 10 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 void MojoProducer::AddBinding(InterfaceRequest<MediaProducer> producer) { | 23 void MojoProducer::AddBinding(InterfaceRequest<MediaProducer> producer) { |
| 24 bindings_.AddBinding(this, producer.Pass()); | 24 bindings_.AddBinding(this, producer.Pass()); |
| 25 } | 25 } |
| 26 | 26 |
| 27 void MojoProducer::PrimeConnection(const FlushConnectionCallback& callback) { | 27 void MojoProducer::PrimeConnection(const FlushConnectionCallback& callback) { |
| 28 Demand demand; | 28 Demand demand; |
| 29 | 29 |
| 30 { | 30 { |
| 31 base::AutoLock lock(lock_); | 31 base::AutoLock lock(lock_); |
| 32 max_pushes_outstanding_ = 10; // TODO(dalesat): Made up! | 32 max_pushes_outstanding_ = 10; // TODO(dalesat): Made up! |
| 33 demand = current_pushes_outstanding_ < max_pushes_outstanding_ ? | 33 demand = current_pushes_outstanding_ < max_pushes_outstanding_ |
| 34 Demand::kPositive : | 34 ? Demand::kPositive |
| 35 Demand::kNegative; | 35 : Demand::kNegative; |
| 36 } | 36 } |
| 37 | 37 |
| 38 DCHECK(demand_callback_); | 38 DCHECK(demand_callback_); |
| 39 demand_callback_(demand); | 39 demand_callback_(demand); |
| 40 SetState(MediaState::PAUSED); | 40 SetState(MediaState::PAUSED); |
| 41 | 41 |
| 42 DCHECK(consumer_.is_bound()); | 42 DCHECK(consumer_.is_bound()); |
| 43 consumer_->Prime([this, callback]() { | 43 consumer_->Prime([this, callback]() { callback.Run(); }); |
| 44 callback.Run(); | |
| 45 }); | |
| 46 } | 44 } |
| 47 | 45 |
| 48 void MojoProducer::FlushConnection(const FlushConnectionCallback& callback) { | 46 void MojoProducer::FlushConnection(const FlushConnectionCallback& callback) { |
| 49 { | 47 { |
| 50 base::AutoLock lock(lock_); | 48 base::AutoLock lock(lock_); |
| 51 max_pushes_outstanding_ = 0; | 49 max_pushes_outstanding_ = 0; |
| 52 } | 50 } |
| 53 | 51 |
| 54 DCHECK(demand_callback_); | 52 DCHECK(demand_callback_); |
| 55 demand_callback_(Demand::kNegative); | 53 demand_callback_(Demand::kNegative); |
| 56 | 54 |
| 57 DCHECK(consumer_.is_bound()); | 55 DCHECK(consumer_.is_bound()); |
| 58 consumer_->Flush(callback); | 56 consumer_->Flush(callback); |
| 59 first_pts_since_flush_ = Packet::kUnknownPts; | 57 first_pts_since_flush_ = Packet::kUnknownPts; |
| 60 end_of_stream_ = false; | 58 end_of_stream_ = false; |
| 61 } | 59 } |
| 62 | 60 |
| 63 void MojoProducer::SetStatusCallback( | 61 void MojoProducer::SetStatusCallback(const StatusCallback& callback) { |
| 64 const StatusCallback& callback) { | |
| 65 status_callback_ = callback; | 62 status_callback_ = callback; |
| 66 } | 63 } |
| 67 | 64 |
| 68 int64_t MojoProducer::GetFirstPtsSinceFlush() { | 65 int64_t MojoProducer::GetFirstPtsSinceFlush() { |
| 69 return first_pts_since_flush_; | 66 return first_pts_since_flush_; |
| 70 } | 67 } |
| 71 | 68 |
| 72 PayloadAllocator* MojoProducer::allocator() { | 69 PayloadAllocator* MojoProducer::allocator() { |
| 73 return &mojo_allocator_; | 70 return &mojo_allocator_; |
| 74 } | 71 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 98 DCHECK(current_pushes_outstanding_ < max_pushes_outstanding_); | 95 DCHECK(current_pushes_outstanding_ < max_pushes_outstanding_); |
| 99 DCHECK(!end_of_stream_) << "packet pushed after end-of-stream"; | 96 DCHECK(!end_of_stream_) << "packet pushed after end-of-stream"; |
| 100 | 97 |
| 101 ++current_pushes_outstanding_; | 98 ++current_pushes_outstanding_; |
| 102 | 99 |
| 103 if (packet->end_of_stream()) { | 100 if (packet->end_of_stream()) { |
| 104 end_of_stream_ = true; | 101 end_of_stream_ = true; |
| 105 demand = Demand::kNegative; | 102 demand = Demand::kNegative; |
| 106 max_pushes_outstanding_ = 0; | 103 max_pushes_outstanding_ = 0; |
| 107 } else { | 104 } else { |
| 108 demand = current_pushes_outstanding_ < max_pushes_outstanding_ ? | 105 demand = current_pushes_outstanding_ < max_pushes_outstanding_ |
| 109 Demand::kPositive : | 106 ? Demand::kPositive |
| 110 Demand::kNegative; | 107 : Demand::kNegative; |
| 111 } | 108 } |
| 112 } | 109 } |
| 113 | 110 |
| 114 MediaPacketPtr media_packet = CreateMediaPacket(packet); | 111 MediaPacketPtr media_packet = CreateMediaPacket(packet); |
| 115 task_runner_->PostTask(FROM_HERE, base::Bind( | 112 task_runner_->PostTask( |
| 116 &MojoProducer::SendPacket, | 113 FROM_HERE, |
| 117 base::Unretained(this), | 114 base::Bind(&MojoProducer::SendPacket, base::Unretained(this), |
| 118 packet.release(), | 115 packet.release(), base::Passed(media_packet.Pass()))); |
| 119 base::Passed(media_packet.Pass()))); | |
| 120 | 116 |
| 121 return demand; | 117 return demand; |
| 122 } | 118 } |
| 123 | 119 |
| 124 void MojoProducer::Connect( | 120 void MojoProducer::Connect(InterfaceHandle<MediaConsumer> consumer, |
| 125 InterfaceHandle<MediaConsumer> consumer, | 121 const ConnectCallback& callback) { |
| 126 const ConnectCallback& callback) { | |
| 127 DCHECK(consumer); | 122 DCHECK(consumer); |
| 128 | 123 |
| 129 consumer_ = MediaConsumerPtr::Create(std::move(consumer)); | 124 consumer_ = MediaConsumerPtr::Create(std::move(consumer)); |
| 130 | 125 |
| 131 if (!mojo_allocator_.initialized()) { | 126 if (!mojo_allocator_.initialized()) { |
| 132 mojo_allocator_.InitNew(256 * 1024); // TODO(dalesat): Made up! | 127 mojo_allocator_.InitNew(256 * 1024); // TODO(dalesat): Made up! |
| 133 } | 128 } |
| 134 | 129 |
| 135 consumer_->SetBuffer( | 130 consumer_->SetBuffer(mojo_allocator_.GetDuplicateHandle(), |
| 136 mojo_allocator_.GetDuplicateHandle(), | 131 [callback]() { callback.Run(); }); |
| 137 [callback]() { | |
| 138 callback.Run(); | |
| 139 }); | |
| 140 } | 132 } |
| 141 | 133 |
| 142 void MojoProducer::Disconnect() { | 134 void MojoProducer::Disconnect() { |
| 143 DCHECK(demand_callback_); | 135 DCHECK(demand_callback_); |
| 144 demand_callback_(Demand::kNegative); | 136 demand_callback_(Demand::kNegative); |
| 145 SetState(MediaState::UNPREPARED); | 137 SetState(MediaState::UNPREPARED); |
| 146 consumer_.reset(); | 138 consumer_.reset(); |
| 147 } | 139 } |
| 148 | 140 |
| 149 void MojoProducer::SendPacket( | 141 void MojoProducer::SendPacket(Packet* packet_raw_ptr, |
| 150 Packet* packet_raw_ptr, | 142 MediaPacketPtr media_packet) { |
| 151 MediaPacketPtr media_packet) { | |
| 152 consumer_->SendPacket( | 143 consumer_->SendPacket( |
| 153 media_packet.Pass(), | 144 media_packet.Pass(), |
| 154 [this, packet_raw_ptr](MediaConsumer::SendResult send_result) { | 145 [this, packet_raw_ptr](MediaConsumer::SendResult send_result) { |
| 155 PacketPtr packet = PacketPtr(packet_raw_ptr); | 146 PacketPtr packet = PacketPtr(packet_raw_ptr); |
| 156 Demand demand; | 147 Demand demand; |
| 157 | 148 |
| 158 { | 149 { |
| 159 base::AutoLock lock(lock_); | 150 base::AutoLock lock(lock_); |
| 160 demand = --current_pushes_outstanding_ < max_pushes_outstanding_ ? | 151 demand = --current_pushes_outstanding_ < max_pushes_outstanding_ |
| 161 Demand::kPositive : | 152 ? Demand::kPositive |
| 162 Demand::kNegative; | 153 : Demand::kNegative; |
| 163 } | 154 } |
| 164 | 155 |
| 165 DCHECK(demand_callback_); | 156 DCHECK(demand_callback_); |
| 166 demand_callback_(demand); | 157 demand_callback_(demand); |
| 167 | 158 |
| 168 if (end_of_stream_ && packet->end_of_stream()) { | 159 if (end_of_stream_ && packet->end_of_stream()) { |
| 169 SetState(MediaState::ENDED); | 160 SetState(MediaState::ENDED); |
| 170 } | 161 } |
| 171 }); | 162 }); |
| 172 } | 163 } |
| 173 | 164 |
| 174 void MojoProducer::SetState(MediaState state) { | 165 void MojoProducer::SetState(MediaState state) { |
| 175 if (state_ != state) { | 166 if (state_ != state) { |
| 176 state_ = state; | 167 state_ = state; |
| 177 if (status_callback_) { | 168 if (status_callback_) { |
| 178 status_callback_(state_); | 169 status_callback_(state_); |
| 179 } | 170 } |
| 180 } | 171 } |
| 181 } | 172 } |
| 182 | 173 |
| 183 MediaPacketPtr MojoProducer::CreateMediaPacket( | 174 MediaPacketPtr MojoProducer::CreateMediaPacket(const PacketPtr& packet) { |
| 184 const PacketPtr& packet) { | |
| 185 DCHECK(packet); | 175 DCHECK(packet); |
| 186 | 176 |
| 187 MediaPacketRegionPtr region = MediaPacketRegion::New(); | 177 MediaPacketRegionPtr region = MediaPacketRegion::New(); |
| 188 region->offset = packet->size() == 0 ? 0 : | 178 region->offset = packet->size() == 0 |
| 189 mojo_allocator_.OffsetFromPtr(packet->payload()); | 179 ? 0 |
| 180 : mojo_allocator_.OffsetFromPtr(packet->payload()); |
| 190 region->length = packet->size(); | 181 region->length = packet->size(); |
| 191 | 182 |
| 192 MediaPacketPtr media_packet = MediaPacket::New(); | 183 MediaPacketPtr media_packet = MediaPacket::New(); |
| 193 media_packet->pts = packet->pts(); | 184 media_packet->pts = packet->pts(); |
| 194 media_packet->end_of_stream = packet->end_of_stream(); | 185 media_packet->end_of_stream = packet->end_of_stream(); |
| 195 media_packet->payload = region.Pass(); | 186 media_packet->payload = region.Pass(); |
| 196 | 187 |
| 197 return media_packet.Pass(); | 188 return media_packet.Pass(); |
| 198 } | 189 } |
| 199 | 190 |
| 200 } // namespace media | 191 } // namespace media |
| 201 } // namespace mojo | 192 } // namespace mojo |
| OLD | NEW |