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

Side by Side Diff: services/media/factory_service/media_source_impl.cc

Issue 1945903006: Motown: Move responsibility for binding to MediaFactoryService::Product (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Change per feedback - rename Abort to UnbindAndReleaseFromOwner Created 4 years, 7 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
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/logging.h" 6 #include "base/logging.h"
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "services/media/factory_service/media_source_impl.h" 8 #include "services/media/factory_service/media_source_impl.h"
9 #include "services/media/framework/util/callback_joiner.h" 9 #include "services/media/framework/util/callback_joiner.h"
10 #include "services/media/framework/util/conversion_pipeline_builder.h" 10 #include "services/media/framework/util/conversion_pipeline_builder.h"
(...skipping 13 matching lines...) Expand all
24 MediaFactoryService* owner) { 24 MediaFactoryService* owner) {
25 return std::shared_ptr<MediaSourceImpl>(new MediaSourceImpl( 25 return std::shared_ptr<MediaSourceImpl>(new MediaSourceImpl(
26 reader.Pass(), allowed_media_types, request.Pass(), owner)); 26 reader.Pass(), allowed_media_types, request.Pass(), owner));
27 } 27 }
28 28
29 MediaSourceImpl::MediaSourceImpl( 29 MediaSourceImpl::MediaSourceImpl(
30 InterfaceHandle<SeekingReader> reader, 30 InterfaceHandle<SeekingReader> reader,
31 const Array<MediaTypeSetPtr>& allowed_media_types, 31 const Array<MediaTypeSetPtr>& allowed_media_types,
32 InterfaceRequest<MediaSource> request, 32 InterfaceRequest<MediaSource> request,
33 MediaFactoryService* owner) 33 MediaFactoryService* owner)
34 : MediaFactoryService::Product(owner), 34 : MediaFactoryService::Product<MediaSource>(this, request.Pass(), owner),
35 binding_(this, request.Pass()),
36 allowed_media_types_(allowed_media_types.Clone()) { 35 allowed_media_types_(allowed_media_types.Clone()) {
37 DCHECK(reader); 36 DCHECK(reader);
38 37
39 task_runner_ = base::MessageLoop::current()->task_runner(); 38 task_runner_ = base::MessageLoop::current()->task_runner();
40 DCHECK(task_runner_); 39 DCHECK(task_runner_);
41 40
42 status_publisher_.SetCallbackRunner( 41 status_publisher_.SetCallbackRunner(
43 [this](const GetStatusCallback& callback, uint64_t version) { 42 [this](const GetStatusCallback& callback, uint64_t version) {
44 MediaSourceStatusPtr status = MediaSourceStatus::New(); 43 MediaSourceStatusPtr status = MediaSourceStatus::New();
45 status->state = state_; 44 status->state = state_;
46 status->metadata = 45 status->metadata =
47 demux_ ? MediaMetadata::From(demux_->metadata()) : nullptr; 46 demux_ ? MediaMetadata::From(demux_->metadata()) : nullptr;
48 callback.Run(version, status.Pass()); 47 callback.Run(version, status.Pass());
49 }); 48 });
50 49
51 // Go away when the client is no longer connected.
52 binding_.set_connection_error_handler([this]() { ReleaseFromOwner(); });
53
54 std::shared_ptr<Reader> reader_ptr = MojoReader::Create(reader.Pass()); 50 std::shared_ptr<Reader> reader_ptr = MojoReader::Create(reader.Pass());
55 if (!reader_ptr) { 51 if (!reader_ptr) {
56 NOTREACHED() << "couldn't create reader"; 52 NOTREACHED() << "couldn't create reader";
57 state_ = MediaState::FAULT; 53 state_ = MediaState::FAULT;
58 return; 54 return;
59 } 55 }
60 56
61 demux_ = Demux::Create(reader_ptr); 57 demux_ = Demux::Create(reader_ptr);
62 if (!demux_) { 58 if (!demux_) {
63 NOTREACHED() << "couldn't create demux"; 59 NOTREACHED() << "couldn't create demux";
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 descriptor->media_type = streams_[i]->media_type(); 98 descriptor->media_type = streams_[i]->media_type();
103 descriptor->original_media_type = streams_[i]->original_media_type(); 99 descriptor->original_media_type = streams_[i]->original_media_type();
104 result[i] = descriptor.Pass(); 100 result[i] = descriptor.Pass();
105 } 101 }
106 callback.Run(result.Pass()); 102 callback.Run(result.Pass());
107 }); 103 });
108 } 104 }
109 105
110 void MediaSourceImpl::GetProducer(uint32_t stream_index, 106 void MediaSourceImpl::GetProducer(uint32_t stream_index,
111 InterfaceRequest<MediaProducer> producer) { 107 InterfaceRequest<MediaProducer> producer) {
112 DCHECK(init_complete_.occurred()); 108 RCHECK(init_complete_.occurred());
113 109
114 if (stream_index >= streams_.size()) { 110 if (stream_index >= streams_.size()) {
115 return; 111 return;
116 } 112 }
117 113
118 streams_[stream_index]->GetProducer(producer.Pass()); 114 streams_[stream_index]->GetProducer(producer.Pass());
119 } 115 }
120 116
121 void MediaSourceImpl::GetPullModeProducer( 117 void MediaSourceImpl::GetPullModeProducer(
122 uint32_t stream_index, 118 uint32_t stream_index,
123 InterfaceRequest<MediaPullModeProducer> producer) { 119 InterfaceRequest<MediaPullModeProducer> producer) {
124 DCHECK(init_complete_.occurred()); 120 RCHECK(init_complete_.occurred());
125 121
126 if (stream_index >= streams_.size()) { 122 if (stream_index >= streams_.size()) {
127 return; 123 return;
128 } 124 }
129 125
130 streams_[stream_index]->GetPullModeProducer(producer.Pass()); 126 streams_[stream_index]->GetPullModeProducer(producer.Pass());
131 } 127 }
132 128
133 void MediaSourceImpl::GetStatus(uint64_t version_last_seen, 129 void MediaSourceImpl::GetStatus(uint64_t version_last_seen,
134 const GetStatusCallback& callback) { 130 const GetStatusCallback& callback) {
135 status_publisher_.Get(version_last_seen, callback); 131 status_publisher_.Get(version_last_seen, callback);
136 } 132 }
137 133
138 void MediaSourceImpl::Prepare(const PrepareCallback& callback) { 134 void MediaSourceImpl::Prepare(const PrepareCallback& callback) {
139 DCHECK(init_complete_.occurred()); 135 RCHECK(init_complete_.occurred());
140 136
141 for (std::unique_ptr<Stream>& stream : streams_) { 137 for (std::unique_ptr<Stream>& stream : streams_) {
142 stream->EnsureSink(); 138 stream->EnsureSink();
143 } 139 }
144 graph_.Prepare(); 140 graph_.Prepare();
145 state_ = MediaState::PAUSED; 141 state_ = MediaState::PAUSED;
146 callback.Run(); 142 callback.Run();
147 status_publisher_.SendUpdates(); 143 status_publisher_.SendUpdates();
148 } 144 }
149 145
150 void MediaSourceImpl::Prime(const PrimeCallback& callback) { 146 void MediaSourceImpl::Prime(const PrimeCallback& callback) {
151 DCHECK(init_complete_.occurred()); 147 RCHECK(init_complete_.occurred());
152 148
153 std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create(); 149 std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create();
154 150
155 for (std::unique_ptr<Stream>& stream : streams_) { 151 for (std::unique_ptr<Stream>& stream : streams_) {
156 stream->PrimeConnection(callback_joiner->NewCallback()); 152 stream->PrimeConnection(callback_joiner->NewCallback());
157 } 153 }
158 154
159 callback_joiner->WhenJoined(callback); 155 callback_joiner->WhenJoined(callback);
160 } 156 }
161 157
162 void MediaSourceImpl::Flush(const FlushCallback& callback) { 158 void MediaSourceImpl::Flush(const FlushCallback& callback) {
163 DCHECK(init_complete_.occurred()); 159 RCHECK(init_complete_.occurred());
164 160
165 graph_.FlushAllOutputs(demux_part_); 161 graph_.FlushAllOutputs(demux_part_);
166 162
167 std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create(); 163 std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create();
168 164
169 for (std::unique_ptr<Stream>& stream : streams_) { 165 for (std::unique_ptr<Stream>& stream : streams_) {
170 stream->FlushConnection(callback_joiner->NewCallback()); 166 stream->FlushConnection(callback_joiner->NewCallback());
171 } 167 }
172 168
173 callback_joiner->WhenJoined(callback); 169 callback_joiner->WhenJoined(callback);
174 } 170 }
175 171
176 void MediaSourceImpl::Seek(int64_t position, const SeekCallback& callback) { 172 void MediaSourceImpl::Seek(int64_t position, const SeekCallback& callback) {
177 DCHECK(init_complete_.occurred()); 173 RCHECK(init_complete_.occurred());
178 174
179 demux_->Seek(position, [this, callback]() { 175 demux_->Seek(position, [this, callback]() {
180 task_runner_->PostTask(FROM_HERE, base::Bind(&RunSeekCallback, callback)); 176 task_runner_->PostTask(FROM_HERE, base::Bind(&RunSeekCallback, callback));
181 }); 177 });
182 } 178 }
183 179
184 // static 180 // static
185 void MediaSourceImpl::RunSeekCallback(const SeekCallback& callback) { 181 void MediaSourceImpl::RunSeekCallback(const SeekCallback& callback) {
186 callback.Run(); 182 callback.Run();
187 } 183 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 const MojoProducer::FlushConnectionCallback callback) { 267 const MojoProducer::FlushConnectionCallback callback) {
272 if (producer_ != nullptr) { 268 if (producer_ != nullptr) {
273 producer_->FlushConnection(callback); 269 producer_->FlushConnection(callback);
274 } else { 270 } else {
275 callback.Run(); 271 callback.Run();
276 } 272 }
277 } 273 }
278 274
279 } // namespace media 275 } // namespace media
280 } // namespace mojo 276 } // namespace mojo
OLDNEW
« no previous file with comments | « services/media/factory_service/media_source_impl.h ('k') | services/media/factory_service/network_reader_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698