Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/bind.h" | |
| 6 #include "base/bind_helpers.h" | |
| 7 #include "base/logging.h" | |
| 8 #include "base/message_loop/message_loop.h" | |
| 9 #include "services/media/framework_mojo/push_producer_base.h" | |
| 10 | |
| 11 namespace mojo { | |
| 12 namespace media { | |
| 13 | |
| 14 PushProducerBase::PushProducerBase() : | |
| 15 state_(MediaState::UNPREPARED), | |
| 16 end_of_stream_(false), | |
| 17 max_pushes_outstanding_(0), | |
| 18 current_pushes_outstanding_(0) { | |
| 19 task_runner_ = base::MessageLoop::current()->task_runner(); | |
| 20 DCHECK(task_runner_); | |
| 21 } | |
| 22 | |
| 23 PushProducerBase::~PushProducerBase() { | |
| 24 base::AutoLock lock(lock_); | |
| 25 } | |
| 26 | |
| 27 void PushProducerBase::SetStatusCallback( | |
| 28 const StatusCallback& callback) { | |
| 29 status_callback_ = callback; | |
| 30 } | |
| 31 | |
| 32 PayloadAllocator* PushProducerBase::allocator() { | |
| 33 return &mojo_allocator_; | |
| 34 } | |
| 35 | |
| 36 void PushProducerBase::SetDemandCallback( | |
| 37 const DemandCallback& demand_callback) { | |
| 38 demand_callback_ = demand_callback; | |
| 39 } | |
| 40 | |
| 41 void PushProducerBase::Prime() { | |
| 42 { | |
| 43 base::AutoLock lock(lock_); | |
| 44 max_pushes_outstanding_ = 10; // TODO(dalesat): Made up! | |
| 45 } | |
| 46 | |
| 47 DCHECK(demand_callback_); | |
| 48 demand_callback_(Demand::kPositive); | |
| 49 SetState(MediaState::PAUSED); | |
| 50 } | |
| 51 | |
| 52 Demand PushProducerBase::SupplyPacket(PacketPtr packet) { | |
| 53 DCHECK(packet); | |
| 54 | |
| 55 // If we're no longer connected, throw the packet away. | |
| 56 if (!IsConnected()) { | |
| 57 SetState(MediaState::UNPREPARED); | |
| 58 // TODO(dalesat): More shutdown? | |
| 59 return Demand::kNegative; | |
| 60 } | |
| 61 | |
| 62 Demand demand; | |
| 63 | |
| 64 { | |
| 65 base::AutoLock lock(lock_); | |
| 66 DCHECK(current_pushes_outstanding_ < max_pushes_outstanding_); | |
| 67 DCHECK(!end_of_stream_) << "packet pushed after end-of-stream"; | |
| 68 | |
| 69 ++current_pushes_outstanding_; | |
| 70 | |
| 71 if (packet->end_of_stream()) { | |
| 72 end_of_stream_ = true; | |
| 73 demand = Demand::kNegative; | |
| 74 max_pushes_outstanding_ = 0; | |
| 75 } else { | |
| 76 demand = current_pushes_outstanding_ < max_pushes_outstanding_ ? | |
| 77 Demand::kPositive : | |
| 78 Demand::kNegative; | |
| 79 } | |
| 80 } | |
| 81 | |
| 82 MediaPacketPtr media_packet = CreateMediaPacket(packet); | |
| 83 task_runner_->PostTask(FROM_HERE, base::Bind( | |
| 84 &PushProducerBase::PushPacket, | |
| 85 base::Unretained(this), | |
| 86 packet.release(), | |
| 87 base::Passed(media_packet.Pass()))); | |
| 88 | |
| 89 return demand; | |
| 90 } | |
| 91 | |
| 92 void PushProducerBase::PushPacket( | |
| 93 Packet* packet_raw_ptr, | |
| 94 MediaPacketPtr media_packet) { | |
|
johngro
2016/02/23 00:49:42
why do you need this level of indirection? IOW -
dalesat
2016/02/23 20:34:34
There was probably some work going on here previou
| |
| 95 PushPacketInternal(packet_raw_ptr, media_packet.Pass()); | |
| 96 } | |
| 97 | |
| 98 void PushProducerBase::PushCompleted(const PacketPtr& packet) { | |
| 99 DCHECK(packet); | |
| 100 | |
| 101 Demand demand; | |
| 102 | |
| 103 { | |
| 104 base::AutoLock lock(lock_); | |
|
johngro
2016/02/23 00:49:42
DCHECK(current_pushes_outstanding_)
dalesat
2016/02/23 20:34:34
Done.
| |
| 105 demand = --current_pushes_outstanding_ < max_pushes_outstanding_ ? | |
| 106 Demand::kPositive : | |
| 107 Demand::kNegative; | |
| 108 } | |
| 109 | |
| 110 DCHECK(demand_callback_); | |
| 111 demand_callback_(demand); | |
| 112 | |
| 113 if (end_of_stream_ && packet->end_of_stream()) { | |
| 114 SetState(MediaState::ENDED); | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 void PushProducerBase::OnConnectionLost() { | |
| 119 DCHECK(demand_callback_); | |
| 120 demand_callback_(Demand::kNegative); | |
| 121 SetState(MediaState::UNPREPARED); | |
| 122 } | |
| 123 | |
| 124 void PushProducerBase::SetState(MediaState state) { | |
| 125 if (state_ != state) { | |
| 126 state_ = state; | |
| 127 if (status_callback_) { | |
| 128 status_callback_(state_); | |
| 129 } | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 MediaPacketPtr PushProducerBase::CreateMediaPacket( | |
| 134 const PacketPtr& packet) { | |
| 135 DCHECK(packet); | |
| 136 | |
| 137 MediaPacketRegionPtr region = MediaPacketRegion::New(); | |
| 138 region->offset = mojo_allocator_.OffsetFromPtr(packet->payload()); | |
| 139 region->length = packet->size(); | |
| 140 | |
| 141 MediaPacketPtr media_packet = MediaPacket::New(); | |
| 142 media_packet->pts = packet->presentation_time(); | |
| 143 media_packet->duration = packet->duration(); | |
| 144 media_packet->end_of_stream = packet->end_of_stream(); | |
| 145 media_packet->payload = region.Pass(); | |
| 146 | |
| 147 return media_packet.Pass(); | |
| 148 } | |
| 149 | |
| 150 } // namespace media | |
| 151 } // namespace mojo | |
| OLD | NEW |