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/clients/mojo_renderer_impl.h" | 5 #include "media/mojo/clients/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/base/renderer_client.h" |
15 #include "media/base/video_renderer_sink.h" | 15 #include "media/base/video_renderer_sink.h" |
| 16 #include "media/media_features.h" |
16 #include "media/mojo/clients/mojo_demuxer_stream_impl.h" | 17 #include "media/mojo/clients/mojo_demuxer_stream_impl.h" |
17 #include "media/renderers/video_overlay_factory.h" | 18 #include "media/renderers/video_overlay_factory.h" |
| 19 #include "mojo/common/url_type_converters.h" |
18 | 20 |
19 namespace media { | 21 namespace media { |
20 | 22 |
21 MojoRendererImpl::MojoRendererImpl( | 23 MojoRendererImpl::MojoRendererImpl( |
22 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 24 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
23 std::unique_ptr<VideoOverlayFactory> video_overlay_factory, | 25 std::unique_ptr<VideoOverlayFactory> video_overlay_factory, |
24 VideoRendererSink* video_renderer_sink, | 26 VideoRendererSink* video_renderer_sink, |
25 mojom::RendererPtr remote_renderer) | 27 mojom::RendererPtr remote_renderer) |
26 : task_runner_(task_runner), | 28 : task_runner_(task_runner), |
27 video_overlay_factory_(std::move(video_overlay_factory)), | 29 video_overlay_factory_(std::move(video_overlay_factory)), |
28 video_renderer_sink_(video_renderer_sink), | 30 video_renderer_sink_(video_renderer_sink), |
29 remote_renderer_info_(remote_renderer.PassInterface()), | 31 remote_renderer_info_(remote_renderer.PassInterface()), |
30 binding_(this) { | 32 binding_(this), |
| 33 surface_id_(-1) { |
31 DVLOG(1) << __FUNCTION__; | 34 DVLOG(1) << __FUNCTION__; |
32 } | 35 } |
33 | 36 |
34 MojoRendererImpl::~MojoRendererImpl() { | 37 MojoRendererImpl::~MojoRendererImpl() { |
35 DVLOG(1) << __FUNCTION__; | 38 DVLOG(1) << __FUNCTION__; |
36 DCHECK(task_runner_->BelongsToCurrentThread()); | 39 DCHECK(task_runner_->BelongsToCurrentThread()); |
37 } | 40 } |
38 | 41 |
39 void MojoRendererImpl::Initialize( | 42 void MojoRendererImpl::Initialize( |
40 DemuxerStreamProvider* demuxer_stream_provider, | 43 DemuxerStreamProvider* demuxer_stream_provider, |
41 media::RendererClient* client, | 44 media::RendererClient* client, |
42 const PipelineStatusCB& init_cb) { | 45 const PipelineStatusCB& init_cb) { |
43 DVLOG(1) << __FUNCTION__; | 46 DVLOG(1) << __FUNCTION__; |
44 DCHECK(task_runner_->BelongsToCurrentThread()); | 47 DCHECK(task_runner_->BelongsToCurrentThread()); |
45 DCHECK(demuxer_stream_provider); | 48 DCHECK(demuxer_stream_provider); |
46 | 49 |
47 demuxer_stream_provider_ = demuxer_stream_provider; | 50 demuxer_stream_provider_ = demuxer_stream_provider; |
48 client_ = client; | 51 client_ = client; |
49 init_cb_ = init_cb; | 52 init_cb_ = init_cb; |
50 | 53 |
| 54 if (!request_surface_cb_.is_null()) { |
| 55 task_runner_->PostTask( |
| 56 FROM_HERE, base::Bind(request_surface_cb_, |
| 57 base::Bind(&MojoRendererImpl::OnSurfaceCreated, |
| 58 base::Unretained(this)))); |
| 59 } else { |
| 60 InitializeRenderer(); |
| 61 } |
| 62 } |
| 63 |
| 64 void MojoRendererImpl::InitializeRenderer() { |
| 65 DVLOG(1) << __FUNCTION__; |
| 66 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 67 |
51 // Create audio and video mojom::DemuxerStream and bind its lifetime to | 68 // Create audio and video mojom::DemuxerStream and bind its lifetime to |
52 // the pipe. | 69 // the pipe. |
53 DemuxerStream* const audio = | 70 DemuxerStream* const audio = |
54 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); | 71 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); |
55 DemuxerStream* const video = | 72 DemuxerStream* const video = |
56 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | 73 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); |
57 | 74 |
58 mojom::DemuxerStreamPtr audio_stream; | 75 mojom::DemuxerStreamPtr audio_stream; |
59 if (audio) | 76 if (audio) |
60 new MojoDemuxerStreamImpl(audio, GetProxy(&audio_stream)); | 77 new MojoDemuxerStreamImpl(audio, GetProxy(&audio_stream)); |
61 | 78 |
62 mojom::DemuxerStreamPtr video_stream; | 79 mojom::DemuxerStreamPtr video_stream; |
63 if (video) | 80 if (video) |
64 new MojoDemuxerStreamImpl(video, GetProxy(&video_stream)); | 81 new MojoDemuxerStreamImpl(video, GetProxy(&video_stream)); |
65 | 82 |
66 BindRemoteRendererIfNeeded(); | 83 BindRemoteRendererIfNeeded(); |
67 | 84 |
68 // Using base::Unretained(this) is safe because |this| owns | 85 // Using base::Unretained(this) is safe because |this| owns |
69 // |remote_renderer_|, and the callback won't be dispatched if | 86 // |remote_renderer_|, and the callback won't be dispatched if |
70 // |remote_renderer_| is destroyed. | 87 // |remote_renderer_| is destroyed. |
71 remote_renderer_->Initialize( | 88 remote_renderer_->Initialize( |
72 binding_.CreateInterfacePtrAndBind(), std::move(audio_stream), | 89 binding_.CreateInterfacePtrAndBind(), std::move(audio_stream), |
73 std::move(video_stream), | 90 std::move(video_stream), mojo::String::From(url_), surface_id_, |
74 base::Bind(&MojoRendererImpl::OnInitialized, base::Unretained(this))); | 91 base::Bind(&MojoRendererImpl::OnInitialized, base::Unretained(this))); |
75 } | 92 } |
76 | 93 |
| 94 void MojoRendererImpl::OnSurfaceCreated(int surface_id) { |
| 95 DVLOG(2) << __FUNCTION__; |
| 96 |
| 97 surface_id_ = surface_id; |
| 98 |
| 99 task_runner_->PostTask(FROM_HERE, |
| 100 base::Bind(&MojoRendererImpl::InitializeRenderer, |
| 101 base::Unretained(this))); |
| 102 } |
| 103 |
77 void MojoRendererImpl::SetCdm(CdmContext* cdm_context, | 104 void MojoRendererImpl::SetCdm(CdmContext* cdm_context, |
78 const CdmAttachedCB& cdm_attached_cb) { | 105 const CdmAttachedCB& cdm_attached_cb) { |
79 DVLOG(1) << __FUNCTION__; | 106 DVLOG(1) << __FUNCTION__; |
80 DCHECK(task_runner_->BelongsToCurrentThread()); | 107 DCHECK(task_runner_->BelongsToCurrentThread()); |
81 DCHECK(cdm_context); | 108 DCHECK(cdm_context); |
82 | 109 |
83 int32_t cdm_id = cdm_context->GetCdmId(); | 110 int32_t cdm_id = cdm_context->GetCdmId(); |
84 if (cdm_id == CdmContext::kInvalidCdmId) { | 111 if (cdm_id == CdmContext::kInvalidCdmId) { |
85 DVLOG(2) << "MojoRendererImpl only works with remote CDMs but the CDM ID " | 112 DVLOG(2) << "MojoRendererImpl only works with remote CDMs but the CDM ID " |
86 "is invalid."; | 113 "is invalid."; |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 | 199 |
173 // TODO(tim): Should we plumb error code from remote renderer? | 200 // TODO(tim): Should we plumb error code from remote renderer? |
174 // http://crbug.com/410451. | 201 // http://crbug.com/410451. |
175 client_->OnError(PIPELINE_ERROR_DECODE); | 202 client_->OnError(PIPELINE_ERROR_DECODE); |
176 } | 203 } |
177 | 204 |
178 void MojoRendererImpl::OnVideoNaturalSizeChange(const gfx::Size& size) { | 205 void MojoRendererImpl::OnVideoNaturalSizeChange(const gfx::Size& size) { |
179 DVLOG(2) << __FUNCTION__ << ": " << size.ToString(); | 206 DVLOG(2) << __FUNCTION__ << ": " << size.ToString(); |
180 DCHECK(task_runner_->BelongsToCurrentThread()); | 207 DCHECK(task_runner_->BelongsToCurrentThread()); |
181 | 208 |
| 209 #if !BUILDFLAG(FORCE_MOJO_MEDIA_PLAYER_RENDERER) |
| 210 // TODO(tguilbert): Investigate why this line crashes when using the |
| 211 // MediaPlayerRenderer. |
182 video_renderer_sink_->PaintSingleFrame( | 212 video_renderer_sink_->PaintSingleFrame( |
183 video_overlay_factory_->CreateFrame(size)); | 213 video_overlay_factory_->CreateFrame(size)); |
| 214 #endif |
| 215 |
184 client_->OnVideoNaturalSizeChange(size); | 216 client_->OnVideoNaturalSizeChange(size); |
185 } | 217 } |
186 | 218 |
| 219 void MojoRendererImpl::OnDurationChange(int64_t duration_usec) { |
| 220 DVLOG(2) << __FUNCTION__ << ": duration" << duration_usec; |
| 221 client_->OnDurationChange(base::TimeDelta::FromMicroseconds(duration_usec)); |
| 222 } |
| 223 |
187 void MojoRendererImpl::OnVideoOpacityChange(bool opaque) { | 224 void MojoRendererImpl::OnVideoOpacityChange(bool opaque) { |
188 DVLOG(2) << __FUNCTION__ << ": " << opaque; | 225 DVLOG(2) << __FUNCTION__ << ": " << opaque; |
189 DCHECK(task_runner_->BelongsToCurrentThread()); | 226 DCHECK(task_runner_->BelongsToCurrentThread()); |
190 client_->OnVideoOpacityChange(opaque); | 227 client_->OnVideoOpacityChange(opaque); |
191 } | 228 } |
192 | 229 |
193 void MojoRendererImpl::OnConnectionError() { | 230 void MojoRendererImpl::OnConnectionError() { |
194 DVLOG(1) << __FUNCTION__; | 231 DVLOG(1) << __FUNCTION__; |
195 DCHECK(task_runner_->BelongsToCurrentThread()); | 232 DCHECK(task_runner_->BelongsToCurrentThread()); |
196 | 233 |
(...skipping 26 matching lines...) Expand all Loading... |
223 | 260 |
224 void MojoRendererImpl::OnInitialized(bool success) { | 261 void MojoRendererImpl::OnInitialized(bool success) { |
225 DVLOG(1) << __FUNCTION__; | 262 DVLOG(1) << __FUNCTION__; |
226 DCHECK(task_runner_->BelongsToCurrentThread()); | 263 DCHECK(task_runner_->BelongsToCurrentThread()); |
227 DCHECK(!init_cb_.is_null()); | 264 DCHECK(!init_cb_.is_null()); |
228 | 265 |
229 base::ResetAndReturn(&init_cb_).Run( | 266 base::ResetAndReturn(&init_cb_).Run( |
230 success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED); | 267 success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED); |
231 } | 268 } |
232 | 269 |
| 270 #if defined(OS_ANDROID) |
| 271 void MojoRendererImpl::SetUrl(const GURL& url) { |
| 272 url_ = url; |
| 273 } |
| 274 |
| 275 void MojoRendererImpl::SetRequestSurfaceCB( |
| 276 const RequestSurfaceCB& request_surface_cb) { |
| 277 request_surface_cb_ = request_surface_cb; |
| 278 } |
| 279 #endif |
| 280 |
233 } // namespace media | 281 } // namespace media |
OLD | NEW |