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/services/mojo_renderer_impl.h" | 5 #include "media/mojo/services/mojo_renderer_impl.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" |
| 11 #include "base/location.h" | 11 #include "base/location.h" |
| 12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 13 #include "media/base/demuxer_stream_provider.h" | 13 #include "media/base/demuxer_stream_provider.h" |
| 14 #include "media/base/renderer_client.h" | |
| 14 #include "media/mojo/services/mojo_demuxer_stream_impl.h" | 15 #include "media/mojo/services/mojo_demuxer_stream_impl.h" |
| 15 | 16 |
| 16 namespace media { | 17 namespace media { |
| 17 | 18 |
| 18 MojoRendererImpl::MojoRendererImpl( | 19 MojoRendererImpl::MojoRendererImpl( |
| 19 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 20 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 20 interfaces::RendererPtr remote_renderer) | 21 interfaces::RendererPtr remote_renderer) |
| 21 : task_runner_(task_runner), | 22 : task_runner_(task_runner), |
| 22 remote_renderer_info_(remote_renderer.PassInterface()), | 23 remote_renderer_info_(remote_renderer.PassInterface()), |
| 23 binding_(this) { | 24 binding_(this) { |
| 24 DVLOG(1) << __FUNCTION__; | 25 DVLOG(1) << __FUNCTION__; |
| 25 } | 26 } |
| 26 | 27 |
| 27 MojoRendererImpl::~MojoRendererImpl() { | 28 MojoRendererImpl::~MojoRendererImpl() { |
| 28 DVLOG(1) << __FUNCTION__; | 29 DVLOG(1) << __FUNCTION__; |
| 29 DCHECK(task_runner_->BelongsToCurrentThread()); | 30 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 30 } | 31 } |
| 31 | 32 |
| 32 // TODO(xhwang): Support |waiting_for_decryption_key_cb| and |statictics_cb|. | 33 // TODO(xhwang): Support |waiting_for_decryption_key_cb| and |statictics_cb|. |
| 33 // See http://crbug.com/585287 | 34 // See http://crbug.com/585287 |
|
xhwang
2016/05/12 20:51:18
You can remove this now.
alokp
2016/05/12 21:46:50
Done.
| |
| 34 void MojoRendererImpl::Initialize( | 35 void MojoRendererImpl::Initialize( |
| 35 DemuxerStreamProvider* demuxer_stream_provider, | 36 DemuxerStreamProvider* demuxer_stream_provider, |
| 36 const PipelineStatusCB& init_cb, | 37 media::RendererClient* client, |
| 37 const StatisticsCB& /* statistics_cb */, | 38 const PipelineStatusCB& init_cb) { |
| 38 const BufferingStateCB& buffering_state_cb, | |
| 39 const base::Closure& ended_cb, | |
| 40 const PipelineStatusCB& error_cb, | |
| 41 const base::Closure& /* waiting_for_decryption_key_cb */) { | |
| 42 DVLOG(1) << __FUNCTION__; | 39 DVLOG(1) << __FUNCTION__; |
| 43 DCHECK(task_runner_->BelongsToCurrentThread()); | 40 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 44 DCHECK(demuxer_stream_provider); | 41 DCHECK(demuxer_stream_provider); |
| 45 | 42 |
| 46 // Bind |remote_renderer_| to the |task_runner_|. | 43 // Bind |remote_renderer_| to the |task_runner_|. |
| 47 remote_renderer_.Bind(std::move(remote_renderer_info_)); | 44 remote_renderer_.Bind(std::move(remote_renderer_info_)); |
| 48 | 45 |
| 49 // If connection error has happened, fail immediately. | 46 // If connection error has happened, fail immediately. |
| 50 if (remote_renderer_.encountered_error()) { | 47 if (remote_renderer_.encountered_error()) { |
| 51 task_runner_->PostTask( | 48 task_runner_->PostTask( |
| 52 FROM_HERE, base::Bind(init_cb, PIPELINE_ERROR_INITIALIZATION_FAILED)); | 49 FROM_HERE, base::Bind(init_cb, PIPELINE_ERROR_INITIALIZATION_FAILED)); |
| 53 return; | 50 return; |
| 54 } | 51 } |
| 55 | 52 |
| 56 // Otherwise, set an error handler to catch the connection error. | 53 // Otherwise, set an error handler to catch the connection error. |
| 57 // Using base::Unretained(this) is safe because |this| owns | 54 // Using base::Unretained(this) is safe because |this| owns |
| 58 // |remote_renderer_|, and the error handler can't be invoked once | 55 // |remote_renderer_|, and the error handler can't be invoked once |
| 59 // |remote_renderer_| is destroyed. | 56 // |remote_renderer_| is destroyed. |
| 60 remote_renderer_.set_connection_error_handler( | 57 remote_renderer_.set_connection_error_handler( |
| 61 base::Bind(&MojoRendererImpl::OnConnectionError, base::Unretained(this))); | 58 base::Bind(&MojoRendererImpl::OnConnectionError, base::Unretained(this))); |
| 62 | 59 |
| 63 demuxer_stream_provider_ = demuxer_stream_provider; | 60 demuxer_stream_provider_ = demuxer_stream_provider; |
| 61 client_ = client; | |
| 64 init_cb_ = init_cb; | 62 init_cb_ = init_cb; |
| 65 buffering_state_cb_ = buffering_state_cb; | |
| 66 ended_cb_ = ended_cb; | |
| 67 error_cb_ = error_cb; | |
| 68 | 63 |
| 69 // Create audio and video interfaces::DemuxerStream and bind its lifetime to | 64 // Create audio and video interfaces::DemuxerStream and bind its lifetime to |
| 70 // the pipe. | 65 // the pipe. |
| 71 DemuxerStream* const audio = | 66 DemuxerStream* const audio = |
| 72 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); | 67 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); |
| 73 DemuxerStream* const video = | 68 DemuxerStream* const video = |
| 74 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | 69 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); |
| 75 | 70 |
| 76 interfaces::DemuxerStreamPtr audio_stream; | 71 interfaces::DemuxerStreamPtr audio_stream; |
| 77 if (audio) | 72 if (audio) |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 DCHECK(task_runner_->BelongsToCurrentThread()); | 155 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 161 | 156 |
| 162 base::AutoLock auto_lock(lock_); | 157 base::AutoLock auto_lock(lock_); |
| 163 time_ = base::TimeDelta::FromMicroseconds(time_usec); | 158 time_ = base::TimeDelta::FromMicroseconds(time_usec); |
| 164 } | 159 } |
| 165 | 160 |
| 166 void MojoRendererImpl::OnBufferingStateChange( | 161 void MojoRendererImpl::OnBufferingStateChange( |
| 167 interfaces::BufferingState state) { | 162 interfaces::BufferingState state) { |
| 168 DVLOG(2) << __FUNCTION__; | 163 DVLOG(2) << __FUNCTION__; |
| 169 DCHECK(task_runner_->BelongsToCurrentThread()); | 164 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 170 buffering_state_cb_.Run(static_cast<media::BufferingState>(state)); | 165 client_->OnBufferingStateChange(static_cast<media::BufferingState>(state)); |
| 171 } | 166 } |
| 172 | 167 |
| 173 void MojoRendererImpl::OnEnded() { | 168 void MojoRendererImpl::OnEnded() { |
| 174 DVLOG(1) << __FUNCTION__; | 169 DVLOG(1) << __FUNCTION__; |
| 175 DCHECK(task_runner_->BelongsToCurrentThread()); | 170 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 176 ended_cb_.Run(); | 171 client_->OnEnded(); |
| 177 } | 172 } |
| 178 | 173 |
| 179 void MojoRendererImpl::OnError() { | 174 void MojoRendererImpl::OnError() { |
| 180 DVLOG(1) << __FUNCTION__; | 175 DVLOG(1) << __FUNCTION__; |
| 181 DCHECK(task_runner_->BelongsToCurrentThread()); | 176 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 182 DCHECK(init_cb_.is_null()); | 177 DCHECK(init_cb_.is_null()); |
| 183 | 178 |
| 184 // TODO(tim): Should we plumb error code from remote renderer? | 179 // TODO(tim): Should we plumb error code from remote renderer? |
| 185 // http://crbug.com/410451. | 180 // http://crbug.com/410451. |
| 186 error_cb_.Run(PIPELINE_ERROR_DECODE); | 181 client_->OnError(PIPELINE_ERROR_DECODE); |
| 187 } | 182 } |
| 188 | 183 |
| 189 void MojoRendererImpl::OnConnectionError() { | 184 void MojoRendererImpl::OnConnectionError() { |
| 190 DVLOG(1) << __FUNCTION__; | 185 DVLOG(1) << __FUNCTION__; |
| 191 DCHECK(task_runner_->BelongsToCurrentThread()); | 186 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 192 | 187 |
| 193 if (!init_cb_.is_null()) { | 188 if (!init_cb_.is_null()) { |
| 194 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED); | 189 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED); |
| 195 return; | 190 return; |
| 196 } | 191 } |
| 197 | 192 |
| 198 error_cb_.Run(PIPELINE_ERROR_DECODE); | 193 client_->OnError(PIPELINE_ERROR_DECODE); |
| 199 } | 194 } |
| 200 | 195 |
| 201 void MojoRendererImpl::OnInitialized(bool success) { | 196 void MojoRendererImpl::OnInitialized(bool success) { |
| 202 DVLOG(1) << __FUNCTION__; | 197 DVLOG(1) << __FUNCTION__; |
| 203 DCHECK(task_runner_->BelongsToCurrentThread()); | 198 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 204 DCHECK(!init_cb_.is_null()); | 199 DCHECK(!init_cb_.is_null()); |
| 205 | 200 |
| 206 base::ResetAndReturn(&init_cb_) | 201 base::ResetAndReturn(&init_cb_) |
| 207 .Run(success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED); | 202 .Run(success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED); |
| 208 } | 203 } |
| 209 | 204 |
| 210 } // namespace media | 205 } // namespace media |
| OLD | NEW |