OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "media/mojo/clients/mojo_renderer.h" | 5 #include "media/mojo/clients/mojo_renderer.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 MojoRenderer::MojoRenderer( | 22 MojoRenderer::MojoRenderer( |
23 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 23 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
24 std::unique_ptr<VideoOverlayFactory> video_overlay_factory, | 24 std::unique_ptr<VideoOverlayFactory> video_overlay_factory, |
25 VideoRendererSink* video_renderer_sink, | 25 VideoRendererSink* video_renderer_sink, |
26 mojom::RendererPtr remote_renderer) | 26 mojom::RendererPtr remote_renderer) |
27 : task_runner_(task_runner), | 27 : task_runner_(task_runner), |
28 video_overlay_factory_(std::move(video_overlay_factory)), | 28 video_overlay_factory_(std::move(video_overlay_factory)), |
29 video_renderer_sink_(video_renderer_sink), | 29 video_renderer_sink_(video_renderer_sink), |
30 remote_renderer_info_(remote_renderer.PassInterface()), | 30 remote_renderer_info_(remote_renderer.PassInterface()), |
31 binding_(this) { | 31 binding_(this), |
| 32 media_time_interpolator_(&media_clock_) { |
32 DVLOG(1) << __FUNCTION__; | 33 DVLOG(1) << __FUNCTION__; |
33 } | 34 } |
34 | 35 |
35 MojoRenderer::~MojoRenderer() { | 36 MojoRenderer::~MojoRenderer() { |
36 DVLOG(1) << __FUNCTION__; | 37 DVLOG(1) << __FUNCTION__; |
37 DCHECK(task_runner_->BelongsToCurrentThread()); | 38 DCHECK(task_runner_->BelongsToCurrentThread()); |
38 | 39 |
39 CancelPendingCallbacks(); | 40 CancelPendingCallbacks(); |
40 } | 41 } |
41 | 42 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 DCHECK(task_runner_->BelongsToCurrentThread()); | 161 DCHECK(task_runner_->BelongsToCurrentThread()); |
161 DCHECK(remote_renderer_.is_bound()); | 162 DCHECK(remote_renderer_.is_bound()); |
162 DCHECK(!flush_cb.is_null()); | 163 DCHECK(!flush_cb.is_null()); |
163 DCHECK(flush_cb_.is_null()); | 164 DCHECK(flush_cb_.is_null()); |
164 | 165 |
165 if (encountered_error_) { | 166 if (encountered_error_) { |
166 task_runner_->PostTask(FROM_HERE, flush_cb); | 167 task_runner_->PostTask(FROM_HERE, flush_cb); |
167 return; | 168 return; |
168 } | 169 } |
169 | 170 |
| 171 { |
| 172 base::AutoLock auto_lock(lock_); |
| 173 media_time_interpolator_.StopInterpolating(); |
| 174 } |
| 175 |
170 flush_cb_ = flush_cb; | 176 flush_cb_ = flush_cb; |
171 remote_renderer_->Flush( | 177 remote_renderer_->Flush( |
172 base::Bind(&MojoRenderer::OnFlushed, base::Unretained(this))); | 178 base::Bind(&MojoRenderer::OnFlushed, base::Unretained(this))); |
173 } | 179 } |
174 | 180 |
175 void MojoRenderer::StartPlayingFrom(base::TimeDelta time) { | 181 void MojoRenderer::StartPlayingFrom(base::TimeDelta time) { |
176 DVLOG(2) << __FUNCTION__; | 182 DVLOG(2) << __FUNCTION__ << "(" << time << ")"; |
177 DCHECK(task_runner_->BelongsToCurrentThread()); | 183 DCHECK(task_runner_->BelongsToCurrentThread()); |
178 DCHECK(remote_renderer_.is_bound()); | 184 DCHECK(remote_renderer_.is_bound()); |
179 | 185 |
180 { | 186 { |
181 base::AutoLock auto_lock(lock_); | 187 base::AutoLock auto_lock(lock_); |
182 time_ = time; | 188 media_time_interpolator_.SetBounds(time, time, media_clock_.NowTicks()); |
| 189 media_time_interpolator_.StartInterpolating(); |
183 } | 190 } |
184 | 191 |
185 remote_renderer_->StartPlayingFrom(time); | 192 remote_renderer_->StartPlayingFrom(time); |
186 } | 193 } |
187 | 194 |
188 void MojoRenderer::SetPlaybackRate(double playback_rate) { | 195 void MojoRenderer::SetPlaybackRate(double playback_rate) { |
189 DVLOG(2) << __FUNCTION__; | 196 DVLOG(2) << __FUNCTION__ << "(" << playback_rate << ")"; |
190 DCHECK(task_runner_->BelongsToCurrentThread()); | 197 DCHECK(task_runner_->BelongsToCurrentThread()); |
191 DCHECK(remote_renderer_.is_bound()); | 198 DCHECK(remote_renderer_.is_bound()); |
192 | 199 |
193 remote_renderer_->SetPlaybackRate(playback_rate); | 200 remote_renderer_->SetPlaybackRate(playback_rate); |
| 201 |
| 202 { |
| 203 base::AutoLock auto_lock(lock_); |
| 204 media_time_interpolator_.SetPlaybackRate(playback_rate); |
| 205 } |
194 } | 206 } |
195 | 207 |
196 void MojoRenderer::SetVolume(float volume) { | 208 void MojoRenderer::SetVolume(float volume) { |
197 DVLOG(2) << __FUNCTION__; | 209 DVLOG(2) << __FUNCTION__ << "(" << volume << ")"; |
198 DCHECK(task_runner_->BelongsToCurrentThread()); | 210 DCHECK(task_runner_->BelongsToCurrentThread()); |
199 DCHECK(remote_renderer_.is_bound()); | 211 DCHECK(remote_renderer_.is_bound()); |
200 | 212 |
201 remote_renderer_->SetVolume(volume); | 213 remote_renderer_->SetVolume(volume); |
202 } | 214 } |
203 | 215 |
204 base::TimeDelta MojoRenderer::GetMediaTime() { | 216 base::TimeDelta MojoRenderer::GetMediaTime() { |
205 base::AutoLock auto_lock(lock_); | 217 base::AutoLock auto_lock(lock_); |
206 DVLOG(3) << __FUNCTION__ << ": " << time_.InMilliseconds() << " ms"; | 218 base::TimeDelta media_time = media_time_interpolator_.GetInterpolatedTime(); |
207 return time_; | 219 DVLOG(3) << __FUNCTION__ << ": " << media_time.InMilliseconds() << " ms"; |
| 220 return media_time; |
208 } | 221 } |
209 | 222 |
210 bool MojoRenderer::HasAudio() { | 223 bool MojoRenderer::HasAudio() { |
211 DVLOG(1) << __FUNCTION__; | 224 DVLOG(1) << __FUNCTION__; |
212 DCHECK(task_runner_->BelongsToCurrentThread()); | 225 DCHECK(task_runner_->BelongsToCurrentThread()); |
213 DCHECK(remote_renderer_.is_bound()); | 226 DCHECK(remote_renderer_.is_bound()); |
214 | 227 |
215 if (demuxer_stream_provider_->GetType() == DemuxerStreamProvider::Type::URL) { | 228 if (demuxer_stream_provider_->GetType() == DemuxerStreamProvider::Type::URL) { |
216 NOTIMPLEMENTED(); | 229 NOTIMPLEMENTED(); |
217 return false; | 230 return false; |
218 } | 231 } |
219 | 232 |
220 return !!demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); | 233 return !!demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); |
221 } | 234 } |
222 | 235 |
223 bool MojoRenderer::HasVideo() { | 236 bool MojoRenderer::HasVideo() { |
224 DVLOG(1) << __FUNCTION__; | 237 DVLOG(1) << __FUNCTION__; |
225 DCHECK(task_runner_->BelongsToCurrentThread()); | 238 DCHECK(task_runner_->BelongsToCurrentThread()); |
226 DCHECK(remote_renderer_.is_bound()); | 239 DCHECK(remote_renderer_.is_bound()); |
227 | 240 |
228 if (demuxer_stream_provider_->GetType() == DemuxerStreamProvider::Type::URL) { | 241 if (demuxer_stream_provider_->GetType() == DemuxerStreamProvider::Type::URL) { |
229 NOTIMPLEMENTED(); | 242 NOTIMPLEMENTED(); |
230 return false; | 243 return false; |
231 } | 244 } |
232 | 245 |
233 return !!demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | 246 return !!demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); |
234 } | 247 } |
235 | 248 |
236 void MojoRenderer::OnTimeUpdate(base::TimeDelta time, | 249 void MojoRenderer::OnTimeUpdate(base::TimeDelta time, |
237 base::TimeDelta max_time) { | 250 base::TimeDelta max_time, |
238 DVLOG(3) << __FUNCTION__ << ": " << time << ", " << max_time; | 251 base::TimeTicks capture_time) { |
| 252 DVLOG(4) << __FUNCTION__ << "(" << time << ", " << max_time << ", " |
| 253 << capture_time << ")"; |
239 DCHECK(task_runner_->BelongsToCurrentThread()); | 254 DCHECK(task_runner_->BelongsToCurrentThread()); |
240 | 255 |
241 base::AutoLock auto_lock(lock_); | 256 base::AutoLock auto_lock(lock_); |
242 time_ = time; | 257 media_time_interpolator_.SetBounds(time, max_time, capture_time); |
243 } | 258 } |
244 | 259 |
245 void MojoRenderer::OnBufferingStateChange(mojom::BufferingState state) { | 260 void MojoRenderer::OnBufferingStateChange(mojom::BufferingState state) { |
246 DVLOG(2) << __FUNCTION__; | 261 DVLOG(2) << __FUNCTION__; |
247 DCHECK(task_runner_->BelongsToCurrentThread()); | 262 DCHECK(task_runner_->BelongsToCurrentThread()); |
248 client_->OnBufferingStateChange(static_cast<media::BufferingState>(state)); | 263 client_->OnBufferingStateChange(static_cast<media::BufferingState>(state)); |
249 } | 264 } |
250 | 265 |
251 void MojoRenderer::OnEnded() { | 266 void MojoRenderer::OnEnded() { |
252 DVLOG(1) << __FUNCTION__; | 267 DVLOG(1) << __FUNCTION__; |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED); | 396 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED); |
382 | 397 |
383 if (!flush_cb_.is_null()) | 398 if (!flush_cb_.is_null()) |
384 base::ResetAndReturn(&flush_cb_).Run(); | 399 base::ResetAndReturn(&flush_cb_).Run(); |
385 | 400 |
386 if (!cdm_attached_cb_.is_null()) | 401 if (!cdm_attached_cb_.is_null()) |
387 base::ResetAndReturn(&cdm_attached_cb_).Run(false); | 402 base::ResetAndReturn(&cdm_attached_cb_).Run(false); |
388 } | 403 } |
389 | 404 |
390 } // namespace media | 405 } // namespace media |
OLD | NEW |