| 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/services/mojo_renderer_impl.h" | 5 #include "media/mojo/services/mojo_renderer_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| 11 #include "media/base/bind_to_current_loop.h" | 11 #include "media/base/bind_to_current_loop.h" |
| 12 #include "media/base/demuxer_stream_provider.h" | 12 #include "media/base/demuxer_stream_provider.h" |
| 13 #include "media/mojo/services/mojo_demuxer_stream_impl.h" | 13 #include "media/mojo/services/mojo_demuxer_stream_impl.h" |
| 14 #include "mojo/public/cpp/application/connect.h" | 14 #include "mojo/public/cpp/application/connect.h" |
| 15 #include "mojo/public/cpp/bindings/interface_impl.h" | 15 #include "mojo/public/cpp/bindings/interface_impl.h" |
| 16 #include "mojo/public/interfaces/application/service_provider.mojom.h" | 16 #include "mojo/public/interfaces/application/service_provider.mojom.h" |
| 17 | 17 |
| 18 namespace media { | 18 namespace media { |
| 19 | 19 |
| 20 MojoRendererImpl::MojoRendererImpl( | 20 MojoRendererImpl::MojoRendererImpl( |
| 21 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 21 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 22 mojo::ServiceProvider* audio_renderer_provider) | 22 mojo::ServiceProvider* media_renderer_provider) |
| 23 : task_runner_(task_runner), | 23 : task_runner_(task_runner), |
| 24 weak_factory_(this) { | 24 weak_factory_(this) { |
| 25 DVLOG(1) << __FUNCTION__; | 25 DVLOG(1) << __FUNCTION__; |
| 26 // For now we only support audio and there must be a provider. | 26 DCHECK(media_renderer_provider); |
| 27 DCHECK(audio_renderer_provider); | 27 mojo::ConnectToService(media_renderer_provider, &remote_media_renderer_); |
| 28 mojo::ConnectToService(audio_renderer_provider, &remote_audio_renderer_); | 28 remote_media_renderer_.set_client(this); |
| 29 remote_audio_renderer_.set_client(this); | |
| 30 } | 29 } |
| 31 | 30 |
| 32 MojoRendererImpl::~MojoRendererImpl() { | 31 MojoRendererImpl::~MojoRendererImpl() { |
| 33 DVLOG(1) << __FUNCTION__; | 32 DVLOG(1) << __FUNCTION__; |
| 34 DCHECK(task_runner_->BelongsToCurrentThread()); | 33 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 35 // Connection to |remote_audio_renderer_| will error-out here. | 34 // Connection to |remote_media_renderer_| will error-out here. |
| 36 } | 35 } |
| 37 | 36 |
| 38 // TODO(xhwang): Support |paint_cb| if needed. | 37 // TODO(xhwang): Support |paint_cb| if needed. |
| 39 void MojoRendererImpl::Initialize( | 38 void MojoRendererImpl::Initialize( |
| 40 DemuxerStreamProvider* demuxer_stream_provider, | 39 DemuxerStreamProvider* demuxer_stream_provider, |
| 41 const base::Closure& init_cb, | 40 const base::Closure& init_cb, |
| 42 const StatisticsCB& statistics_cb, | 41 const StatisticsCB& statistics_cb, |
| 43 const BufferingStateCB& buffering_state_cb, | 42 const BufferingStateCB& buffering_state_cb, |
| 44 const PaintCB& /* paint_cb */, | 43 const PaintCB& /* paint_cb */, |
| 45 const base::Closure& ended_cb, | 44 const base::Closure& ended_cb, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 63 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | 62 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); |
| 64 | 63 |
| 65 mojo::DemuxerStreamPtr audio_stream; | 64 mojo::DemuxerStreamPtr audio_stream; |
| 66 if (audio) | 65 if (audio) |
| 67 mojo::BindToProxy(new MojoDemuxerStreamImpl(audio), &audio_stream); | 66 mojo::BindToProxy(new MojoDemuxerStreamImpl(audio), &audio_stream); |
| 68 | 67 |
| 69 mojo::DemuxerStreamPtr video_stream; | 68 mojo::DemuxerStreamPtr video_stream; |
| 70 if (video) | 69 if (video) |
| 71 mojo::BindToProxy(new MojoDemuxerStreamImpl(video), &video_stream); | 70 mojo::BindToProxy(new MojoDemuxerStreamImpl(video), &video_stream); |
| 72 | 71 |
| 73 remote_audio_renderer_->Initialize( | 72 remote_media_renderer_->Initialize( |
| 74 audio_stream.Pass(), | 73 audio_stream.Pass(), |
| 75 video_stream.Pass(), | 74 video_stream.Pass(), |
| 76 BindToCurrentLoop(base::Bind(&MojoRendererImpl::OnInitialized, | 75 BindToCurrentLoop(base::Bind(&MojoRendererImpl::OnInitialized, |
| 77 weak_factory_.GetWeakPtr()))); | 76 weak_factory_.GetWeakPtr()))); |
| 78 } | 77 } |
| 79 | 78 |
| 80 void MojoRendererImpl::Flush(const base::Closure& flush_cb) { | 79 void MojoRendererImpl::Flush(const base::Closure& flush_cb) { |
| 81 DVLOG(2) << __FUNCTION__; | 80 DVLOG(2) << __FUNCTION__; |
| 82 DCHECK(task_runner_->BelongsToCurrentThread()); | 81 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 83 remote_audio_renderer_->Flush(flush_cb); | 82 remote_media_renderer_->Flush(flush_cb); |
| 84 } | 83 } |
| 85 | 84 |
| 86 void MojoRendererImpl::StartPlayingFrom(base::TimeDelta time) { | 85 void MojoRendererImpl::StartPlayingFrom(base::TimeDelta time) { |
| 87 DVLOG(2) << __FUNCTION__; | 86 DVLOG(2) << __FUNCTION__; |
| 88 DCHECK(task_runner_->BelongsToCurrentThread()); | 87 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 89 | 88 |
| 90 { | 89 { |
| 91 base::AutoLock auto_lock(lock_); | 90 base::AutoLock auto_lock(lock_); |
| 92 time_ = time; | 91 time_ = time; |
| 93 } | 92 } |
| 94 | 93 |
| 95 remote_audio_renderer_->StartPlayingFrom(time.InMicroseconds()); | 94 remote_media_renderer_->StartPlayingFrom(time.InMicroseconds()); |
| 96 } | 95 } |
| 97 | 96 |
| 98 void MojoRendererImpl::SetPlaybackRate(float playback_rate) { | 97 void MojoRendererImpl::SetPlaybackRate(float playback_rate) { |
| 99 DVLOG(2) << __FUNCTION__; | 98 DVLOG(2) << __FUNCTION__; |
| 100 DCHECK(task_runner_->BelongsToCurrentThread()); | 99 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 101 remote_audio_renderer_->SetPlaybackRate(playback_rate); | 100 remote_media_renderer_->SetPlaybackRate(playback_rate); |
| 102 } | 101 } |
| 103 | 102 |
| 104 void MojoRendererImpl::SetVolume(float volume) { | 103 void MojoRendererImpl::SetVolume(float volume) { |
| 105 DVLOG(2) << __FUNCTION__; | 104 DVLOG(2) << __FUNCTION__; |
| 106 DCHECK(task_runner_->BelongsToCurrentThread()); | 105 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 107 remote_audio_renderer_->SetVolume(volume); | 106 remote_media_renderer_->SetVolume(volume); |
| 108 } | 107 } |
| 109 | 108 |
| 110 base::TimeDelta MojoRendererImpl::GetMediaTime() { | 109 base::TimeDelta MojoRendererImpl::GetMediaTime() { |
| 111 base::AutoLock auto_lock(lock_); | 110 base::AutoLock auto_lock(lock_); |
| 112 DVLOG(3) << __FUNCTION__ << ": " << time_.InMilliseconds() << " ms"; | 111 DVLOG(3) << __FUNCTION__ << ": " << time_.InMilliseconds() << " ms"; |
| 113 return time_; | 112 return time_; |
| 114 } | 113 } |
| 115 | 114 |
| 116 bool MojoRendererImpl::HasAudio() { | 115 bool MojoRendererImpl::HasAudio() { |
| 117 DVLOG(1) << __FUNCTION__; | 116 DVLOG(1) << __FUNCTION__; |
| 118 DCHECK(task_runner_->BelongsToCurrentThread()); | 117 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 119 DCHECK(remote_audio_renderer_.get()); // We always bind the renderer. | 118 DCHECK(remote_media_renderer_.get()); // We always bind the renderer. |
| 120 return !!demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); | 119 return !!demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); |
| 121 } | 120 } |
| 122 | 121 |
| 123 bool MojoRendererImpl::HasVideo() { | 122 bool MojoRendererImpl::HasVideo() { |
| 124 DVLOG(1) << __FUNCTION__; | 123 DVLOG(1) << __FUNCTION__; |
| 125 DCHECK(task_runner_->BelongsToCurrentThread()); | 124 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 126 return !!demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | 125 return !!demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); |
| 127 } | 126 } |
| 128 | 127 |
| 129 void MojoRendererImpl::SetCdm(MediaKeys* cdm) { | 128 void MojoRendererImpl::SetCdm(MediaKeys* cdm) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 | 195 |
| 197 void MojoRendererImpl::OnInitialized() { | 196 void MojoRendererImpl::OnInitialized() { |
| 198 DVLOG(1) << __FUNCTION__; | 197 DVLOG(1) << __FUNCTION__; |
| 199 DCHECK(task_runner_->BelongsToCurrentThread()); | 198 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 200 DCHECK(!init_cb_.is_null()); | 199 DCHECK(!init_cb_.is_null()); |
| 201 | 200 |
| 202 base::ResetAndReturn(&init_cb_).Run(); | 201 base::ResetAndReturn(&init_cb_).Run(); |
| 203 } | 202 } |
| 204 | 203 |
| 205 } // namespace media | 204 } // namespace media |
| OLD | NEW |