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/video_decoder_config.h" | |
15 #include "media/base/video_renderer_sink.h" | |
14 #include "media/mojo/services/mojo_demuxer_stream_impl.h" | 16 #include "media/mojo/services/mojo_demuxer_stream_impl.h" |
17 #include "media/mojo/services/video_overlay_factory.h" | |
18 #include "mojo/converters/geometry/geometry_type_converters.h" | |
15 | 19 |
16 namespace media { | 20 namespace media { |
17 | 21 |
18 MojoRendererImpl::MojoRendererImpl( | 22 MojoRendererImpl::MojoRendererImpl( |
19 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 23 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
24 VideoRendererSink* video_renderer_sink, | |
25 GpuVideoAcceleratorFactories* gpu_factories, | |
20 interfaces::RendererPtr remote_renderer) | 26 interfaces::RendererPtr remote_renderer) |
21 : task_runner_(task_runner), | 27 : task_runner_(task_runner), |
28 video_renderer_sink_(video_renderer_sink), | |
29 gpu_factories_(gpu_factories), | |
22 remote_renderer_info_(remote_renderer.PassInterface()), | 30 remote_renderer_info_(remote_renderer.PassInterface()), |
23 binding_(this) { | 31 binding_(this) { |
24 DVLOG(1) << __FUNCTION__; | 32 DVLOG(1) << __FUNCTION__; |
25 } | 33 } |
26 | 34 |
27 MojoRendererImpl::~MojoRendererImpl() { | 35 MojoRendererImpl::~MojoRendererImpl() { |
28 DVLOG(1) << __FUNCTION__; | 36 DVLOG(1) << __FUNCTION__; |
29 DCHECK(task_runner_->BelongsToCurrentThread()); | 37 DCHECK(task_runner_->BelongsToCurrentThread()); |
30 } | 38 } |
31 | 39 |
32 // TODO(xhwang): Support |waiting_for_decryption_key_cb| and |statictics_cb|. | 40 // TODO(xhwang): Support |waiting_for_decryption_key_cb| and |statictics_cb|. |
33 // See http://crbug.com/585287 | 41 // See http://crbug.com/585287 |
34 void MojoRendererImpl::Initialize( | 42 void MojoRendererImpl::Initialize( |
35 DemuxerStreamProvider* demuxer_stream_provider, | 43 DemuxerStreamProvider* demuxer_stream_provider, |
36 const PipelineStatusCB& init_cb, | 44 const PipelineStatusCB& init_cb, |
37 const StatisticsCB& /* statistics_cb */, | 45 const StatisticsCB& /* statistics_cb */, |
38 const BufferingStateCB& buffering_state_cb, | 46 const BufferingStateCB& buffering_state_cb, |
47 const NaturalSizeChangedCB& natural_size_changed_cb, | |
39 const base::Closure& ended_cb, | 48 const base::Closure& ended_cb, |
40 const PipelineStatusCB& error_cb, | 49 const PipelineStatusCB& error_cb, |
41 const base::Closure& /* waiting_for_decryption_key_cb */) { | 50 const base::Closure& /* waiting_for_decryption_key_cb */) { |
42 DVLOG(1) << __FUNCTION__; | 51 DVLOG(1) << __FUNCTION__; |
43 DCHECK(task_runner_->BelongsToCurrentThread()); | 52 DCHECK(task_runner_->BelongsToCurrentThread()); |
44 DCHECK(demuxer_stream_provider); | 53 DCHECK(demuxer_stream_provider); |
45 | 54 |
46 // Bind |remote_renderer_| to the |task_runner_|. | 55 // Bind |remote_renderer_| to the |task_runner_|. |
47 remote_renderer_.Bind(std::move(remote_renderer_info_)); | 56 remote_renderer_.Bind(std::move(remote_renderer_info_)); |
48 | 57 |
49 // If connection error has happened, fail immediately. | 58 // If connection error has happened, fail immediately. |
50 if (remote_renderer_.encountered_error()) { | 59 if (remote_renderer_.encountered_error()) { |
51 task_runner_->PostTask( | 60 task_runner_->PostTask( |
52 FROM_HERE, base::Bind(init_cb, PIPELINE_ERROR_INITIALIZATION_FAILED)); | 61 FROM_HERE, base::Bind(init_cb, PIPELINE_ERROR_INITIALIZATION_FAILED)); |
53 return; | 62 return; |
54 } | 63 } |
55 | 64 |
56 // Otherwise, set an error handler to catch the connection error. | 65 // Otherwise, set an error handler to catch the connection error. |
57 // Using base::Unretained(this) is safe because |this| owns | 66 // Using base::Unretained(this) is safe because |this| owns |
58 // |remote_renderer_|, and the error handler can't be invoked once | 67 // |remote_renderer_|, and the error handler can't be invoked once |
59 // |remote_renderer_| is destroyed. | 68 // |remote_renderer_| is destroyed. |
60 remote_renderer_.set_connection_error_handler( | 69 remote_renderer_.set_connection_error_handler( |
61 base::Bind(&MojoRendererImpl::OnConnectionError, base::Unretained(this))); | 70 base::Bind(&MojoRendererImpl::OnConnectionError, base::Unretained(this))); |
62 | 71 |
63 demuxer_stream_provider_ = demuxer_stream_provider; | 72 demuxer_stream_provider_ = demuxer_stream_provider; |
64 init_cb_ = init_cb; | 73 init_cb_ = init_cb; |
65 buffering_state_cb_ = buffering_state_cb; | 74 buffering_state_cb_ = buffering_state_cb; |
75 natural_size_changed_cb_ = natural_size_changed_cb; | |
66 ended_cb_ = ended_cb; | 76 ended_cb_ = ended_cb; |
67 error_cb_ = error_cb; | 77 error_cb_ = error_cb; |
68 | 78 |
69 // Create audio and video interfaces::DemuxerStream and bind its lifetime to | 79 // Create audio and video interfaces::DemuxerStream and bind its lifetime to |
70 // the pipe. | 80 // the pipe. |
71 DemuxerStream* const audio = | 81 DemuxerStream* const audio = |
72 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); | 82 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); |
73 DemuxerStream* const video = | 83 DemuxerStream* const video = |
74 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | 84 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); |
75 | 85 |
76 interfaces::DemuxerStreamPtr audio_stream; | 86 interfaces::DemuxerStreamPtr audio_stream; |
77 if (audio) | 87 if (audio) |
78 new MojoDemuxerStreamImpl(audio, GetProxy(&audio_stream)); | 88 new MojoDemuxerStreamImpl(audio, GetProxy(&audio_stream)); |
79 | 89 |
80 interfaces::DemuxerStreamPtr video_stream; | 90 interfaces::DemuxerStreamPtr video_stream; |
81 if (video) | 91 if (video) { |
82 new MojoDemuxerStreamImpl(video, GetProxy(&video_stream)); | 92 new MojoDemuxerStreamImpl(video, GetProxy(&video_stream)); |
93 video_overlay_factory_.reset(new VideoOverlayFactory(gpu_factories_)); | |
94 } | |
83 | 95 |
84 // Using base::Unretained(this) is safe because |this| owns | 96 // Using base::Unretained(this) is safe because |this| owns |
85 // |remote_renderer_|, and the callback won't be dispatched if | 97 // |remote_renderer_|, and the callback won't be dispatched if |
86 // |remote_renderer_| is destroyed. | 98 // |remote_renderer_| is destroyed. |
87 remote_renderer_->Initialize( | 99 remote_renderer_->Initialize( |
88 binding_.CreateInterfacePtrAndBind(), std::move(audio_stream), | 100 binding_.CreateInterfacePtrAndBind(), std::move(audio_stream), |
89 std::move(video_stream), | 101 std::move(video_stream), |
90 base::Bind(&MojoRendererImpl::OnInitialized, base::Unretained(this))); | 102 base::Bind(&MojoRendererImpl::OnInitialized, base::Unretained(this))); |
91 } | 103 } |
92 | 104 |
(...skipping 16 matching lines...) Expand all Loading... | |
109 void MojoRendererImpl::Flush(const base::Closure& flush_cb) { | 121 void MojoRendererImpl::Flush(const base::Closure& flush_cb) { |
110 DVLOG(2) << __FUNCTION__; | 122 DVLOG(2) << __FUNCTION__; |
111 DCHECK(task_runner_->BelongsToCurrentThread()); | 123 DCHECK(task_runner_->BelongsToCurrentThread()); |
112 remote_renderer_->Flush(flush_cb); | 124 remote_renderer_->Flush(flush_cb); |
113 } | 125 } |
114 | 126 |
115 void MojoRendererImpl::StartPlayingFrom(base::TimeDelta time) { | 127 void MojoRendererImpl::StartPlayingFrom(base::TimeDelta time) { |
116 DVLOG(2) << __FUNCTION__; | 128 DVLOG(2) << __FUNCTION__; |
117 DCHECK(task_runner_->BelongsToCurrentThread()); | 129 DCHECK(task_runner_->BelongsToCurrentThread()); |
118 | 130 |
131 if (HasVideo()) { | |
132 DCHECK(video_overlay_factory_); | |
133 DCHECK(video_renderer_sink_); | |
134 DemuxerStream* video_stream = | |
135 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | |
136 video_renderer_sink_->PaintFrameUsingOldRenderingPath( | |
xhwang
2016/04/12 19:40:37
We have a comment that PaintFrameUsingOldRendering
| |
137 video_overlay_factory_->CreateFrame( | |
138 video_stream->video_decoder_config().natural_size())); | |
139 } | |
140 | |
119 { | 141 { |
120 base::AutoLock auto_lock(lock_); | 142 base::AutoLock auto_lock(lock_); |
121 time_ = time; | 143 time_ = time; |
122 } | 144 } |
123 | |
124 remote_renderer_->StartPlayingFrom(time.InMicroseconds()); | 145 remote_renderer_->StartPlayingFrom(time.InMicroseconds()); |
125 } | 146 } |
126 | 147 |
127 void MojoRendererImpl::SetPlaybackRate(double playback_rate) { | 148 void MojoRendererImpl::SetPlaybackRate(double playback_rate) { |
128 DVLOG(2) << __FUNCTION__; | 149 DVLOG(2) << __FUNCTION__; |
129 DCHECK(task_runner_->BelongsToCurrentThread()); | 150 DCHECK(task_runner_->BelongsToCurrentThread()); |
130 remote_renderer_->SetPlaybackRate(playback_rate); | 151 remote_renderer_->SetPlaybackRate(playback_rate); |
131 } | 152 } |
132 | 153 |
133 void MojoRendererImpl::SetVolume(float volume) { | 154 void MojoRendererImpl::SetVolume(float volume) { |
(...skipping 29 matching lines...) Expand all Loading... | |
163 time_ = base::TimeDelta::FromMicroseconds(time_usec); | 184 time_ = base::TimeDelta::FromMicroseconds(time_usec); |
164 } | 185 } |
165 | 186 |
166 void MojoRendererImpl::OnBufferingStateChange( | 187 void MojoRendererImpl::OnBufferingStateChange( |
167 interfaces::BufferingState state) { | 188 interfaces::BufferingState state) { |
168 DVLOG(2) << __FUNCTION__; | 189 DVLOG(2) << __FUNCTION__; |
169 DCHECK(task_runner_->BelongsToCurrentThread()); | 190 DCHECK(task_runner_->BelongsToCurrentThread()); |
170 buffering_state_cb_.Run(static_cast<media::BufferingState>(state)); | 191 buffering_state_cb_.Run(static_cast<media::BufferingState>(state)); |
171 } | 192 } |
172 | 193 |
194 void MojoRendererImpl::OnNaturalSizeChanged(mojo::SizePtr size) { | |
195 DVLOG(2) << __FUNCTION__; | |
196 DCHECK(task_runner_->BelongsToCurrentThread()); | |
197 natural_size_changed_cb_.Run(size.To<gfx::Size>()); | |
198 } | |
199 | |
173 void MojoRendererImpl::OnEnded() { | 200 void MojoRendererImpl::OnEnded() { |
174 DVLOG(1) << __FUNCTION__; | 201 DVLOG(1) << __FUNCTION__; |
175 DCHECK(task_runner_->BelongsToCurrentThread()); | 202 DCHECK(task_runner_->BelongsToCurrentThread()); |
176 ended_cb_.Run(); | 203 ended_cb_.Run(); |
177 } | 204 } |
178 | 205 |
179 void MojoRendererImpl::OnError() { | 206 void MojoRendererImpl::OnError() { |
180 DVLOG(1) << __FUNCTION__; | 207 DVLOG(1) << __FUNCTION__; |
181 DCHECK(task_runner_->BelongsToCurrentThread()); | 208 DCHECK(task_runner_->BelongsToCurrentThread()); |
182 DCHECK(init_cb_.is_null()); | 209 DCHECK(init_cb_.is_null()); |
(...skipping 18 matching lines...) Expand all Loading... | |
201 void MojoRendererImpl::OnInitialized(bool success) { | 228 void MojoRendererImpl::OnInitialized(bool success) { |
202 DVLOG(1) << __FUNCTION__; | 229 DVLOG(1) << __FUNCTION__; |
203 DCHECK(task_runner_->BelongsToCurrentThread()); | 230 DCHECK(task_runner_->BelongsToCurrentThread()); |
204 DCHECK(!init_cb_.is_null()); | 231 DCHECK(!init_cb_.is_null()); |
205 | 232 |
206 base::ResetAndReturn(&init_cb_) | 233 base::ResetAndReturn(&init_cb_) |
207 .Run(success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED); | 234 .Run(success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED); |
208 } | 235 } |
209 | 236 |
210 } // namespace media | 237 } // namespace media |
OLD | NEW |