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

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

Issue 2640003002: Implement MojoAudioRendererSink and use it in UtilityMojoMediaClient (Closed)
Patch Set: Make sure to stop the audio sink. Also unbind from the audio device thread Created 3 years, 11 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.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/demuxer_stream_provider.h" 14 #include "media/base/demuxer_stream_provider.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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 video_stream_.reset( 103 video_stream_.reset(
99 new MojoDemuxerStreamImpl(video, MakeRequest(&video_stream))); 104 new MojoDemuxerStreamImpl(video, MakeRequest(&video_stream)));
100 // Using base::Unretained(this) is safe because |this| owns 105 // Using base::Unretained(this) is safe because |this| owns
101 // |video_stream_|, and the error handler can't be invoked once 106 // |video_stream_|, and the error handler can't be invoked once
102 // |video_stream_| is destroyed. 107 // |video_stream_| is destroyed.
103 video_stream_->set_connection_error_handler( 108 video_stream_->set_connection_error_handler(
104 base::Bind(&MojoRenderer::OnDemuxerStreamConnectionError, 109 base::Bind(&MojoRenderer::OnDemuxerStreamConnectionError,
105 base::Unretained(this), DemuxerStream::VIDEO)); 110 base::Unretained(this), DemuxerStream::VIDEO));
106 } 111 }
107 112
113 mojom::AudioRendererSinkPtr audio_renderer_sink_ptr;
114 mojo_audio_renderer_sink_.reset(
115 new MojoAudioRendererSinkImpl(task_runner_, audio_renderer_sink_,
116 MakeRequest(&audio_renderer_sink_ptr)));
117 mojo_audio_renderer_sink_->set_connection_error_handler(
118 base::Bind(&MojoRenderer::OnAudioRendererSinkConnectionError,
119 base::Unretained(this)));
120
108 mojom::VideoRendererSinkPtr video_renderer_sink_ptr; 121 mojom::VideoRendererSinkPtr video_renderer_sink_ptr;
109 mojo_video_renderer_sink_.reset( 122 mojo_video_renderer_sink_.reset(
110 new MojoVideoRendererSinkImpl(task_runner_, video_renderer_sink_, 123 new MojoVideoRendererSinkImpl(task_runner_, video_renderer_sink_,
111 MakeRequest(&video_renderer_sink_ptr))); 124 MakeRequest(&video_renderer_sink_ptr)));
112 // Using base::Unretained(this) is safe because |this| owns 125 // Using base::Unretained(this) is safe because |this| owns
113 // |mojo_video_renderer_sink|, and the error handler can't be invoked once 126 // |mojo_video_renderer_sink|, and the error handler can't be invoked once
114 // |mojo_video_renderer_sink| is destroyed. 127 // |mojo_video_renderer_sink| is destroyed.
115 mojo_video_renderer_sink_->set_connection_error_handler( 128 mojo_video_renderer_sink_->set_connection_error_handler(
116 base::Bind(&MojoRenderer::OnVideoRendererSinkConnectionError, 129 base::Bind(&MojoRenderer::OnVideoRendererSinkConnectionError,
117 base::Unretained(this))); 130 base::Unretained(this)));
118 131
119 BindRemoteRendererIfNeeded(); 132 BindRemoteRendererIfNeeded();
120 133
121 mojom::RendererClientAssociatedPtrInfo client_ptr_info; 134 mojom::RendererClientAssociatedPtrInfo client_ptr_info;
122 client_binding_.Bind(&client_ptr_info, remote_renderer_.associated_group()); 135 client_binding_.Bind(&client_ptr_info, remote_renderer_.associated_group());
123 136
124 // Using base::Unretained(this) is safe because |this| owns 137 // Using base::Unretained(this) is safe because |this| owns
125 // |remote_renderer_|, and the callback won't be dispatched if 138 // |remote_renderer_|, and the callback won't be dispatched if
126 // |remote_renderer_| is destroyed. 139 // |remote_renderer_| is destroyed.
127 remote_renderer_->Initialize( 140 remote_renderer_->Initialize(
128 std::move(client_ptr_info), std::move(audio_stream), 141 std::move(client_ptr_info), std::move(audio_stream),
129 std::move(video_stream), std::move(video_renderer_sink_ptr), 142 std::move(video_stream), std::move(audio_renderer_sink_ptr),
130 base::nullopt, base::nullopt, 143 std::move(video_renderer_sink_ptr), base::nullopt, base::nullopt,
131 base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client)); 144 base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client));
132 } 145 }
133 146
134 void MojoRenderer::InitializeRendererFromUrl(media::RendererClient* client) { 147 void MojoRenderer::InitializeRendererFromUrl(media::RendererClient* client) {
135 DVLOG(2) << __func__; 148 DVLOG(2) << __func__;
136 DCHECK(task_runner_->BelongsToCurrentThread()); 149 DCHECK(task_runner_->BelongsToCurrentThread());
137 150
138 BindRemoteRendererIfNeeded(); 151 BindRemoteRendererIfNeeded();
139 152
140 mojom::RendererClientAssociatedPtrInfo client_ptr_info; 153 mojom::RendererClientAssociatedPtrInfo client_ptr_info;
141 client_binding_.Bind(&client_ptr_info, remote_renderer_.associated_group()); 154 client_binding_.Bind(&client_ptr_info, remote_renderer_.associated_group());
142 155
143 MediaUrlParams url_params = demuxer_stream_provider_->GetMediaUrlParams(); 156 MediaUrlParams url_params = demuxer_stream_provider_->GetMediaUrlParams();
144 157
145 // Using base::Unretained(this) is safe because |this| owns 158 // Using base::Unretained(this) is safe because |this| owns
146 // |remote_renderer_|, and the callback won't be dispatched if 159 // |remote_renderer_|, and the callback won't be dispatched if
147 // |remote_renderer_| is destroyed. 160 // |remote_renderer_| is destroyed.
148 remote_renderer_->Initialize( 161 remote_renderer_->Initialize(
149 std::move(client_ptr_info), mojom::DemuxerStreamPtr(), 162 std::move(client_ptr_info), mojom::DemuxerStreamPtr(),
150 mojom::DemuxerStreamPtr(), mojom::VideoRendererSinkPtr(), 163 mojom::DemuxerStreamPtr(), mojom::AudioRendererSinkPtr(),
151 url_params.media_url, url_params.first_party_for_cookies, 164 mojom::VideoRendererSinkPtr(), url_params.media_url,
165 url_params.first_party_for_cookies,
152 base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client)); 166 base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client));
153 } 167 }
154 168
155 void MojoRenderer::SetCdm(CdmContext* cdm_context, 169 void MojoRenderer::SetCdm(CdmContext* cdm_context,
156 const CdmAttachedCB& cdm_attached_cb) { 170 const CdmAttachedCB& cdm_attached_cb) {
157 DVLOG(1) << __func__; 171 DVLOG(1) << __func__;
158 DCHECK(task_runner_->BelongsToCurrentThread()); 172 DCHECK(task_runner_->BelongsToCurrentThread());
159 DCHECK(cdm_context); 173 DCHECK(cdm_context);
160 DCHECK(!cdm_attached_cb.is_null()); 174 DCHECK(!cdm_attached_cb.is_null());
161 DCHECK(cdm_attached_cb_.is_null()); 175 DCHECK(cdm_attached_cb_.is_null());
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 350
337 if (type == DemuxerStream::AUDIO) { 351 if (type == DemuxerStream::AUDIO) {
338 audio_stream_.reset(); 352 audio_stream_.reset();
339 } else if (type == DemuxerStream::VIDEO) { 353 } else if (type == DemuxerStream::VIDEO) {
340 video_stream_.reset(); 354 video_stream_.reset();
341 } else { 355 } else {
342 NOTREACHED() << "Unexpected demuxer stream type: " << type; 356 NOTREACHED() << "Unexpected demuxer stream type: " << type;
343 } 357 }
344 } 358 }
345 359
360 void MojoRenderer::OnAudioRendererSinkConnectionError() {
361 DVLOG(1) << __func__;
362 CHECK(task_runner_->BelongsToCurrentThread());
363
364 mojo_audio_renderer_sink_.reset();
365 }
366
346 void MojoRenderer::OnVideoRendererSinkConnectionError() { 367 void MojoRenderer::OnVideoRendererSinkConnectionError() {
347 DVLOG(1) << __func__; 368 DVLOG(1) << __func__;
348 CHECK(task_runner_->BelongsToCurrentThread()); 369 CHECK(task_runner_->BelongsToCurrentThread());
349 370
350 mojo_video_renderer_sink_.reset(); 371 mojo_video_renderer_sink_.reset();
351 } 372 }
352 373
353 void MojoRenderer::BindRemoteRendererIfNeeded() { 374 void MojoRenderer::BindRemoteRendererIfNeeded() {
354 DVLOG(2) << __func__; 375 DVLOG(2) << __func__;
355 DCHECK(task_runner_->BelongsToCurrentThread()); 376 DCHECK(task_runner_->BelongsToCurrentThread());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED); 430 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
410 431
411 if (!flush_cb_.is_null()) 432 if (!flush_cb_.is_null())
412 base::ResetAndReturn(&flush_cb_).Run(); 433 base::ResetAndReturn(&flush_cb_).Run();
413 434
414 if (!cdm_attached_cb_.is_null()) 435 if (!cdm_attached_cb_.is_null())
415 base::ResetAndReturn(&cdm_attached_cb_).Run(false); 436 base::ResetAndReturn(&cdm_attached_cb_).Run(false);
416 } 437 }
417 438
418 } // namespace media 439 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698