Commit a5c72b04 authored by servolk's avatar servolk Committed by Commit bot

Fix crash when pipeline is stopped while video restart is pending

Media renderer might get destroyed (due to pipeline being stopped or
suspended) while a video track restart is pending. When that happens
the VideoRendererImpl has a pending flush_cb_ that will get called from
video renderer destructor invoking RendererImpl::RestartVideoRenderer,
so RestartVideoRenderer needs to actually try restarting the video
renderer only if we are still in the playing state.

BUG=668963

Review-Url: https://codereview.chromium.org/2570773002
Cr-Commit-Position: refs/heads/master@{#441457}
parent 130fb781
...@@ -111,6 +111,11 @@ RendererImpl::~RendererImpl() { ...@@ -111,6 +111,11 @@ RendererImpl::~RendererImpl() {
DVLOG(1) << __func__; DVLOG(1) << __func__;
DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(task_runner_->BelongsToCurrentThread());
// RendererImpl is being destroyed, so invalidate weak pointers right away to
// avoid getting callbacks which might try to access fields that has been
// destroyed, e.g. audio_renderer_/video_renderer_ below (crbug.com/668963).
weak_factory_.InvalidateWeakPtrs();
// Tear down in opposite order of construction as |video_renderer_| can still // Tear down in opposite order of construction as |video_renderer_| can still
// need |time_source_| (which can be |audio_renderer_|) to be alive. // need |time_source_| (which can be |audio_renderer_|) to be alive.
video_renderer_.reset(); video_renderer_.reset();
...@@ -652,8 +657,8 @@ void RendererImpl::OnBufferingStateChange(DemuxerStream::Type type, ...@@ -652,8 +657,8 @@ void RendererImpl::OnBufferingStateChange(DemuxerStream::Type type,
deferred_video_underflow_cb_.IsCancelled()) { deferred_video_underflow_cb_.IsCancelled()) {
DVLOG(4) << __func__ << " Deferring HAVE_NOTHING for video stream."; DVLOG(4) << __func__ << " Deferring HAVE_NOTHING for video stream.";
deferred_video_underflow_cb_.Reset( deferred_video_underflow_cb_.Reset(
base::Bind(&RendererImpl::OnBufferingStateChange, base::Bind(&RendererImpl::OnBufferingStateChange, weak_this_, type,
weak_factory_.GetWeakPtr(), type, new_buffering_state)); new_buffering_state));
task_runner_->PostDelayedTask(FROM_HERE, task_runner_->PostDelayedTask(FROM_HERE,
deferred_video_underflow_cb_.callback(), deferred_video_underflow_cb_.callback(),
video_underflow_threshold_); video_underflow_threshold_);
......
...@@ -1065,6 +1065,36 @@ TEST_F(PipelineIntegrationTest, TrackStatusChangesWhileSuspended) { ...@@ -1065,6 +1065,36 @@ TEST_F(PipelineIntegrationTest, TrackStatusChangesWhileSuspended) {
ASSERT_TRUE(WaitUntilOnEnded()); ASSERT_TRUE(WaitUntilOnEnded());
} }
TEST_F(PipelineIntegrationTest, PipelineStoppedWhileAudioRestartPending) {
ASSERT_EQ(PIPELINE_OK, Start("bear-320x240.webm"));
Play();
// Disable audio track first, to re-enable it later and stop the pipeline
// (which destroys the media renderer) while audio restart is pending.
std::vector<MediaTrack::Id> track_ids;
pipeline_->OnEnabledAudioTracksChanged(track_ids);
ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(TimestampMs(200)));
track_ids.push_back("2");
pipeline_->OnEnabledAudioTracksChanged(track_ids);
Stop();
}
TEST_F(PipelineIntegrationTest, PipelineStoppedWhileVideoRestartPending) {
ASSERT_EQ(PIPELINE_OK, Start("bear-320x240.webm"));
Play();
// Disable video track first, to re-enable it later and stop the pipeline
// (which destroys the media renderer) while video restart is pending.
std::vector<MediaTrack::Id> track_ids;
pipeline_->OnSelectedVideoTrackChanged(track_ids);
ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(TimestampMs(200)));
track_ids.push_back("1");
pipeline_->OnSelectedVideoTrackChanged(track_ids);
Stop();
}
TEST_F(PipelineIntegrationTest, TEST_F(PipelineIntegrationTest,
MAYBE_CLOCKLESS(BasicPlaybackOpusOggTrimmingHashed)) { MAYBE_CLOCKLESS(BasicPlaybackOpusOggTrimmingHashed)) {
ASSERT_EQ(PIPELINE_OK, ASSERT_EQ(PIPELINE_OK,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment