OLD | NEW |
---|---|
(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 | |
OLD | NEW |