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 |