Chromium Code Reviews| Index: media/mojo/services/mojo_renderer_impl.cc |
| diff --git a/media/mojo/services/mojo_renderer_impl.cc b/media/mojo/services/mojo_renderer_impl.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..265a4afd67489bd05c6d49dd29523e6d927f5eaa |
| --- /dev/null |
| +++ b/media/mojo/services/mojo_renderer_impl.cc |
| @@ -0,0 +1,119 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "media/mojo/services/mojo_renderer_impl.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/single_thread_task_runner.h" |
| +#include "media/base/demuxer.h" |
| +#include "media/mojo/services/mojo_demuxer_stream_impl.h" |
| +#include "mojo/public/cpp/application/connect.h" |
| +#include "mojo/public/cpp/bindings/interface_impl.h" |
| +#include "mojo/public/interfaces/application/service_provider.mojom.h" |
| + |
| +namespace media { |
| + |
| +MojoRendererImpl::MojoRendererImpl( |
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| + Demuxer* demuxer, |
| + mojo::ServiceProvider* audio_renderer_provider) |
| + : task_runner_(task_runner), |
| + demuxer_(demuxer), |
| + weak_factory_(this) { |
| + // For now we only support audio and there must be a provider. |
| + DCHECK(audio_renderer_provider); |
|
scherkus (not reviewing)
2014/09/09 20:35:32
would the next line crash if this was NULL?
if so
tim (not reviewing)
2014/09/10 23:08:30
I mean, it's not clear right, which is why I left
|
| + mojo::ConnectToService(audio_renderer_provider, &remote_audio_renderer_); |
| + remote_audio_renderer_.set_client(this); |
| +} |
| + |
| +MojoRendererImpl::~MojoRendererImpl() { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + // Connection to |remote_audio_renderer_| will error-out here. |
| +} |
| + |
| +void MojoRendererImpl::Initialize( |
| + const base::Closure& init_cb, |
| + const StatisticsCB& statistics_cb, |
| + const base::Closure& ended_cb, |
| + const PipelineStatusCB& error_cb, |
| + const BufferingStateCB& buffering_state_cb, |
| + const TimeDeltaCB& get_duration_cb) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + ended_cb_ = ended_cb; |
| + error_cb_ = error_cb; |
| + buffering_state_cb_ = buffering_state_cb; |
| + |
| + // Create a mojo::DemuxerStream and bind its lifetime to the pipe. |
| + mojo::DemuxerStreamPtr dx_ptr; |
|
xhwang
2014/09/10 00:00:52
s/dx/demuxer_stream/
tim (not reviewing)
2014/09/10 23:08:30
Done.
|
| + mojo::BindToProxy(new MojoDemuxerStreamImpl( |
| + demuxer_->GetStream(DemuxerStream::AUDIO)), &dx_ptr); |
| + remote_audio_renderer_->Initialize(dx_ptr.Pass(), init_cb); |
| +} |
| + |
| +void MojoRendererImpl::Flush(const base::Closure& flush_cb) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + remote_audio_renderer_->Flush(flush_cb); |
| +} |
| + |
| +void MojoRendererImpl::StartPlayingFrom(base::TimeDelta time) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + remote_audio_renderer_->StartPlayingFrom(time.ToInternalValue()); |
|
xhwang
2014/09/10 00:00:52
ToMicroseconds()?
tim (not reviewing)
2014/09/10 23:08:30
Done.
|
| +} |
| + |
| +void MojoRendererImpl::SetPlaybackRate(float playback_rate) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + remote_audio_renderer_->SetPlaybackRate(playback_rate); |
| +} |
| + |
| +void MojoRendererImpl::SetVolume(float volume) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + remote_audio_renderer_->SetVolume(volume); |
| +} |
| + |
| +base::TimeDelta MojoRendererImpl::GetMediaTime() { |
| + NOTIMPLEMENTED(); |
| + return base::TimeDelta(); |
| +} |
| + |
| +bool MojoRendererImpl::HasAudio() { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(remote_audio_renderer_.get()); // We always bind the renderer. |
|
scherkus (not reviewing)
2014/09/09 20:35:32
hrmm... will Has{Audio,Video}() eventually be meth
tim (not reviewing)
2014/09/10 23:08:29
I haven't really thought this through tbh; I was m
scherkus (not reviewing)
2014/09/12 19:14:41
We can iterate in future CLs, but in general I wou
|
| + return true; |
| +} |
| + |
| +bool MojoRendererImpl::HasVideo() { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + return false; |
| +} |
| + |
| +void MojoRendererImpl::SetCdm(MediaKeys* cdm) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +void MojoRendererImpl::OnTimeUpdate(int64_t time_usec, |
| + int64_t max_time_usec) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +void MojoRendererImpl::OnBufferingStateChange( |
| + mojo::BufferingState state) { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + buffering_state_cb_.Run( |
| + static_cast<media::BufferingState>(state)); |
| +} |
| + |
| +void MojoRendererImpl::OnEnded() { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + ended_cb_.Run(); |
| +} |
| + |
| +void MojoRendererImpl::OnError() { |
| + DCHECK(task_runner_->BelongsToCurrentThread()); |
| + // TODO(tim): Should we have OnDecodeError and OnRenderError? |
|
scherkus (not reviewing)
2014/09/09 20:35:32
I believe one day we'd want the remote mojo::Media
tim (not reviewing)
2014/09/10 23:08:30
Done. Thanks for the pointer.
|
| + error_cb_.Run(PIPELINE_ERROR_COULD_NOT_RENDER); |
| +} |
| + |
| +} // namespace media |