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

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

Issue 2075303002: [DO NOT COMMIT] Initial MediaPlayerRenderer plumbing and basic features (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698