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

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: Added comments to AudioTrackController::SetRate regarding the proper way to implement it. Created 4 years, 9 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
« no previous file with comments | « services/media/framework_mojo/push_producer_base.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
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_);
105 DCHECK(current_pushes_outstanding_);
106 demand = --current_pushes_outstanding_ < max_pushes_outstanding_ ?
107 Demand::kPositive :
108 Demand::kNegative;
109 }
110
111 DCHECK(demand_callback_);
112 demand_callback_(demand);
113
114 if (end_of_stream_ && packet->end_of_stream()) {
115 SetState(MediaState::ENDED);
116 }
117 }
118
119 void PushProducerBase::OnConnectionLost() {
120 DCHECK(demand_callback_);
121 demand_callback_(Demand::kNegative);
122 SetState(MediaState::UNPREPARED);
123 }
124
125 void PushProducerBase::SetState(MediaState state) {
126 if (state_ != state) {
127 state_ = state;
128 if (status_callback_) {
129 status_callback_(state_);
130 }
131 }
132 }
133
134 MediaPacketPtr PushProducerBase::CreateMediaPacket(
135 const PacketPtr& packet) {
136 DCHECK(packet);
137
138 MediaPacketRegionPtr region = MediaPacketRegion::New();
139 region->offset = mojo_allocator_.OffsetFromPtr(packet->payload());
140 region->length = packet->size();
141
142 MediaPacketPtr media_packet = MediaPacket::New();
143 media_packet->pts = packet->presentation_time();
144 media_packet->duration = packet->duration();
145 media_packet->end_of_stream = packet->end_of_stream();
146 media_packet->payload = region.Pass();
147
148 return media_packet.Pass();
149 }
150
151 } // namespace media
152 } // namespace mojo
OLDNEW
« no previous file with comments | « services/media/framework_mojo/push_producer_base.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698