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,
DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
AddSinkInternal(&encoded_sinks_, sink);
frame_deliverer_->AddEncodedCallback(sink, std::move(callback));
source_->UpdateNumEncodedSinks();
if (source_)
source_->UpdateNumEncodedSinks();
UpdateSourceHasConsumers();
}
......@@ -514,7 +515,8 @@ void MediaStreamVideoTrack::RemoveEncodedSink(WebMediaStreamSink* sink) {
DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
RemoveSinkInternal(&encoded_sinks_, sink);
frame_deliverer_->RemoveEncodedCallback(sink);
source_->UpdateNumEncodedSinks();
if (source_)
source_->UpdateNumEncodedSinks();
UpdateSourceHasConsumers();
}
......@@ -532,7 +534,8 @@ void MediaStreamVideoTrack::SetEnabled(bool enabled) {
// need a new keyframe from the source as we may have dropped data making the
// stream undecodable.
bool maybe_await_key_frame = false;
if (enabled && source_->SupportsEncodedOutput() && !encoded_sinks_.empty()) {
if (enabled && source_ && source_->SupportsEncodedOutput() &&
!encoded_sinks_.empty()) {
source_->RequestRefreshFrame();
maybe_await_key_frame = true;
}
......
......@@ -255,6 +255,22 @@ TEST_F(MediaStreamVideoTrackTest, SetEnabled) {
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) {
InitializeSource();
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