Chromium Code Reviews| 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 if (media_time_interpolator_.interpolating()) | |
| 174 media_time_interpolator_.StopInterpolating(); | |
| 175 } | |
| 176 | |
| 170 flush_cb_ = flush_cb; | 177 flush_cb_ = flush_cb; |
| 171 remote_renderer_->Flush( | 178 remote_renderer_->Flush( |
| 172 base::Bind(&MojoRenderer::OnFlushed, base::Unretained(this))); | 179 base::Bind(&MojoRenderer::OnFlushed, base::Unretained(this))); |
| 173 } | 180 } |
| 174 | 181 |
| 175 void MojoRenderer::StartPlayingFrom(base::TimeDelta time) { | 182 void MojoRenderer::StartPlayingFrom(base::TimeDelta time) { |
| 176 DVLOG(2) << __FUNCTION__; | 183 DVLOG(2) << __FUNCTION__ << "(" << time << ")"; |
| 177 DCHECK(task_runner_->BelongsToCurrentThread()); | 184 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 178 DCHECK(remote_renderer_.is_bound()); | 185 DCHECK(remote_renderer_.is_bound()); |
| 179 | 186 |
| 180 { | 187 { |
| 181 base::AutoLock auto_lock(lock_); | 188 base::AutoLock auto_lock(lock_); |
| 182 time_ = time; | 189 media_time_interpolator_.SetBounds(time, time, media_clock_.NowTicks()); |
| 190 media_time_interpolator_.StartInterpolating(); | |
| 191 last_media_time_ = base::TimeDelta(); | |
| 183 } | 192 } |
| 184 | 193 |
| 185 remote_renderer_->StartPlayingFrom(time); | 194 remote_renderer_->StartPlayingFrom(time); |
| 186 } | 195 } |
| 187 | 196 |
| 188 void MojoRenderer::SetPlaybackRate(double playback_rate) { | 197 void MojoRenderer::SetPlaybackRate(double playback_rate) { |
| 189 DVLOG(2) << __FUNCTION__; | 198 DVLOG(2) << __FUNCTION__ << "(" << playback_rate << ")"; |
| 190 DCHECK(task_runner_->BelongsToCurrentThread()); | 199 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 191 DCHECK(remote_renderer_.is_bound()); | 200 DCHECK(remote_renderer_.is_bound()); |
| 192 | 201 |
| 193 remote_renderer_->SetPlaybackRate(playback_rate); | 202 remote_renderer_->SetPlaybackRate(playback_rate); |
| 203 | |
| 204 { | |
| 205 base::AutoLock auto_lock(lock_); | |
| 206 media_time_interpolator_.SetPlaybackRate(playback_rate); | |
| 207 } | |
| 194 } | 208 } |
| 195 | 209 |
| 196 void MojoRenderer::SetVolume(float volume) { | 210 void MojoRenderer::SetVolume(float volume) { |
| 197 DVLOG(2) << __FUNCTION__; | 211 DVLOG(2) << __FUNCTION__ << "(" << volume << ")"; |
| 198 DCHECK(task_runner_->BelongsToCurrentThread()); | 212 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 199 DCHECK(remote_renderer_.is_bound()); | 213 DCHECK(remote_renderer_.is_bound()); |
| 200 | 214 |
| 201 remote_renderer_->SetVolume(volume); | 215 remote_renderer_->SetVolume(volume); |
| 202 } | 216 } |
| 203 | 217 |
| 204 base::TimeDelta MojoRenderer::GetMediaTime() { | 218 base::TimeDelta MojoRenderer::GetMediaTime() { |
| 205 base::AutoLock auto_lock(lock_); | 219 base::AutoLock auto_lock(lock_); |
| 206 DVLOG(3) << __FUNCTION__ << ": " << time_.InMilliseconds() << " ms"; | 220 base::TimeDelta media_time = media_time_interpolator_.GetInterpolatedTime(); |
| 207 return time_; | 221 if (media_time < last_media_time_) { |
| 222 DVLOG(2) << __func__ << ": actual=" << media_time | |
|
alokp
2016/09/08 17:37:52
We have the same logic in AudioRendererImpl. In fa
DaleCurtis
2016/09/08 17:45:29
That seems reasonable to me.
alokp
2016/09/08 19:30:50
Done. Please check PipelineImpl and AudioRendererI
| |
| 223 << " clamped=" << last_media_time_; | |
| 224 return last_media_time_; | |
| 225 } | |
| 226 DVLOG(3) << __FUNCTION__ << ": " << media_time.InMilliseconds() << " ms"; | |
| 227 last_media_time_ = media_time; | |
| 228 return last_media_time_; | |
| 208 } | 229 } |
| 209 | 230 |
| 210 bool MojoRenderer::HasAudio() { | 231 bool MojoRenderer::HasAudio() { |
| 211 DVLOG(1) << __FUNCTION__; | 232 DVLOG(1) << __FUNCTION__; |
| 212 DCHECK(task_runner_->BelongsToCurrentThread()); | 233 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 213 DCHECK(remote_renderer_.is_bound()); | 234 DCHECK(remote_renderer_.is_bound()); |
| 214 | 235 |
| 215 if (demuxer_stream_provider_->GetType() == DemuxerStreamProvider::Type::URL) { | 236 if (demuxer_stream_provider_->GetType() == DemuxerStreamProvider::Type::URL) { |
| 216 NOTIMPLEMENTED(); | 237 NOTIMPLEMENTED(); |
| 217 return false; | 238 return false; |
| 218 } | 239 } |
| 219 | 240 |
| 220 return !!demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); | 241 return !!demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); |
| 221 } | 242 } |
| 222 | 243 |
| 223 bool MojoRenderer::HasVideo() { | 244 bool MojoRenderer::HasVideo() { |
| 224 DVLOG(1) << __FUNCTION__; | 245 DVLOG(1) << __FUNCTION__; |
| 225 DCHECK(task_runner_->BelongsToCurrentThread()); | 246 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 226 DCHECK(remote_renderer_.is_bound()); | 247 DCHECK(remote_renderer_.is_bound()); |
| 227 | 248 |
| 228 if (demuxer_stream_provider_->GetType() == DemuxerStreamProvider::Type::URL) { | 249 if (demuxer_stream_provider_->GetType() == DemuxerStreamProvider::Type::URL) { |
| 229 NOTIMPLEMENTED(); | 250 NOTIMPLEMENTED(); |
| 230 return false; | 251 return false; |
| 231 } | 252 } |
| 232 | 253 |
| 233 return !!demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | 254 return !!demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); |
| 234 } | 255 } |
| 235 | 256 |
| 236 void MojoRenderer::OnTimeUpdate(base::TimeDelta time, | 257 void MojoRenderer::OnTimeUpdate(base::TimeDelta time, |
| 237 base::TimeDelta max_time) { | 258 base::TimeDelta max_time, |
| 238 DVLOG(3) << __FUNCTION__ << ": " << time << ", " << max_time; | 259 base::TimeTicks capture_time) { |
| 260 DVLOG(4) << __FUNCTION__ << "(" << time << ", " << max_time << ", " | |
| 261 << capture_time << ")"; | |
| 239 DCHECK(task_runner_->BelongsToCurrentThread()); | 262 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 240 | 263 |
| 241 base::AutoLock auto_lock(lock_); | 264 base::AutoLock auto_lock(lock_); |
| 242 time_ = time; | 265 media_time_interpolator_.SetBounds(time, max_time, capture_time); |
| 243 } | 266 } |
| 244 | 267 |
| 245 void MojoRenderer::OnBufferingStateChange(mojom::BufferingState state) { | 268 void MojoRenderer::OnBufferingStateChange(mojom::BufferingState state) { |
| 246 DVLOG(2) << __FUNCTION__; | 269 DVLOG(2) << __FUNCTION__; |
| 247 DCHECK(task_runner_->BelongsToCurrentThread()); | 270 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 248 client_->OnBufferingStateChange(static_cast<media::BufferingState>(state)); | 271 client_->OnBufferingStateChange(static_cast<media::BufferingState>(state)); |
| 249 } | 272 } |
| 250 | 273 |
| 251 void MojoRenderer::OnEnded() { | 274 void MojoRenderer::OnEnded() { |
| 252 DVLOG(1) << __FUNCTION__; | 275 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); | 404 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED); |
| 382 | 405 |
| 383 if (!flush_cb_.is_null()) | 406 if (!flush_cb_.is_null()) |
| 384 base::ResetAndReturn(&flush_cb_).Run(); | 407 base::ResetAndReturn(&flush_cb_).Run(); |
| 385 | 408 |
| 386 if (!cdm_attached_cb_.is_null()) | 409 if (!cdm_attached_cb_.is_null()) |
| 387 base::ResetAndReturn(&cdm_attached_cb_).Run(false); | 410 base::ResetAndReturn(&cdm_attached_cb_).Run(false); |
| 388 } | 411 } |
| 389 | 412 |
| 390 } // namespace media | 413 } // namespace media |
| OLD | NEW |