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

Fix crash in blink::MediaStreamRemoteVideoSource::RequestRefreshFrame.

This change fixes a crash in RequestRefreshFrame and also a few other
potential cases found during code inspection.

Bug: 1040626
Change-Id: I1cdeaa76b530b833dbdad8ab239ae66ee08bac60
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1994287Reviewed-by: default avatarHenrik Boström <hbos@chromium.org>
Commit-Queue: Markus Handell <handellm@google.com>
Cr-Commit-Position: refs/heads/master@{#730137}
parent 64fd4707
......@@ -335,7 +335,6 @@ size_t MediaStreamVideoSource::CountEncodedSinks() const {
void MediaStreamVideoSource::UpdateNumEncodedSinks() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
size_t count = CountEncodedSinks();
DCHECK(SupportsEncodedOutput() || count == 0);
if (count == 1) {
OnEncodedSinkEnabled();
} else if (count == 0) {
......
......@@ -407,6 +407,9 @@ void MediaStreamRemoteVideoSource::OnChanged(
bool MediaStreamRemoteVideoSource::SupportsEncodedOutput() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (!observer_ || !observer_->track()) {
return false;
}
scoped_refptr<webrtc::VideoTrackInterface> video_track(
static_cast<webrtc::VideoTrackInterface*>(observer_->track().get()));
return video_track->GetSource()->SupportsEncodedOutput();
......@@ -414,6 +417,9 @@ bool MediaStreamRemoteVideoSource::SupportsEncodedOutput() const {
void MediaStreamRemoteVideoSource::RequestRefreshFrame() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (!observer_ || !observer_->track()) {
return;
}
scoped_refptr<webrtc::VideoTrackInterface> video_track(
static_cast<webrtc::VideoTrackInterface*>(observer_->track().get()));
if (video_track->GetSource()) {
......@@ -423,6 +429,9 @@ void MediaStreamRemoteVideoSource::RequestRefreshFrame() {
void MediaStreamRemoteVideoSource::OnEncodedSinkEnabled() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (!observer_ || !observer_->track()) {
return;
}
scoped_refptr<webrtc::VideoTrackInterface> video_track(
static_cast<webrtc::VideoTrackInterface*>(observer_->track().get()));
video_track->GetSource()->AddEncodedSink(delegate_.get());
......@@ -430,7 +439,7 @@ void MediaStreamRemoteVideoSource::OnEncodedSinkEnabled() {
void MediaStreamRemoteVideoSource::OnEncodedSinkDisabled() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (!observer_->track()) {
if (!observer_ || !observer_->track()) {
return;
}
scoped_refptr<webrtc::VideoTrackInterface> video_track(
......
......@@ -188,7 +188,31 @@ TEST_F(MediaStreamRemoteVideoSourceTest, StartTrack) {
track->RemoveSink(&sink);
}
TEST_F(MediaStreamRemoteVideoSourceTest, RemoteTrackStop) {
TEST_F(MediaStreamRemoteVideoSourceTest,
SourceTerminationWithEncodedSinkAdded) {
std::unique_ptr<blink::MediaStreamVideoTrack> track(CreateTrack());
blink::MockMediaStreamVideoSink sink;
track->AddEncodedSink(&sink, sink.GetDeliverEncodedVideoFrameCB());
source()->OnSourceTerminated();
track->RemoveEncodedSink(&sink);
}
TEST_F(MediaStreamRemoteVideoSourceTest,
SourceTerminationBeforeEncodedSinkAdded) {
std::unique_ptr<blink::MediaStreamVideoTrack> track(CreateTrack());
blink::MockMediaStreamVideoSink sink;
source()->OnSourceTerminated();
track->AddEncodedSink(&sink, sink.GetDeliverEncodedVideoFrameCB());
track->RemoveEncodedSink(&sink);
}
TEST_F(MediaStreamRemoteVideoSourceTest,
SourceTerminationBeforeRequestRefreshFrame) {
source()->OnSourceTerminated();
source()->RequestRefreshFrame();
}
TEST_F(MediaStreamRemoteVideoSourceTest, SurvivesSourceTermination) {
std::unique_ptr<blink::MediaStreamVideoTrack> track(CreateTrack());
blink::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