| OLD | NEW |
| (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_source_buffer_service.h" |
| 6 |
| 7 #include <map> |
| 8 |
| 9 #include "media/base/data_buffer.h" |
| 10 #include "media/base/media_tracks.h" |
| 11 #include "media/base/source_buffer.h" |
| 12 #include "media/mojo/common/media_type_converters.h" |
| 13 #include "media/mojo/common/mojo_data_buffer_converter.h" |
| 14 |
| 15 namespace media { |
| 16 |
| 17 MojoSourceBufferService::MojoSourceBufferService( |
| 18 base::WeakPtr<MojoDemuxerServiceContext> context) |
| 19 : task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 20 context_(context), |
| 21 source_buffer_(nullptr), |
| 22 weak_factory_(this) { |
| 23 DCHECK(context_); |
| 24 } |
| 25 |
| 26 MojoSourceBufferService::~MojoSourceBufferService() {} |
| 27 |
| 28 void MojoSourceBufferService::Initialize( |
| 29 mojom::SourceBufferClientAssociatedPtrInfo client, |
| 30 int32_t demuxer_id, |
| 31 mojo::ScopedDataPipeConsumerHandle consumer_handle) { |
| 32 CHECK(task_runner_->BelongsToCurrentThread()); |
| 33 |
| 34 client_.Bind(std::move(client)); |
| 35 |
| 36 context_->GetDemuxerSourceBuffer(demuxer_id, &source_buffer_); |
| 37 CHECK(source_buffer_); |
| 38 |
| 39 mojo_data_buffer_reader_.reset( |
| 40 new MojoDataBufferReader(std::move(consumer_handle))); |
| 41 } |
| 42 |
| 43 void MojoSourceBufferService::AddId(const std::string& id, |
| 44 const std::string& type, |
| 45 const std::string& codecs, |
| 46 const AddIdCallback& callback) { |
| 47 CHECK(task_runner_->BelongsToCurrentThread()); |
| 48 media::SourceBuffer::Status status = source_buffer_->AddId(id, type, codecs); |
| 49 callback.Run(status); |
| 50 } |
| 51 |
| 52 void MojoSourceBufferService::AppendData(const std::string& id, |
| 53 mojom::DataBufferPtr mojo_data_buffer, |
| 54 base::TimeDelta append_window_start, |
| 55 base::TimeDelta append_window_end, |
| 56 const AppendDataCallback& callback) { |
| 57 CHECK(task_runner_->BelongsToCurrentThread()); |
| 58 |
| 59 mojo_data_buffer_reader_->ReadDataBuffer( |
| 60 std::move(mojo_data_buffer), |
| 61 base::BindOnce(&MojoSourceBufferService::OnBufferRead, |
| 62 weak_factory_.GetWeakPtr(), id, append_window_start, |
| 63 append_window_end, callback)); |
| 64 } |
| 65 |
| 66 void MojoSourceBufferService::OnBufferRead(const std::string& id, |
| 67 base::TimeDelta append_window_start, |
| 68 base::TimeDelta append_window_end, |
| 69 const AppendDataCallback& callback, |
| 70 scoped_refptr<DataBuffer> buffer) { |
| 71 CHECK(task_runner_->BelongsToCurrentThread()); |
| 72 base::TimeDelta timestamp_offset; |
| 73 bool success = false; |
| 74 |
| 75 if (!buffer) { |
| 76 callback.Run(success, timestamp_offset); |
| 77 return; |
| 78 } |
| 79 success = source_buffer_->AppendData(id, buffer->data(), buffer->data_size(), |
| 80 append_window_start, append_window_end, |
| 81 ×tamp_offset); |
| 82 callback.Run(success, timestamp_offset); |
| 83 } |
| 84 |
| 85 void MojoSourceBufferService::SetTracksWatcher(const std::string& id) { |
| 86 CHECK(task_runner_->BelongsToCurrentThread()); |
| 87 source_buffer_->SetTracksWatcher( |
| 88 id, base::Bind(&MojoSourceBufferService::OnTracksWatcher, |
| 89 weak_factory_.GetWeakPtr(), id)); |
| 90 } |
| 91 |
| 92 void MojoSourceBufferService::OnTracksWatcher( |
| 93 const std::string& id, |
| 94 std::unique_ptr<MediaTracks> tracks) { |
| 95 CHECK(task_runner_->BelongsToCurrentThread()); |
| 96 CHECK(tracks); |
| 97 mojom::MediaTracksPtr mojo_tracks = mojom::MediaTracks::From(*tracks.get()); |
| 98 CHECK(mojo_tracks); |
| 99 |
| 100 client_->OnTracksWatcher(id, std::move(mojo_tracks)); |
| 101 } |
| 102 |
| 103 void MojoSourceBufferService::RemoveId(const std::string& id) { |
| 104 CHECK(task_runner_->BelongsToCurrentThread()); |
| 105 source_buffer_->RemoveId(id); |
| 106 } |
| 107 |
| 108 void MojoSourceBufferService::GetBufferedRanges( |
| 109 const std::string& id, |
| 110 const GetBufferedRangesCallback& callback) { |
| 111 CHECK(task_runner_->BelongsToCurrentThread()); |
| 112 Ranges<base::TimeDelta> ranges = source_buffer_->GetBufferedRanges(id); |
| 113 mojom::RangesTimeDeltaPtr mojo_ranges = mojom::RangesTimeDelta::From(ranges); |
| 114 CHECK(mojo_ranges); |
| 115 callback.Run(std::move(mojo_ranges)); |
| 116 } |
| 117 |
| 118 void MojoSourceBufferService::GetHighestPresentationTimestamp( |
| 119 const std::string& id, |
| 120 const GetHighestPresentationTimestampCallback& callback) { |
| 121 CHECK(task_runner_->BelongsToCurrentThread()); |
| 122 base::TimeDelta timestamp = |
| 123 source_buffer_->GetHighestPresentationTimestamp(id); |
| 124 callback.Run(timestamp); |
| 125 } |
| 126 |
| 127 void MojoSourceBufferService::ResetParserState( |
| 128 const std::string& id, |
| 129 base::TimeDelta append_window_start, |
| 130 base::TimeDelta append_window_end, |
| 131 const ResetParserStateCallback& callback) { |
| 132 CHECK(task_runner_->BelongsToCurrentThread()); |
| 133 base::TimeDelta timestamp_offset; |
| 134 source_buffer_->ResetParserState(id, append_window_start, append_window_end, |
| 135 ×tamp_offset); |
| 136 callback.Run(timestamp_offset); |
| 137 } |
| 138 |
| 139 void MojoSourceBufferService::Remove(const std::string& id, |
| 140 base::TimeDelta start, |
| 141 base::TimeDelta end) { |
| 142 CHECK(task_runner_->BelongsToCurrentThread()); |
| 143 source_buffer_->Remove(id, start, end); |
| 144 } |
| 145 |
| 146 void MojoSourceBufferService::EvictCodedFrames( |
| 147 const std::string& id, |
| 148 base::TimeDelta currentMediaTime, |
| 149 size_t newDataSize, |
| 150 const EvictCodedFramesCallback& callback) { |
| 151 CHECK(task_runner_->BelongsToCurrentThread()); |
| 152 bool success = |
| 153 source_buffer_->EvictCodedFrames(id, currentMediaTime, newDataSize); |
| 154 callback.Run(success); |
| 155 } |
| 156 |
| 157 void MojoSourceBufferService::OnMemoryPressure( |
| 158 base::TimeDelta currentMediaTime, |
| 159 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level, |
| 160 bool force_instant_gc) { |
| 161 CHECK(task_runner_->BelongsToCurrentThread()); |
| 162 source_buffer_->OnMemoryPressure(currentMediaTime, memory_pressure_level, |
| 163 force_instant_gc); |
| 164 } |
| 165 |
| 166 void MojoSourceBufferService::GetDuration(const GetDurationCallback& callback) { |
| 167 double duration = source_buffer_->GetDuration(); |
| 168 callback.Run(duration); |
| 169 } |
| 170 |
| 171 void MojoSourceBufferService::GetDuration_Locked( |
| 172 const GetDuration_LockedCallback& callback) { |
| 173 callback.Run(source_buffer_->GetDuration_Locked()); |
| 174 } |
| 175 |
| 176 void MojoSourceBufferService::SetDuration(double duration) { |
| 177 source_buffer_->SetDuration(duration); |
| 178 } |
| 179 |
| 180 void MojoSourceBufferService::IsParsingMediaSegment( |
| 181 const std::string& id, |
| 182 const IsParsingMediaSegmentCallback& callback) { |
| 183 bool is_parsing = source_buffer_->IsParsingMediaSegment(id); |
| 184 callback.Run(is_parsing); |
| 185 } |
| 186 |
| 187 void MojoSourceBufferService::SetSequenceMode(const std::string& id, |
| 188 bool sequence_mode) { |
| 189 source_buffer_->SetSequenceMode(id, sequence_mode); |
| 190 } |
| 191 |
| 192 void MojoSourceBufferService::SetGroupStartTimestampIfInSequenceMode( |
| 193 const std::string& id, |
| 194 base::TimeDelta timestamp_offset) { |
| 195 source_buffer_->SetGroupStartTimestampIfInSequenceMode(id, timestamp_offset); |
| 196 } |
| 197 |
| 198 void MojoSourceBufferService::MarkEndOfStream(PipelineStatus status) { |
| 199 source_buffer_->MarkEndOfStream(status); |
| 200 } |
| 201 |
| 202 void MojoSourceBufferService::UnmarkEndOfStream() { |
| 203 source_buffer_->UnmarkEndOfStream(); |
| 204 } |
| 205 |
| 206 void MojoSourceBufferService::Shutdown() { |
| 207 source_buffer_->Shutdown(); |
| 208 } |
| 209 /* |
| 210 void MojoSourceBufferService::SetMemoryLimitsForTest(DemuxerStream::Type type, |
| 211 size_t memory_limit){} |
| 212 |
| 213 Ranges<base::TimeDelta> MojoSourceBufferService::GetBufferedRanges() const{ |
| 214 return source_buffer_->GetBufferedRanges(); |
| 215 }*/ |
| 216 |
| 217 } // namespace media |
| OLD | NEW |