Commit 4af1611e authored by Markus Handell's avatar Markus Handell Committed by Commit Bot

MediaStreamVideoTrack: survive source getting deallocated.

This change fixes a problem where MediaStreamVideoTrack would would CHECK-fail
when the source has been cleared or deallocated AND a call to either SetEnabled,
AddEncodedSink or RemoveEncodedSink occurs.

The change also includes a new unit test for this case which was previously
uncovered.

Change-Id: Iab02df69277b2d2a287e2505977ce94345afb848
Bug: 1013590
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1993291Reviewed-by: default avatarHenrik Boström <hbos@chromium.org>
Commit-Queue: Markus Handell <handellm@google.com>
Cr-Commit-Position: refs/heads/master@{#730138}
parent 4c4bcbc2
...@@ -494,7 +494,8 @@ void MediaStreamVideoTrack::AddEncodedSink(WebMediaStreamSink* sink, ...@@ -494,7 +494,8 @@ void MediaStreamVideoTrack::AddEncodedSink(WebMediaStreamSink* sink,
DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
AddSinkInternal(&encoded_sinks_, sink); AddSinkInternal(&encoded_sinks_, sink);
frame_deliverer_->AddEncodedCallback(sink, std::move(callback)); frame_deliverer_->AddEncodedCallback(sink, std::move(callback));
source_->UpdateNumEncodedSinks(); if (source_)
source_->UpdateNumEncodedSinks();
UpdateSourceHasConsumers(); UpdateSourceHasConsumers();
} }
...@@ -514,7 +515,8 @@ void MediaStreamVideoTrack::RemoveEncodedSink(WebMediaStreamSink* sink) { ...@@ -514,7 +515,8 @@ void MediaStreamVideoTrack::RemoveEncodedSink(WebMediaStreamSink* sink) {
DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
RemoveSinkInternal(&encoded_sinks_, sink); RemoveSinkInternal(&encoded_sinks_, sink);
frame_deliverer_->RemoveEncodedCallback(sink); frame_deliverer_->RemoveEncodedCallback(sink);
source_->UpdateNumEncodedSinks(); if (source_)
source_->UpdateNumEncodedSinks();
UpdateSourceHasConsumers(); UpdateSourceHasConsumers();
} }
...@@ -532,7 +534,8 @@ void MediaStreamVideoTrack::SetEnabled(bool enabled) { ...@@ -532,7 +534,8 @@ void MediaStreamVideoTrack::SetEnabled(bool enabled) {
// need a new keyframe from the source as we may have dropped data making the // need a new keyframe from the source as we may have dropped data making the
// stream undecodable. // stream undecodable.
bool maybe_await_key_frame = false; bool maybe_await_key_frame = false;
if (enabled && source_->SupportsEncodedOutput() && !encoded_sinks_.empty()) { if (enabled && source_ && source_->SupportsEncodedOutput() &&
!encoded_sinks_.empty()) {
source_->RequestRefreshFrame(); source_->RequestRefreshFrame();
maybe_await_key_frame = true; maybe_await_key_frame = true;
} }
......
...@@ -255,6 +255,22 @@ TEST_F(MediaStreamVideoTrackTest, SetEnabled) { ...@@ -255,6 +255,22 @@ TEST_F(MediaStreamVideoTrackTest, SetEnabled) {
sink.DisconnectFromTrack(); sink.DisconnectFromTrack();
} }
TEST_F(MediaStreamVideoTrackTest, SourceDetached) {
InitializeSource();
WebMediaStreamTrack track = CreateTrack();
MockMediaStreamVideoSink sink;
auto* video_track = MediaStreamVideoTrack::GetVideoTrack(track);
video_track->StopAndNotify(base::BindOnce([] {}));
sink.ConnectToTrack(track);
sink.ConnectEncodedToTrack(track);
video_track->SetEnabled(true);
video_track->SetEnabled(false);
WebMediaStreamTrack::Settings settings;
video_track->GetSettings(settings);
sink.DisconnectFromTrack();
sink.DisconnectEncodedFromTrack();
}
TEST_F(MediaStreamVideoTrackTest, SourceStopped) { TEST_F(MediaStreamVideoTrackTest, SourceStopped) {
InitializeSource(); InitializeSource();
MockMediaStreamVideoSink sink; MockMediaStreamVideoSink sink;
......
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