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

Unified Diff: media/renderers/renderer_impl.cc

Issue 2558213002: Fix crash in renderer initialization when media pipeline is stopped (Closed)
Patch Set: Move SetStreamStatusChangeCB invokations to a/v renderer init 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | media/renderers/renderer_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/renderers/renderer_impl.cc
diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc
index 87212d8214423f6ed38b7cd4344feca1ae16476e..210e5cc574f2437b4368c498f56b02facf5c1e61 100644
--- a/media/renderers/renderer_impl.cc
+++ b/media/renderers/renderer_impl.cc
@@ -131,24 +131,11 @@ void RendererImpl::Initialize(DemuxerStreamProvider* demuxer_stream_provider,
DCHECK_EQ(state_, STATE_UNINITIALIZED);
DCHECK(!init_cb.is_null());
DCHECK(client);
- DCHECK(demuxer_stream_provider->GetStream(DemuxerStream::AUDIO) ||
- demuxer_stream_provider->GetStream(DemuxerStream::VIDEO));
client_ = client;
demuxer_stream_provider_ = demuxer_stream_provider;
init_cb_ = init_cb;
- DemuxerStream* audio_stream =
- demuxer_stream_provider->GetStream(DemuxerStream::AUDIO);
- if (audio_stream)
- audio_stream->SetStreamStatusChangeCB(base::Bind(
- &RendererImpl::RestartStreamPlayback, weak_this_, audio_stream));
- DemuxerStream* video_stream =
- demuxer_stream_provider->GetStream(DemuxerStream::VIDEO);
- if (video_stream)
- video_stream->SetStreamStatusChangeCB(base::Bind(
- &RendererImpl::RestartStreamPlayback, weak_this_, video_stream));
-
if (HasEncryptedStream() && !cdm_context_) {
state_ = STATE_INIT_PENDING_CDM;
return;
@@ -384,19 +371,23 @@ void RendererImpl::InitializeAudioRenderer() {
PipelineStatusCB done_cb =
base::Bind(&RendererImpl::OnAudioRendererInitializeDone, weak_this_);
- if (!demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO)) {
+ DemuxerStream* audio_stream =
+ demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO);
+ if (!audio_stream) {
audio_renderer_.reset();
task_runner_->PostTask(FROM_HERE, base::Bind(done_cb, PIPELINE_OK));
return;
}
+ audio_stream->SetStreamStatusChangeCB(base::Bind(
+ &RendererImpl::RestartStreamPlayback, weak_this_, audio_stream));
DaleCurtis 2016/12/13 00:31:38 Should we be binding in the audio_stream pointer l
servolk 2016/12/13 00:46:50 As I've explained in my previous reply, this shoul
+
audio_renderer_client_.reset(
new RendererClientInternal(DemuxerStream::AUDIO, this));
// Note: After the initialization of a renderer, error events from it may
// happen at any time and all future calls must guard against STATE_ERROR.
- audio_renderer_->Initialize(
- demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO), cdm_context_,
- audio_renderer_client_.get(), done_cb);
+ audio_renderer_->Initialize(audio_stream, cdm_context_,
+ audio_renderer_client_.get(), done_cb);
}
void RendererImpl::OnAudioRendererInitializeDone(PipelineStatus status) {
@@ -429,17 +420,21 @@ void RendererImpl::InitializeVideoRenderer() {
PipelineStatusCB done_cb =
base::Bind(&RendererImpl::OnVideoRendererInitializeDone, weak_this_);
- if (!demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO)) {
+ DemuxerStream* video_stream =
+ demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO);
+ if (!video_stream) {
video_renderer_.reset();
task_runner_->PostTask(FROM_HERE, base::Bind(done_cb, PIPELINE_OK));
return;
}
+ video_stream->SetStreamStatusChangeCB(base::Bind(
+ &RendererImpl::RestartStreamPlayback, weak_this_, video_stream));
DaleCurtis 2016/12/13 00:31:38 Ditto.
servolk 2016/12/13 00:46:50 Same.
+
video_renderer_client_.reset(
new RendererClientInternal(DemuxerStream::VIDEO, this));
video_renderer_->Initialize(
- demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO), cdm_context_,
- video_renderer_client_.get(),
+ video_stream, cdm_context_, video_renderer_client_.get(),
base::Bind(&RendererImpl::GetWallClockTimes, base::Unretained(this)),
done_cb);
}
« no previous file with comments | « no previous file | media/renderers/renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698