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

Side by Side Diff: media/mojo/clients/mojo_demuxer.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
« no previous file with comments | « media/mojo/clients/mojo_demuxer.h ('k') | media/mojo/clients/mojo_demuxer_factory.h » ('j') | 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 (c) 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/clients/mojo_demuxer.h"
6
7 #include "base/callback_helpers.h"
8 #include "media/base/media_tracks.h"
9 #include "media/mojo/clients/mojo_data_source_impl.h"
10 #include "media/mojo/common/media_type_converters.h"
11
12 using base::TimeDelta;
13
14 namespace media {
15
16 MojoDemuxer::MojoDemuxer(
17 int32_t remote_id,
18 Demuxer::LoadType load_type,
19 DataSource* data_source,
20 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
21 mojom::DemuxerPtr mojo_demuxer,
22 const base::Closure& open_cb,
23 const Demuxer::EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
24 const Demuxer::MediaTracksUpdatedCB& media_tracks_updated_cb)
25 : media_task_runner_(media_task_runner),
26 load_type_(load_type),
27 mojo_data_source_(nullptr),
28 data_source_(data_source),
29 open_cb_(open_cb),
30 encrypted_media_init_data_cb_(encrypted_media_init_data_cb),
31 media_tracks_updated_cb_(media_tracks_updated_cb),
32 remote_demuxer_info_(mojo_demuxer.PassInterface()),
33 client_binding_(this),
34 weak_factory_(this) {
35 DCHECK(!open_cb_.is_null());
36 DCHECK(remote_id_ != MediaResource::kInvalidRemoteId);
37 remote_id_ = remote_id;
38 }
39
40 MojoDemuxer::~MojoDemuxer() {
41 // Demuxer is always destroyed in the main thread.
42 CHECK(!media_task_runner_->BelongsToCurrentThread());
43 CHECK(!remote_demuxer_);
44 CHECK(!mojo_data_source_);
45 }
46
47 DemuxerStream* MojoDemuxer::GetStream(DemuxerStream::Type type) {
48 return nullptr;
49 }
50
51 MediaResource::Type MojoDemuxer::GetType() const {
52 return MediaResource::Type::REMOTE;
53 }
54
55 std::string MojoDemuxer::GetDisplayName() const {
56 return "MojoDemuxer";
57 }
58
59 void MojoDemuxer::Initialize(DemuxerHost* host,
60 const PipelineStatusCB& status_cb,
61 bool enable_text_tracks) {
62 CHECK(media_task_runner_->BelongsToCurrentThread());
63
64 host_ = host;
65 status_cb_ = status_cb;
66
67 // Bind |mojo_demuxer_| to the |media_task_runner_|.
68 if (!remote_demuxer_.is_bound())
69 remote_demuxer_.Bind(std::move(remote_demuxer_info_));
70
71 remote_demuxer_.set_connection_error_handler(
72 base::Bind(&MojoDemuxer::OnConnectionError, weak_factory_.GetWeakPtr()));
73
74 mojom::DemuxerClientAssociatedPtrInfo client_ptr_info;
75 client_binding_.Bind(&client_ptr_info, remote_demuxer_.associated_group());
76
77 mojom::DataSourcePtr data_source_ptr;
78 if (data_source_) {
79 mojo_data_source_.reset(
80 new MojoDataSourceImpl(data_source_, MakeRequest(&data_source_ptr)));
81 mojo_data_source_->set_connection_error_handler(base::Bind(
82 &MojoDemuxer::OnDataSourceConnectionError, weak_factory_.GetWeakPtr()));
83 }
84
85 remote_demuxer_->Initialize(
86 std::move(client_ptr_info), GetRemoteId(), load_type_,
87 std::move(data_source_ptr),
88 base::Bind(&MojoDemuxer::OnInitialized, weak_factory_.GetWeakPtr()));
89 }
90
91 void MojoDemuxer::OnDataSourceConnectionError() {
92 CHECK(media_task_runner_->BelongsToCurrentThread());
93
94 mojo_data_source_.reset();
95 }
96
97 void MojoDemuxer::OnInitialized(bool success) {
98 CHECK(media_task_runner_->BelongsToCurrentThread());
99
100 if (!success) {
101 media_task_runner_->PostTask(
102 FROM_HERE, base::Bind(status_cb_, DEMUXER_ERROR_COULD_NOT_OPEN));
103 return;
104 }
105
106 media_task_runner_->PostTask(FROM_HERE, base::Bind(status_cb_, PIPELINE_OK));
107 base::ResetAndReturn(&open_cb_).Run();
108 }
109
110 void MojoDemuxer::StartWaitingForSeek(base::TimeDelta seek_time) {
111 CHECK(!media_task_runner_->BelongsToCurrentThread());
112
113 remote_demuxer_->StartWaitingForSeek(seek_time);
114 }
115
116 void MojoDemuxer::CancelPendingSeek(base::TimeDelta seek_time) {
117 if (media_task_runner_->BelongsToCurrentThread())
118 remote_demuxer_->CancelPendingSeek(seek_time);
119 else {
120 base::Bind(&MojoDemuxer::CancelPendingSeek, weak_factory_.GetWeakPtr(),
121 seek_time);
122 }
123 }
124
125 void MojoDemuxer::Seek(base::TimeDelta time,
126 const PipelineStatusCB& status_cb) {
127 CHECK(media_task_runner_->BelongsToCurrentThread());
128
129 remote_demuxer_->Seek(
130 time,
131 base::Bind(&MojoDemuxer::OnSeek, weak_factory_.GetWeakPtr(), status_cb));
132 }
133
134 void MojoDemuxer::OnSeek(const PipelineStatusCB& status_cb,
135 PipelineStatus status) {
136 media_task_runner_->PostTask(FROM_HERE, base::Bind(status_cb, status));
137 }
138
139 void MojoDemuxer::Stop() {
140 CHECK(media_task_runner_->BelongsToCurrentThread());
141
142 remote_demuxer_->Stop();
143
144 // Unbind in the bound thread.
145 remote_demuxer_.reset();
146 mojo_data_source_.reset();
147 }
148
149 void MojoDemuxer::AbortPendingReads() {
150 CHECK(media_task_runner_->BelongsToCurrentThread());
151
152 remote_demuxer_->AbortPendingReads();
153 }
154
155 base::TimeDelta MojoDemuxer::GetStartTime() const {
156 CHECK(media_task_runner_->BelongsToCurrentThread());
157
158 base::TimeDelta start_time;
159 remote_demuxer_->GetStartTime(&start_time);
160
161 return start_time;
162 }
163 base::Time MojoDemuxer::GetTimelineOffset() const {
164 CHECK(media_task_runner_->BelongsToCurrentThread());
165
166 base::Time timeline_offset;
167 remote_demuxer_->GetTimelineOffset(&timeline_offset);
168
169 return timeline_offset;
170 }
171
172 int64_t MojoDemuxer::GetMemoryUsage() const {
173 CHECK(media_task_runner_->BelongsToCurrentThread());
174
175 int64_t memory_usage = 0;
176 remote_demuxer_->GetMemoryUsage(&memory_usage);
177
178 return memory_usage;
179 }
180
181 void MojoDemuxer::OnEnabledAudioTracksChanged(
182 const std::vector<MediaTrack::Id>& track_ids,
183 base::TimeDelta current_time) {
184 CHECK(media_task_runner_->BelongsToCurrentThread());
185 remote_demuxer_->OnEnabledAudioTracksChanged(track_ids, current_time);
186 }
187 void MojoDemuxer::OnSelectedVideoTrackChanged(
188 const std::vector<MediaTrack::Id>& track_ids,
189 base::TimeDelta current_time) {
190 CHECK(media_task_runner_->BelongsToCurrentThread());
191 remote_demuxer_->OnSelectedVideoTrackChanged(track_ids, current_time);
192 }
193
194 void MojoDemuxer::OnConnectionError() {
195 CHECK(media_task_runner_->BelongsToCurrentThread());
196
197 host_->OnDemuxerError(PIPELINE_ERROR_READ);
198 }
199
200 void MojoDemuxer::OnEncryptedMediaInitData(
201 EmeInitDataType init_data_type,
202 const std::vector<uint8_t>& init_data) {
203 CHECK(media_task_runner_->BelongsToCurrentThread());
204 encrypted_media_init_data_cb_.Run(init_data_type, init_data);
205 }
206
207 void MojoDemuxer::OnMediaTracksUpdated(mojom::MediaTracksPtr mojo_tracks) {
208 CHECK(media_task_runner_->BelongsToCurrentThread());
209
210 std::unique_ptr<MediaTracks> tracks(
211 mojo_tracks.To<std::unique_ptr<MediaTracks>>());
212
213 media_tracks_updated_cb_.Run(std::move(tracks));
214 }
215
216 void MojoDemuxer::OnBufferedTimeRangesChanged(
217 mojom::RangesTimeDeltaPtr mojo_ranges) {
218 CHECK(media_task_runner_->BelongsToCurrentThread());
219
220 Ranges<base::TimeDelta> ranges = mojo_ranges.To<Ranges<base::TimeDelta>>();
221 host_->OnBufferedTimeRangesChanged(ranges);
222 }
223
224 void MojoDemuxer::OnSetDuration(base::TimeDelta duration) {
225 CHECK(media_task_runner_->BelongsToCurrentThread());
226
227 host_->SetDuration(duration);
228 }
229
230 void MojoDemuxer::OnDemuxerError(PipelineStatus error) {
231 CHECK(media_task_runner_->BelongsToCurrentThread());
232
233 host_->OnDemuxerError(error);
234 }
235
236 } // namespace media
OLDNEW
« no previous file with comments | « media/mojo/clients/mojo_demuxer.h ('k') | media/mojo/clients/mojo_demuxer_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698