Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: media/mojo/services/mojo_renderer_impl.cc

Issue 551963004: media: scaffolding and plumbing for MojoRenderer{Impl, Service} (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "media/mojo/services/mojo_renderer_impl.h"
6
7 #include "base/bind.h"
8 #include "base/single_thread_task_runner.h"
9 #include "media/base/demuxer.h"
10 #include "media/mojo/services/mojo_demuxer_stream_impl.h"
11 #include "mojo/public/cpp/application/connect.h"
12 #include "mojo/public/cpp/bindings/interface_impl.h"
13 #include "mojo/public/interfaces/application/service_provider.mojom.h"
14
15 namespace media {
16
17 MojoRendererImpl::MojoRendererImpl(
18 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
19 Demuxer* demuxer,
20 mojo::ServiceProvider* audio_renderer_provider)
21 : task_runner_(task_runner),
22 demuxer_(demuxer),
23 weak_factory_(this) {
24 // For now we only support audio and there must be a provider.
25 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
26 mojo::ConnectToService(audio_renderer_provider, &remote_audio_renderer_);
27 remote_audio_renderer_.set_client(this);
28 }
29
30 MojoRendererImpl::~MojoRendererImpl() {
31 DCHECK(task_runner_->BelongsToCurrentThread());
32 // Connection to |remote_audio_renderer_| will error-out here.
33 }
34
35 void MojoRendererImpl::Initialize(
36 const base::Closure& init_cb,
37 const StatisticsCB& statistics_cb,
38 const base::Closure& ended_cb,
39 const PipelineStatusCB& error_cb,
40 const BufferingStateCB& buffering_state_cb,
41 const TimeDeltaCB& get_duration_cb) {
42 DCHECK(task_runner_->BelongsToCurrentThread());
43 ended_cb_ = ended_cb;
44 error_cb_ = error_cb;
45 buffering_state_cb_ = buffering_state_cb;
46
47 // Create a mojo::DemuxerStream and bind its lifetime to the pipe.
48 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.
49 mojo::BindToProxy(new MojoDemuxerStreamImpl(
50 demuxer_->GetStream(DemuxerStream::AUDIO)), &dx_ptr);
51 remote_audio_renderer_->Initialize(dx_ptr.Pass(), init_cb);
52 }
53
54 void MojoRendererImpl::Flush(const base::Closure& flush_cb) {
55 DCHECK(task_runner_->BelongsToCurrentThread());
56 remote_audio_renderer_->Flush(flush_cb);
57 }
58
59 void MojoRendererImpl::StartPlayingFrom(base::TimeDelta time) {
60 DCHECK(task_runner_->BelongsToCurrentThread());
61 remote_audio_renderer_->StartPlayingFrom(time.ToInternalValue());
xhwang 2014/09/10 00:00:52 ToMicroseconds()?
tim (not reviewing) 2014/09/10 23:08:30 Done.
62 }
63
64 void MojoRendererImpl::SetPlaybackRate(float playback_rate) {
65 DCHECK(task_runner_->BelongsToCurrentThread());
66 remote_audio_renderer_->SetPlaybackRate(playback_rate);
67 }
68
69 void MojoRendererImpl::SetVolume(float volume) {
70 DCHECK(task_runner_->BelongsToCurrentThread());
71 remote_audio_renderer_->SetVolume(volume);
72 }
73
74 base::TimeDelta MojoRendererImpl::GetMediaTime() {
75 NOTIMPLEMENTED();
76 return base::TimeDelta();
77 }
78
79 bool MojoRendererImpl::HasAudio() {
80 DCHECK(task_runner_->BelongsToCurrentThread());
81 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
82 return true;
83 }
84
85 bool MojoRendererImpl::HasVideo() {
86 DCHECK(task_runner_->BelongsToCurrentThread());
87 return false;
88 }
89
90 void MojoRendererImpl::SetCdm(MediaKeys* cdm) {
91 DCHECK(task_runner_->BelongsToCurrentThread());
92 NOTIMPLEMENTED();
93 }
94
95 void MojoRendererImpl::OnTimeUpdate(int64_t time_usec,
96 int64_t max_time_usec) {
97 DCHECK(task_runner_->BelongsToCurrentThread());
98 NOTIMPLEMENTED();
99 }
100
101 void MojoRendererImpl::OnBufferingStateChange(
102 mojo::BufferingState state) {
103 DCHECK(task_runner_->BelongsToCurrentThread());
104 buffering_state_cb_.Run(
105 static_cast<media::BufferingState>(state));
106 }
107
108 void MojoRendererImpl::OnEnded() {
109 DCHECK(task_runner_->BelongsToCurrentThread());
110 ended_cb_.Run();
111 }
112
113 void MojoRendererImpl::OnError() {
114 DCHECK(task_runner_->BelongsToCurrentThread());
115 // 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.
116 error_cb_.Run(PIPELINE_ERROR_COULD_NOT_RENDER);
117 }
118
119 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698