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

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

Issue 2643743002: Mojify demuxers and allow running {Chunk/FFmpeg}Demuxer in a Utility Process (Closed)
Patch Set: Rebase and make sure to unbind mojom::DemuxerPtr on the bound thread during termination Created 3 years, 10 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/services/mojo_renderer_service.h" 5 #include "media/mojo/services/mojo_renderer_service.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/optional.h" 11 #include "base/optional.h"
12 #include "media/base/audio_renderer_sink.h" 12 #include "media/base/audio_renderer_sink.h"
13 #include "media/base/bind_to_current_loop.h"
13 #include "media/base/content_decryption_module.h" 14 #include "media/base/content_decryption_module.h"
15 #include "media/base/media_log.h"
14 #include "media/base/media_url_demuxer.h" 16 #include "media/base/media_url_demuxer.h"
15 #include "media/base/renderer.h" 17 #include "media/base/renderer.h"
16 #include "media/base/video_renderer_sink.h" 18 #include "media/base/video_renderer_sink.h"
17 #include "media/mojo/services/media_resource_shim.h" 19 #include "media/mojo/services/media_resource_shim.h"
18 #include "media/mojo/services/mojo_audio_renderer_sink_adapter.h" 20 #include "media/mojo/services/mojo_audio_renderer_sink_adapter.h"
19 #include "media/mojo/services/mojo_cdm_service_context.h" 21 #include "media/mojo/services/mojo_cdm_service_context.h"
22 #include "media/mojo/services/mojo_demuxer_service_context.h"
20 #include "media/mojo/services/mojo_video_renderer_sink_adapter.h" 23 #include "media/mojo/services/mojo_video_renderer_sink_adapter.h"
21 24
22 namespace media { 25 namespace media {
23 26
24 namespace { 27 namespace {
25 28
26 void CloseBindingOnBadMessage(mojo::StrongBindingPtr<mojom::Renderer> binding) { 29 void CloseBindingOnBadMessage(mojo::StrongBindingPtr<mojom::Renderer> binding) {
27 LOG(ERROR) << __func__; 30 LOG(ERROR) << __func__;
28 DCHECK(binding); 31 DCHECK(binding);
29 binding->Close(); 32 binding->Close();
30 } 33 }
31 34
32 } // namespace 35 } // namespace
33 36
34 // Time interval to update media time. 37 // Time interval to update media time.
35 const int kTimeUpdateIntervalMs = 50; 38 const int kTimeUpdateIntervalMs = 50;
36 39
37 // static 40 // static
38 mojo::StrongBindingPtr<mojom::Renderer> MojoRendererService::Create( 41 mojo::StrongBindingPtr<mojom::Renderer> MojoRendererService::Create(
42 base::WeakPtr<MojoDemuxerServiceContext> mojo_demuxer_service_context,
39 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, 43 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context,
40 scoped_refptr<AudioRendererSink> audio_sink, 44 scoped_refptr<AudioRendererSink> audio_sink,
41 std::unique_ptr<VideoRendererSink> video_sink, 45 std::unique_ptr<VideoRendererSink> video_sink,
42 std::unique_ptr<media::Renderer> renderer, 46 std::unique_ptr<media::Renderer> renderer,
43 InitiateSurfaceRequestCB initiate_surface_request_cb, 47 InitiateSurfaceRequestCB initiate_surface_request_cb,
44 mojo::InterfaceRequest<mojom::Renderer> request) { 48 mojo::InterfaceRequest<mojom::Renderer> request) {
45 MojoRendererService* service = new MojoRendererService( 49 MojoRendererService* service = new MojoRendererService(
46 mojo_cdm_service_context, std::move(audio_sink), std::move(video_sink), 50 mojo_demuxer_service_context, mojo_cdm_service_context,
47 std::move(renderer), initiate_surface_request_cb); 51 std::move(audio_sink), std::move(video_sink), std::move(renderer),
52 initiate_surface_request_cb);
48 53
49 mojo::StrongBindingPtr<mojom::Renderer> binding = 54 mojo::StrongBindingPtr<mojom::Renderer> binding =
50 mojo::MakeStrongBinding<mojom::Renderer>(base::WrapUnique(service), 55 mojo::MakeStrongBinding<mojom::Renderer>(base::WrapUnique(service),
51 std::move(request)); 56 std::move(request));
52 57
53 service->set_bad_message_cb(base::Bind(&CloseBindingOnBadMessage, binding)); 58 service->set_bad_message_cb(base::Bind(&CloseBindingOnBadMessage, binding));
54 59
55 return binding; 60 return binding;
56 } 61 }
57 62
58 MojoRendererService::MojoRendererService( 63 MojoRendererService::MojoRendererService(
64 base::WeakPtr<MojoDemuxerServiceContext> mojo_demuxer_service_context,
59 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, 65 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context,
60 scoped_refptr<AudioRendererSink> audio_sink, 66 scoped_refptr<AudioRendererSink> audio_sink,
61 std::unique_ptr<VideoRendererSink> video_sink, 67 std::unique_ptr<VideoRendererSink> video_sink,
62 std::unique_ptr<media::Renderer> renderer, 68 std::unique_ptr<media::Renderer> renderer,
63 InitiateSurfaceRequestCB initiate_surface_request_cb) 69 InitiateSurfaceRequestCB initiate_surface_request_cb)
64 : mojo_cdm_service_context_(mojo_cdm_service_context), 70 : mojo_demuxer_service_context_(mojo_demuxer_service_context),
71 mojo_cdm_service_context_(mojo_cdm_service_context),
65 state_(STATE_UNINITIALIZED), 72 state_(STATE_UNINITIALIZED),
66 playback_rate_(0), 73 playback_rate_(0),
74 media_resource_shim_(nullptr),
75 media_url_demuxer_(nullptr),
76 media_resource_(nullptr),
67 audio_sink_(std::move(audio_sink)), 77 audio_sink_(std::move(audio_sink)),
68 video_sink_(std::move(video_sink)), 78 video_sink_(std::move(video_sink)),
69 renderer_(std::move(renderer)), 79 renderer_(std::move(renderer)),
70 initiate_surface_request_cb_(initiate_surface_request_cb), 80 initiate_surface_request_cb_(initiate_surface_request_cb),
71 weak_factory_(this) { 81 weak_factory_(this) {
72 DVLOG(1) << __func__; 82 DVLOG(1) << __func__;
73 DCHECK(renderer_); 83 DCHECK(renderer_);
74 84
75 weak_this_ = weak_factory_.GetWeakPtr(); 85 weak_this_ = weak_factory_.GetWeakPtr();
76 } 86 }
77 87
78 MojoRendererService::~MojoRendererService() {} 88 MojoRendererService::~MojoRendererService() {}
79 89
80 void MojoRendererService::Initialize( 90 void MojoRendererService::Initialize(
81 mojom::RendererClientAssociatedPtrInfo client, 91 mojom::RendererClientAssociatedPtrInfo client,
92 int32_t demuxer_id,
82 base::Optional<std::vector<mojom::DemuxerStreamPtr>> streams, 93 base::Optional<std::vector<mojom::DemuxerStreamPtr>> streams,
83 mojom::AudioRendererSinkPtr audio_renderer_sink_ptr, 94 mojom::AudioRendererSinkPtr audio_renderer_sink_ptr,
84 mojom::VideoRendererSinkPtr video_renderer_sink_ptr, 95 mojom::VideoRendererSinkPtr video_renderer_sink_ptr,
85 const base::Optional<GURL>& media_url, 96 const base::Optional<GURL>& media_url,
86 const base::Optional<GURL>& first_party_for_cookies, 97 const base::Optional<GURL>& first_party_for_cookies,
87 const InitializeCallback& callback) { 98 const InitializeCallback& callback) {
88 DVLOG(1) << __func__; 99 DVLOG(1) << __func__;
89 DCHECK_EQ(state_, STATE_UNINITIALIZED); 100 DCHECK_EQ(state_, STATE_UNINITIALIZED);
90 101
91 client_.Bind(std::move(client)); 102 client_.Bind(std::move(client));
92 state_ = STATE_INITIALIZING; 103 state_ = STATE_INITIALIZING;
93 104
94 if (audio_renderer_sink_ptr) { 105 if (audio_renderer_sink_ptr) {
95 static_cast<MojoAudioRendererSinkAdapter*>(audio_sink_.get()) 106 static_cast<MojoAudioRendererSinkAdapter*>(audio_sink_.get())
96 ->SetClient(std::move(audio_renderer_sink_ptr)); 107 ->SetClient(std::move(audio_renderer_sink_ptr));
97 } 108 }
98 109
99 if (video_renderer_sink_ptr) { 110 if (video_renderer_sink_ptr) {
100 static_cast<MojoVideoRendererSinkAdapter*>(video_sink_.get()) 111 static_cast<MojoVideoRendererSinkAdapter*>(video_sink_.get())
101 ->Initialize(std::move(video_renderer_sink_ptr)); 112 ->Initialize(std::move(video_renderer_sink_ptr));
102 } 113 }
103 114
115 if (demuxer_id != MediaResource::kInvalidRemoteId) {
116 media_resource_ = mojo_demuxer_service_context_->GetDemuxer(
117 demuxer_id, base::Bind(&MojoRendererService::OnDemuxerInitialized,
118 weak_this_, callback));
119 CHECK(media_resource_);
120 return;
121 }
122
104 if (media_url == base::nullopt) { 123 if (media_url == base::nullopt) {
105 DCHECK(streams.has_value()); 124 DCHECK(streams.has_value());
106 media_resource_.reset(new MediaResourceShim( 125 media_resource_shim_.reset(new MediaResourceShim(
107 std::move(*streams), 126 std::move(*streams),
108 base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback))); 127 base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback)));
128 media_resource_ = media_resource_shim_.get();
109 return; 129 return;
110 } 130 }
111 131
112 DCHECK(!media_url.value().is_empty()); 132 DCHECK(!media_url.value().is_empty());
113 DCHECK(first_party_for_cookies); 133 DCHECK(first_party_for_cookies);
114 media_resource_.reset(new MediaUrlDemuxer(nullptr, media_url.value(), 134 media_url_demuxer_.reset(new MediaUrlDemuxer(
115 first_party_for_cookies.value())); 135 nullptr, media_url.value(), first_party_for_cookies.value()));
136 media_resource_ = media_url_demuxer_.get();
116 renderer_->Initialize( 137 renderer_->Initialize(
117 media_resource_.get(), this, 138 media_resource_, this,
118 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, 139 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_,
119 callback)); 140 callback));
120 } 141 }
121 142
122 void MojoRendererService::Flush(const FlushCallback& callback) { 143 void MojoRendererService::Flush(const FlushCallback& callback) {
123 DVLOG(2) << __func__; 144 DVLOG(2) << __func__;
124 DCHECK_EQ(state_, STATE_PLAYING); 145 DCHECK_EQ(state_, STATE_PLAYING);
125 146
126 state_ = STATE_FLUSHING; 147 state_ = STATE_FLUSHING;
127 CancelPeriodicMediaTimeUpdates(); 148 CancelPeriodicMediaTimeUpdates();
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 void MojoRendererService::OnVideoOpacityChange(bool opaque) { 233 void MojoRendererService::OnVideoOpacityChange(bool opaque) {
213 DVLOG(2) << __func__ << "(" << opaque << ")"; 234 DVLOG(2) << __func__ << "(" << opaque << ")";
214 client_->OnVideoOpacityChange(opaque); 235 client_->OnVideoOpacityChange(opaque);
215 } 236 }
216 237
217 void MojoRendererService::OnStreamReady( 238 void MojoRendererService::OnStreamReady(
218 const base::Callback<void(bool)>& callback) { 239 const base::Callback<void(bool)>& callback) {
219 DCHECK_EQ(state_, STATE_INITIALIZING); 240 DCHECK_EQ(state_, STATE_INITIALIZING);
220 241
221 renderer_->Initialize( 242 renderer_->Initialize(
222 media_resource_.get(), this, 243 media_resource_, this,
223 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, 244 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_,
224 callback)); 245 callback));
225 } 246 }
226 247
227 void MojoRendererService::OnRendererInitializeDone( 248 void MojoRendererService::OnRendererInitializeDone(
228 const base::Callback<void(bool)>& callback, 249 const InitializeCallback& callback,
229 PipelineStatus status) { 250 PipelineStatus status) {
230 DVLOG(1) << __func__; 251 DVLOG(1) << __func__;
231 DCHECK_EQ(state_, STATE_INITIALIZING); 252 DCHECK_EQ(state_, STATE_INITIALIZING);
232 253
233 if (status != PIPELINE_OK) { 254 if (status != PIPELINE_OK) {
234 state_ = STATE_ERROR; 255 state_ = STATE_ERROR;
235 callback.Run(false); 256 callback.Run(false);
236 return; 257 return;
237 } 258 }
238 259
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 // This may cause |this| to be destructed. 320 // This may cause |this| to be destructed.
300 DCHECK(!bad_message_cb_.is_null()); 321 DCHECK(!bad_message_cb_.is_null());
301 bad_message_cb_.Run(); 322 bad_message_cb_.Run();
302 323
303 return; 324 return;
304 } 325 }
305 326
306 callback.Run(initiate_surface_request_cb_.Run()); 327 callback.Run(initiate_surface_request_cb_.Run());
307 } 328 }
308 329
330 void MojoRendererService::OnDemuxerInitialized(
331 const InitializeCallback& callback,
332 PipelineStatus status) {
333 if (status != PipelineStatus::PIPELINE_OK) {
334 OnError(status);
335 return;
336 }
337
338 // for chunk it is called from add id second
339 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
340 FROM_HERE, base::Bind(&MojoRendererService::InitializeRenderer,
341 weak_this_, callback),
342 base::TimeDelta::FromMilliseconds(100));
343 }
344
345 void MojoRendererService::InitializeRenderer(
346 const InitializeCallback& callback) {
347 renderer_->Initialize(
348 media_resource_, this,
349 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_,
350 callback));
351 }
352
309 } // namespace media 353 } // namespace media
OLDNEW
« no previous file with comments | « media/mojo/services/mojo_renderer_service.h ('k') | media/mojo/services/mojo_source_buffer_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698