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

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

Issue 2640003002: Implement MojoAudioRendererSink and use it in UtilityMojoMediaClient (Closed)
Patch Set: Rebase 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
« no previous file with comments | « media/mojo/clients/mojo_renderer.h ('k') | media/mojo/clients/mojo_renderer_factory.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.h" 5 #include "media/mojo/clients/mojo_renderer.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/audio_renderer_sink.h"
13 #include "media/base/media_resource.h" 14 #include "media/base/media_resource.h"
14 #include "media/base/pipeline_status.h" 15 #include "media/base/pipeline_status.h"
15 #include "media/base/renderer_client.h" 16 #include "media/base/renderer_client.h"
16 #include "media/base/video_renderer_sink.h" 17 #include "media/base/video_renderer_sink.h"
18 #include "media/mojo/clients/mojo_audio_renderer_sink_impl.h"
17 #include "media/mojo/clients/mojo_demuxer_stream_impl.h" 19 #include "media/mojo/clients/mojo_demuxer_stream_impl.h"
18 #include "media/mojo/clients/mojo_video_renderer_sink_impl.h" 20 #include "media/mojo/clients/mojo_video_renderer_sink_impl.h"
19 #include "media/mojo/interfaces/video_renderer_sink.mojom.h" 21 #include "media/mojo/interfaces/video_renderer_sink.mojom.h"
20 #include "media/renderers/video_overlay_factory.h" 22 #include "media/renderers/video_overlay_factory.h"
21 23
22 namespace media { 24 namespace media {
23 25
24 MojoRenderer::MojoRenderer( 26 MojoRenderer::MojoRenderer(
25 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 27 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
26 std::unique_ptr<VideoOverlayFactory> video_overlay_factory, 28 std::unique_ptr<VideoOverlayFactory> video_overlay_factory,
29 AudioRendererSink* audio_renderer_sink,
27 VideoRendererSink* video_renderer_sink, 30 VideoRendererSink* video_renderer_sink,
28 mojom::RendererPtr remote_renderer) 31 mojom::RendererPtr remote_renderer)
29 : task_runner_(task_runner), 32 : task_runner_(task_runner),
30 video_overlay_factory_(std::move(video_overlay_factory)), 33 video_overlay_factory_(std::move(video_overlay_factory)),
34 audio_renderer_sink_(audio_renderer_sink),
31 video_renderer_sink_(video_renderer_sink), 35 video_renderer_sink_(video_renderer_sink),
32 remote_renderer_info_(remote_renderer.PassInterface()), 36 remote_renderer_info_(remote_renderer.PassInterface()),
33 client_binding_(this), 37 client_binding_(this),
34 media_time_interpolator_(&media_clock_), 38 media_time_interpolator_(&media_clock_),
39 mojo_audio_renderer_sink_(nullptr),
35 mojo_video_renderer_sink_(nullptr) { 40 mojo_video_renderer_sink_(nullptr) {
36 DVLOG(1) << __func__; 41 DVLOG(1) << __func__;
37 } 42 }
38 43
39 MojoRenderer::~MojoRenderer() { 44 MojoRenderer::~MojoRenderer() {
40 DVLOG(1) << __func__; 45 DVLOG(1) << __func__;
41 DCHECK(task_runner_->BelongsToCurrentThread()); 46 DCHECK(task_runner_->BelongsToCurrentThread());
42 47
43 CancelPendingCallbacks(); 48 CancelPendingCallbacks();
44 } 49 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 MakeRequest(&video_stream)); 106 MakeRequest(&video_stream));
102 // Using base::Unretained(this) is safe because |this| owns |mojo_stream|, 107 // Using base::Unretained(this) is safe because |this| owns |mojo_stream|,
103 // and the error handler can't be invoked once |mojo_stream| is destroyed. 108 // and the error handler can't be invoked once |mojo_stream| is destroyed.
104 mojo_stream->set_connection_error_handler( 109 mojo_stream->set_connection_error_handler(
105 base::Bind(&MojoRenderer::OnDemuxerStreamConnectionError, 110 base::Bind(&MojoRenderer::OnDemuxerStreamConnectionError,
106 base::Unretained(this), mojo_stream.get())); 111 base::Unretained(this), mojo_stream.get()));
107 streams_.push_back(std::move(mojo_stream)); 112 streams_.push_back(std::move(mojo_stream));
108 streams.push_back(std::move(video_stream)); 113 streams.push_back(std::move(video_stream));
109 } 114 }
110 115
116 mojom::AudioRendererSinkPtr audio_renderer_sink_ptr;
117 mojo_audio_renderer_sink_.reset(
118 new MojoAudioRendererSinkImpl(task_runner_, audio_renderer_sink_,
119 MakeRequest(&audio_renderer_sink_ptr)));
120 mojo_audio_renderer_sink_->set_connection_error_handler(
121 base::Bind(&MojoRenderer::OnAudioRendererSinkConnectionError,
122 base::Unretained(this)));
123
111 mojom::VideoRendererSinkPtr video_renderer_sink_ptr; 124 mojom::VideoRendererSinkPtr video_renderer_sink_ptr;
112 mojo_video_renderer_sink_.reset( 125 mojo_video_renderer_sink_.reset(
113 new MojoVideoRendererSinkImpl(task_runner_, video_renderer_sink_, 126 new MojoVideoRendererSinkImpl(task_runner_, video_renderer_sink_,
114 MakeRequest(&video_renderer_sink_ptr))); 127 MakeRequest(&video_renderer_sink_ptr)));
115 // Using base::Unretained(this) is safe because |this| owns 128 // Using base::Unretained(this) is safe because |this| owns
116 // |mojo_video_renderer_sink|, and the error handler can't be invoked once 129 // |mojo_video_renderer_sink|, and the error handler can't be invoked once
117 // |mojo_video_renderer_sink| is destroyed. 130 // |mojo_video_renderer_sink| is destroyed.
118 mojo_video_renderer_sink_->set_connection_error_handler( 131 mojo_video_renderer_sink_->set_connection_error_handler(
119 base::Bind(&MojoRenderer::OnVideoRendererSinkConnectionError, 132 base::Bind(&MojoRenderer::OnVideoRendererSinkConnectionError,
120 base::Unretained(this))); 133 base::Unretained(this)));
121 134
122 BindRemoteRendererIfNeeded(); 135 BindRemoteRendererIfNeeded();
123 136
124 mojom::RendererClientAssociatedPtrInfo client_ptr_info; 137 mojom::RendererClientAssociatedPtrInfo client_ptr_info;
125 client_binding_.Bind(&client_ptr_info, remote_renderer_.associated_group()); 138 client_binding_.Bind(&client_ptr_info, remote_renderer_.associated_group());
126 139
127 // Using base::Unretained(this) is safe because |this| owns 140 // Using base::Unretained(this) is safe because |this| owns
128 // |remote_renderer_|, and the callback won't be dispatched if 141 // |remote_renderer_|, and the callback won't be dispatched if
129 // |remote_renderer_| is destroyed. 142 // |remote_renderer_| is destroyed.
130 remote_renderer_->Initialize( 143 remote_renderer_->Initialize(
131 std::move(client_ptr_info), std::move(streams), 144 std::move(client_ptr_info), std::move(streams),
132 std::move(video_renderer_sink_ptr), base::nullopt, base::nullopt, 145 std::move(audio_renderer_sink_ptr), std::move(video_renderer_sink_ptr),
146 base::nullopt, base::nullopt,
133 base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client)); 147 base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client));
134 } 148 }
135 149
136 void MojoRenderer::InitializeRendererFromUrl(media::RendererClient* client) { 150 void MojoRenderer::InitializeRendererFromUrl(media::RendererClient* client) {
137 DVLOG(2) << __func__; 151 DVLOG(2) << __func__;
138 DCHECK(task_runner_->BelongsToCurrentThread()); 152 DCHECK(task_runner_->BelongsToCurrentThread());
139 153
140 BindRemoteRendererIfNeeded(); 154 BindRemoteRendererIfNeeded();
141 155
142 mojom::RendererClientAssociatedPtrInfo client_ptr_info; 156 mojom::RendererClientAssociatedPtrInfo client_ptr_info;
143 client_binding_.Bind(&client_ptr_info, remote_renderer_.associated_group()); 157 client_binding_.Bind(&client_ptr_info, remote_renderer_.associated_group());
144 158
145 MediaUrlParams url_params = media_resource_->GetMediaUrlParams(); 159 MediaUrlParams url_params = media_resource_->GetMediaUrlParams();
146 160
147 // Using base::Unretained(this) is safe because |this| owns 161 // Using base::Unretained(this) is safe because |this| owns
148 // |remote_renderer_|, and the callback won't be dispatched if 162 // |remote_renderer_|, and the callback won't be dispatched if
149 // |remote_renderer_| is destroyed. 163 // |remote_renderer_| is destroyed.
150 std::vector<mojom::DemuxerStreamPtr> streams; 164 std::vector<mojom::DemuxerStreamPtr> streams;
151 remote_renderer_->Initialize( 165 remote_renderer_->Initialize(
152 std::move(client_ptr_info), std::move(streams), 166 std::move(client_ptr_info), std::move(streams),
153 mojom::VideoRendererSinkPtr(), url_params.media_url, 167 mojom::AudioRendererSinkPtr(), mojom::VideoRendererSinkPtr(),
154 url_params.first_party_for_cookies, 168 url_params.media_url, url_params.first_party_for_cookies,
155 base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client)); 169 base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client));
156 } 170 }
157 171
158 void MojoRenderer::SetCdm(CdmContext* cdm_context, 172 void MojoRenderer::SetCdm(CdmContext* cdm_context,
159 const CdmAttachedCB& cdm_attached_cb) { 173 const CdmAttachedCB& cdm_attached_cb) {
160 DVLOG(1) << __func__; 174 DVLOG(1) << __func__;
161 DCHECK(task_runner_->BelongsToCurrentThread()); 175 DCHECK(task_runner_->BelongsToCurrentThread());
162 DCHECK(cdm_context); 176 DCHECK(cdm_context);
163 DCHECK(!cdm_attached_cb.is_null()); 177 DCHECK(!cdm_attached_cb.is_null());
164 DCHECK(cdm_attached_cb_.is_null()); 178 DCHECK(cdm_attached_cb_.is_null());
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 354
341 for (auto& s : streams_) { 355 for (auto& s : streams_) {
342 if (s.get() == stream) { 356 if (s.get() == stream) {
343 s.reset(); 357 s.reset();
344 return; 358 return;
345 } 359 }
346 } 360 }
347 NOTREACHED() << "Unrecognized demuxer stream=" << stream; 361 NOTREACHED() << "Unrecognized demuxer stream=" << stream;
348 } 362 }
349 363
364 void MojoRenderer::OnAudioRendererSinkConnectionError() {
365 DVLOG(1) << __func__;
366 CHECK(task_runner_->BelongsToCurrentThread());
367
368 mojo_audio_renderer_sink_.reset();
369 }
370
350 void MojoRenderer::OnVideoRendererSinkConnectionError() { 371 void MojoRenderer::OnVideoRendererSinkConnectionError() {
351 DVLOG(1) << __func__; 372 DVLOG(1) << __func__;
352 CHECK(task_runner_->BelongsToCurrentThread()); 373 CHECK(task_runner_->BelongsToCurrentThread());
353 374
354 mojo_video_renderer_sink_.reset(); 375 mojo_video_renderer_sink_.reset();
355 } 376 }
356 377
357 void MojoRenderer::BindRemoteRendererIfNeeded() { 378 void MojoRenderer::BindRemoteRendererIfNeeded() {
358 DVLOG(2) << __func__; 379 DVLOG(2) << __func__;
359 DCHECK(task_runner_->BelongsToCurrentThread()); 380 DCHECK(task_runner_->BelongsToCurrentThread());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED); 434 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
414 435
415 if (!flush_cb_.is_null()) 436 if (!flush_cb_.is_null())
416 base::ResetAndReturn(&flush_cb_).Run(); 437 base::ResetAndReturn(&flush_cb_).Run();
417 438
418 if (!cdm_attached_cb_.is_null()) 439 if (!cdm_attached_cb_.is_null())
419 base::ResetAndReturn(&cdm_attached_cb_).Run(false); 440 base::ResetAndReturn(&cdm_attached_cb_).Run(false);
420 } 441 }
421 442
422 } // namespace media 443 } // namespace media
OLDNEW
« no previous file with comments | « media/mojo/clients/mojo_renderer.h ('k') | media/mojo/clients/mojo_renderer_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698