Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: services/media/framework_mojo/push_producer_base.cc

Issue 1692443002: Motown: Framework parts for mojo transport (producer/consumer/mediapipe) and control (audiotrack). (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Sync and fix: InterfaceHandle<X> vs XPtr, changes to MediaPipe Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698