| OLD | NEW |
| (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 |
| OLD | NEW |