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

Side by Side Diff: media/mojo/services/mojo_demuxer_service.cc

Issue 2643743002: Mojify demuxers and allow running {Chunk/FFmpeg}Demuxer in a Utility Process (Closed)
Patch Set: Rebase and make sure to unbind mojom::DemuxerPtr on the bound thread during termination Created 3 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 2017 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 "media/mojo/services/mojo_demuxer_service.h"
6
7 #include "base/lazy_instance.h"
8 #include "media/base/bind_to_current_loop.h"
9 #include "media/base/data_buffer.h"
10 #include "media/base/demuxer_factory.h"
11 #include "media/base/media_tracks.h"
12 #include "media/mojo/common/media_type_converters.h"
13 #include "media/mojo/common/mojo_data_buffer_converter.h"
14 #include "media/mojo/services/mojo_data_source_adapter.h"
15 #include "media/mojo/services/mojo_demuxer_service_context.h"
16
17 namespace media {
18
19 namespace {
20
21 // Manages all Demuxers created by MojoDemuxerService. Can only have one
22 // instance per
23 // process so use a LazyInstance to ensure this.
24 class DemuxerManager {
25 public:
26 DemuxerManager() {}
27 ~DemuxerManager() {}
28
29 // Returns the Demuxer associated with |demuxer_id|. Can be called on any
30 // thread.
31 Demuxer* GetDemuxer(int demuxer_id) {
32 base::AutoLock lock(lock_);
33 auto iter = demuxer_map_.find(demuxer_id);
34 return iter == demuxer_map_.end() ? nullptr : iter->second;
35 }
36
37 // Registers the |demuxer| for |demuxer_id|.
38 void RegisterDemuxer(int demuxer_id, Demuxer* demuxer) {
39 base::AutoLock lock(lock_);
40 DCHECK(!demuxer_map_.count(demuxer_id));
41 demuxer_map_[demuxer_id] = demuxer;
42 }
43
44 // Unregisters the Demuxer associated with |demuxer_id|.
45 void UnregisterDemuxer(int demuxer_id) {
46 base::AutoLock lock(lock_);
47 DCHECK(demuxer_map_.count(demuxer_id));
48 demuxer_map_.erase(demuxer_id);
49 }
50
51 private:
52 // Lock to protect |demuxer_map_|.
53 base::Lock lock_;
54 std::map<int, Demuxer*> demuxer_map_;
55
56 DISALLOW_COPY_AND_ASSIGN(DemuxerManager);
57 };
58
59 base::LazyInstance<DemuxerManager>::Leaky g_demuxer_manager =
60 LAZY_INSTANCE_INITIALIZER;
61
62 } // namespace
63
64 MojoDemuxerService::MojoDemuxerService(
65 base::WeakPtr<MojoDemuxerServiceContext> context,
66 DemuxerFactory* demuxer_factory)
67 : task_runner_(base::ThreadTaskRunnerHandle::Get()),
68 context_(context),
69 demuxer_factory_(demuxer_factory),
70 data_source_(nullptr),
71 demuxer_id_(MediaResource::kInvalidRemoteId),
72 demuxer_(nullptr),
73 source_buffer_(nullptr),
74 weak_factory_(this) {
75 DCHECK(context_);
76 DCHECK(demuxer_factory_);
77 }
78
79 MojoDemuxerService::~MojoDemuxerService() {
80 CHECK(task_runner_->BelongsToCurrentThread());
81 if (demuxer_id_ == MediaResource::kInvalidRemoteId)
82 return;
83
84 g_demuxer_manager.Get().UnregisterDemuxer(demuxer_id_);
85
86 if (context_)
87 context_->UnregisterDemuxer(demuxer_id_);
88 }
89
90 media::Demuxer* MojoDemuxerService::GetDemuxerSourceBuffer(
91 media::SourceBuffer** source_buffer_out) {
92 CHECK(task_runner_->BelongsToCurrentThread());
93 DCHECK(source_buffer_out);
94
95 *source_buffer_out = source_buffer_;
96
97 return demuxer_.get();
98 }
99
100 media::Demuxer* MojoDemuxerService::GetDemuxer(
101 const PipelineStatusCB& demuxer_init_cb) {
102 CHECK(task_runner_->BelongsToCurrentThread());
103 if (!demuxer_init_cb.is_null())
104 demuxer_init_cb_ = demuxer_init_cb;
105
106 return demuxer_.get();
107 }
108
109 void MojoDemuxerService::Initialize(
110 mojom::DemuxerClientAssociatedPtrInfo client,
111 int32_t demuxer_id,
112 media::Demuxer::LoadType load_type,
113 mojom::DataSourcePtr mojo_data_source,
114 const InitializeCallback& callback) {
115 CHECK(task_runner_->BelongsToCurrentThread());
116 client_.Bind(std::move(client));
117
118 std::unique_ptr<media::Demuxer> demuxer;
119
120 if (load_type == media::Demuxer::LoadType::LoadTypeMediaSource) {
121 demuxer = demuxer_factory_->CreateDemuxerSourceBuffer(
122 base::ThreadTaskRunnerHandle::Get(),
123 base::ThreadTaskRunnerHandle::Get(), base::Bind(&base::DoNothing),
124 BindToCurrentLoop(
125 base::Bind(&MojoDemuxerService::OnEncryptedMediaInitData,
126 weak_factory_.GetWeakPtr())),
127 &source_buffer_);
128 } else if (load_type == media::Demuxer::LoadType::LoadTypeURL) {
129 CHECK(mojo_data_source);
130 data_source_.reset(new MojoDataSourceAdapter(
131 std::move(mojo_data_source),
132 base::Bind(&MojoDemuxerService::OnDataSourceReady,
133 weak_factory_.GetWeakPtr(), callback)));
134 demuxer = demuxer_factory_->CreateDemuxer(
135 nullptr, base::ThreadTaskRunnerHandle::Get(), data_source_.get(),
136 BindToCurrentLoop(
137 base::Bind(&MojoDemuxerService::OnEncryptedMediaInitData,
138 weak_factory_.GetWeakPtr())),
139 BindToCurrentLoop(base::Bind(&MojoDemuxerService::OnMediaTracksUpdated,
140 weak_factory_.GetWeakPtr())));
141 }
142
143 if (!demuxer) {
144 callback.Run(false);
145 return;
146 }
147
148 demuxer_ = std::move(demuxer);
149
150 demuxer_id_ = demuxer_id;
151 context_->RegisterDemuxer(demuxer_id_, this);
152 g_demuxer_manager.Get().RegisterDemuxer(demuxer_id_, demuxer_.get());
153
154 if (load_type == media::Demuxer::LoadType::LoadTypeMediaSource) {
155 demuxer_->Initialize(this,
156 base::Bind(&MojoDemuxerService::OnDemuxerInitialized,
157 weak_factory_.GetWeakPtr()),
158 false);
159 callback.Run(true);
160 }
161 }
162
163 void MojoDemuxerService::OnDataSourceReady(const InitializeCallback& callback) {
164 demuxer_->Initialize(this,
165 base::Bind(&MojoDemuxerService::OnDemuxerInitialized,
166 weak_factory_.GetWeakPtr()),
167 false);
168 callback.Run(true);
169 }
170
171 void MojoDemuxerService::OnDemuxerInitialized(PipelineStatus status) {
172 demuxer_init_cb_.Run(status);
173 }
174
175 void MojoDemuxerService::StartWaitingForSeek(base::TimeDelta seek_time) {
176 demuxer_->StartWaitingForSeek(seek_time);
177 }
178
179 void MojoDemuxerService::CancelPendingSeek(base::TimeDelta seek_time) {
180 demuxer_->CancelPendingSeek(seek_time);
181 }
182
183 void MojoDemuxerService::Seek(base::TimeDelta time,
184 const SeekCallback& callback) {
185 demuxer_->Seek(time, base::Bind(&MojoDemuxerService::OnSeek,
186 weak_factory_.GetWeakPtr(), callback));
187 }
188
189 void MojoDemuxerService::OnSeek(const SeekCallback& callback,
190 PipelineStatus status) {
191 callback.Run(status);
192 }
193
194 void MojoDemuxerService::Stop() {
195 demuxer_->Stop();
196 }
197
198 void MojoDemuxerService::AbortPendingReads() {
199 demuxer_->AbortPendingReads();
200 }
201
202 void MojoDemuxerService::GetStartTime(const GetStartTimeCallback& callback) {
203 base::TimeDelta start_time = demuxer_->GetStartTime();
204 callback.Run(start_time);
205 }
206
207 void MojoDemuxerService::GetTimelineOffset(
208 const GetTimelineOffsetCallback& callback) {
209 base::Time timeline_offset = demuxer_->GetTimelineOffset();
210 callback.Run(timeline_offset);
211 }
212
213 void MojoDemuxerService::GetMemoryUsage(
214 const GetMemoryUsageCallback& callback) {
215 int64_t memory_usage = demuxer_->GetMemoryUsage();
216 callback.Run(memory_usage);
217 }
218
219 void MojoDemuxerService::OnEnabledAudioTracksChanged(
220 const std::vector<MediaTrack::Id>& track_ids,
221 base::TimeDelta current_time) {
222 demuxer_->OnEnabledAudioTracksChanged(track_ids, current_time);
223 }
224 void MojoDemuxerService::OnSelectedVideoTrackChanged(
225 const std::vector<MediaTrack::Id>& track_ids,
226 base::TimeDelta current_time) {
227 demuxer_->OnSelectedVideoTrackChanged(track_ids, current_time);
228 }
229
230 void MojoDemuxerService::OnEncryptedMediaInitData(
231 EmeInitDataType init_data_type,
232 const std::vector<uint8_t>& init_data) {
233 CHECK(task_runner_->BelongsToCurrentThread());
234 client_->OnEncryptedMediaInitData(init_data_type, init_data);
235 }
236
237 void MojoDemuxerService::OnMediaTracksUpdated(
238 std::unique_ptr<MediaTracks> tracks) {
239 CHECK(task_runner_->BelongsToCurrentThread());
240 mojom::MediaTracksPtr mojo_tracks = mojom::MediaTracks::From(*tracks.get());
241 client_->OnMediaTracksUpdated(std::move(mojo_tracks));
242 }
243
244 void MojoDemuxerService::OnBufferedTimeRangesChanged(
245 const Ranges<base::TimeDelta>& ranges) {
246 CHECK(task_runner_->BelongsToCurrentThread());
247 mojom::RangesTimeDeltaPtr mojo_ranges = mojom::RangesTimeDelta::From(ranges);
248 client_->OnBufferedTimeRangesChanged(std::move(mojo_ranges));
249 }
250
251 void MojoDemuxerService::SetDuration(base::TimeDelta duration) {
252 CHECK(task_runner_->BelongsToCurrentThread());
253 client_->OnSetDuration(duration);
254 }
255
256 void MojoDemuxerService::OnDemuxerError(PipelineStatus error) {
257 CHECK(task_runner_->BelongsToCurrentThread());
258 client_->OnDemuxerError(error);
259 }
260
261 void MojoDemuxerService::AddTextStream(DemuxerStream* text_stream,
262 const TextTrackConfig& config) {
263 NOTIMPLEMENTED();
264 }
265
266 void MojoDemuxerService::RemoveTextStream(DemuxerStream* text_stream) {
267 NOTIMPLEMENTED();
268 }
269
270 } // namespace media
OLDNEW
« no previous file with comments | « media/mojo/services/mojo_demuxer_service.h ('k') | media/mojo/services/mojo_demuxer_service_context.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698