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

Side by Side Diff: media/renderers/renderer_impl.cc

Issue 2558213002: Fix crash in renderer initialization when media pipeline is stopped (Closed)
Patch Set: Added a comment for DemuxerStreamProvider::GetStream Created 4 years 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/base/demuxer_stream_provider.h ('k') | media/renderers/renderer_impl_unittest.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/renderers/renderer_impl.h" 5 #include "media/renderers/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.h" 10 #include "base/callback.h"
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 } 124 }
125 125
126 void RendererImpl::Initialize(DemuxerStreamProvider* demuxer_stream_provider, 126 void RendererImpl::Initialize(DemuxerStreamProvider* demuxer_stream_provider,
127 RendererClient* client, 127 RendererClient* client,
128 const PipelineStatusCB& init_cb) { 128 const PipelineStatusCB& init_cb) {
129 DVLOG(1) << __func__; 129 DVLOG(1) << __func__;
130 DCHECK(task_runner_->BelongsToCurrentThread()); 130 DCHECK(task_runner_->BelongsToCurrentThread());
131 DCHECK_EQ(state_, STATE_UNINITIALIZED); 131 DCHECK_EQ(state_, STATE_UNINITIALIZED);
132 DCHECK(!init_cb.is_null()); 132 DCHECK(!init_cb.is_null());
133 DCHECK(client); 133 DCHECK(client);
134 DCHECK(demuxer_stream_provider->GetStream(DemuxerStream::AUDIO) ||
135 demuxer_stream_provider->GetStream(DemuxerStream::VIDEO));
136 134
137 client_ = client; 135 client_ = client;
138 demuxer_stream_provider_ = demuxer_stream_provider; 136 demuxer_stream_provider_ = demuxer_stream_provider;
139 init_cb_ = init_cb; 137 init_cb_ = init_cb;
140 138
141 DemuxerStream* audio_stream =
142 demuxer_stream_provider->GetStream(DemuxerStream::AUDIO);
143 if (audio_stream)
144 audio_stream->SetStreamStatusChangeCB(base::Bind(
145 &RendererImpl::RestartStreamPlayback, weak_this_, audio_stream));
146 DemuxerStream* video_stream =
147 demuxer_stream_provider->GetStream(DemuxerStream::VIDEO);
148 if (video_stream)
149 video_stream->SetStreamStatusChangeCB(base::Bind(
150 &RendererImpl::RestartStreamPlayback, weak_this_, video_stream));
151
152 if (HasEncryptedStream() && !cdm_context_) { 139 if (HasEncryptedStream() && !cdm_context_) {
153 state_ = STATE_INIT_PENDING_CDM; 140 state_ = STATE_INIT_PENDING_CDM;
154 return; 141 return;
155 } 142 }
156 143
157 state_ = STATE_INITIALIZING; 144 state_ = STATE_INITIALIZING;
158 InitializeAudioRenderer(); 145 InitializeAudioRenderer();
159 } 146 }
160 147
161 void RendererImpl::SetCdm(CdmContext* cdm_context, 148 void RendererImpl::SetCdm(CdmContext* cdm_context,
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 364
378 void RendererImpl::InitializeAudioRenderer() { 365 void RendererImpl::InitializeAudioRenderer() {
379 DVLOG(1) << __func__; 366 DVLOG(1) << __func__;
380 DCHECK(task_runner_->BelongsToCurrentThread()); 367 DCHECK(task_runner_->BelongsToCurrentThread());
381 DCHECK_EQ(state_, STATE_INITIALIZING); 368 DCHECK_EQ(state_, STATE_INITIALIZING);
382 DCHECK(!init_cb_.is_null()); 369 DCHECK(!init_cb_.is_null());
383 370
384 PipelineStatusCB done_cb = 371 PipelineStatusCB done_cb =
385 base::Bind(&RendererImpl::OnAudioRendererInitializeDone, weak_this_); 372 base::Bind(&RendererImpl::OnAudioRendererInitializeDone, weak_this_);
386 373
387 if (!demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO)) { 374 DemuxerStream* audio_stream =
375 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO);
376 if (!audio_stream) {
388 audio_renderer_.reset(); 377 audio_renderer_.reset();
389 task_runner_->PostTask(FROM_HERE, base::Bind(done_cb, PIPELINE_OK)); 378 task_runner_->PostTask(FROM_HERE, base::Bind(done_cb, PIPELINE_OK));
390 return; 379 return;
391 } 380 }
392 381
382 audio_stream->SetStreamStatusChangeCB(base::Bind(
383 &RendererImpl::RestartStreamPlayback, weak_this_, audio_stream));
384
393 audio_renderer_client_.reset( 385 audio_renderer_client_.reset(
394 new RendererClientInternal(DemuxerStream::AUDIO, this)); 386 new RendererClientInternal(DemuxerStream::AUDIO, this));
395 // Note: After the initialization of a renderer, error events from it may 387 // Note: After the initialization of a renderer, error events from it may
396 // happen at any time and all future calls must guard against STATE_ERROR. 388 // happen at any time and all future calls must guard against STATE_ERROR.
397 audio_renderer_->Initialize( 389 audio_renderer_->Initialize(audio_stream, cdm_context_,
398 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO), cdm_context_, 390 audio_renderer_client_.get(), done_cb);
399 audio_renderer_client_.get(), done_cb);
400 } 391 }
401 392
402 void RendererImpl::OnAudioRendererInitializeDone(PipelineStatus status) { 393 void RendererImpl::OnAudioRendererInitializeDone(PipelineStatus status) {
403 DVLOG(1) << __func__ << ": " << status; 394 DVLOG(1) << __func__ << ": " << status;
404 DCHECK(task_runner_->BelongsToCurrentThread()); 395 DCHECK(task_runner_->BelongsToCurrentThread());
405 396
406 // OnError() may be fired at any time by the renderers, even if they thought 397 // OnError() may be fired at any time by the renderers, even if they thought
407 // they initialized successfully (due to delayed output device setup). 398 // they initialized successfully (due to delayed output device setup).
408 if (state_ != STATE_INITIALIZING) { 399 if (state_ != STATE_INITIALIZING) {
409 DCHECK(init_cb_.is_null()); 400 DCHECK(init_cb_.is_null());
(...skipping 12 matching lines...) Expand all
422 413
423 void RendererImpl::InitializeVideoRenderer() { 414 void RendererImpl::InitializeVideoRenderer() {
424 DVLOG(1) << __func__; 415 DVLOG(1) << __func__;
425 DCHECK(task_runner_->BelongsToCurrentThread()); 416 DCHECK(task_runner_->BelongsToCurrentThread());
426 DCHECK_EQ(state_, STATE_INITIALIZING); 417 DCHECK_EQ(state_, STATE_INITIALIZING);
427 DCHECK(!init_cb_.is_null()); 418 DCHECK(!init_cb_.is_null());
428 419
429 PipelineStatusCB done_cb = 420 PipelineStatusCB done_cb =
430 base::Bind(&RendererImpl::OnVideoRendererInitializeDone, weak_this_); 421 base::Bind(&RendererImpl::OnVideoRendererInitializeDone, weak_this_);
431 422
432 if (!demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO)) { 423 DemuxerStream* video_stream =
424 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO);
425 if (!video_stream) {
433 video_renderer_.reset(); 426 video_renderer_.reset();
434 task_runner_->PostTask(FROM_HERE, base::Bind(done_cb, PIPELINE_OK)); 427 task_runner_->PostTask(FROM_HERE, base::Bind(done_cb, PIPELINE_OK));
435 return; 428 return;
436 } 429 }
437 430
431 video_stream->SetStreamStatusChangeCB(base::Bind(
432 &RendererImpl::RestartStreamPlayback, weak_this_, video_stream));
433
438 video_renderer_client_.reset( 434 video_renderer_client_.reset(
439 new RendererClientInternal(DemuxerStream::VIDEO, this)); 435 new RendererClientInternal(DemuxerStream::VIDEO, this));
440 video_renderer_->Initialize( 436 video_renderer_->Initialize(
441 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO), cdm_context_, 437 video_stream, cdm_context_, video_renderer_client_.get(),
442 video_renderer_client_.get(),
443 base::Bind(&RendererImpl::GetWallClockTimes, base::Unretained(this)), 438 base::Bind(&RendererImpl::GetWallClockTimes, base::Unretained(this)),
444 done_cb); 439 done_cb);
445 } 440 }
446 441
447 void RendererImpl::OnVideoRendererInitializeDone(PipelineStatus status) { 442 void RendererImpl::OnVideoRendererInitializeDone(PipelineStatus status) {
448 DVLOG(1) << __func__ << ": " << status; 443 DVLOG(1) << __func__ << ": " << status;
449 DCHECK(task_runner_->BelongsToCurrentThread()); 444 DCHECK(task_runner_->BelongsToCurrentThread());
450 445
451 // OnError() may be fired at any time by the renderers, even if they thought 446 // OnError() may be fired at any time by the renderers, even if they thought
452 // they initialized successfully (due to delayed output device setup). 447 // they initialized successfully (due to delayed output device setup).
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 DCHECK(task_runner_->BelongsToCurrentThread()); 834 DCHECK(task_runner_->BelongsToCurrentThread());
840 client_->OnVideoNaturalSizeChange(size); 835 client_->OnVideoNaturalSizeChange(size);
841 } 836 }
842 837
843 void RendererImpl::OnVideoOpacityChange(bool opaque) { 838 void RendererImpl::OnVideoOpacityChange(bool opaque) {
844 DCHECK(task_runner_->BelongsToCurrentThread()); 839 DCHECK(task_runner_->BelongsToCurrentThread());
845 client_->OnVideoOpacityChange(opaque); 840 client_->OnVideoOpacityChange(opaque);
846 } 841 }
847 842
848 } // namespace media 843 } // namespace media
OLDNEW
« no previous file with comments | « media/base/demuxer_stream_provider.h ('k') | media/renderers/renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698