Skip to content

Commit e6053d8

Browse files
committed
Fix crash where a remote stream is removed before the promise resolves.
setRemoteDescription() ("SRD") is executed on the main thread, does work on the webrtc signaling thread which has callbacks that jump back to the main thread to fire events and resolve the promise. The callback on the main thread needs to know about the stream, tracks and their receivers. Previously, we invoked native_peer_connection_ ->GetReceivers() in the main thread callback. This was problematic in this case: SRD that adds stream x SRD that removes stream x By the time we do GetReceivers() in the main thread callback the stream may already have been removed from the native_peer_connection_ by the second SRD call. This lead to a crash because it couldn't find the receivers of the added stream. The fix is to do the GetReceivers() call while still on the webrtc signaling thread and not do any querying of the native_peer_connection_'s state from the main thread callback. Calling SRD in succession without waiting for the promises to resolve is inherently racey but this ensures the events fire without crashing and that we end up in the correct state. The indeterminate (racey) part is whether or not the stream fired in the first ontrack/onaddstream events contain the first track or is empty. TBR=hbos@chromium.org (cherry picked from commit 545dbdf) Bug: 759324 Change-Id: Icdbf6f255a046ddf67feee2e59dab48952219184 Reviewed-on: https://chromium-review.googlesource.com/647531 Reviewed-by: Guido Urdaneta <guidou@chromium.org> Commit-Queue: Henrik Boström <hbos@chromium.org> Cr-Original-Commit-Position: refs/heads/master@{#499601} Reviewed-on: https://chromium-review.googlesource.com/657101 Reviewed-by: Henrik Boström <hbos@chromium.org> Cr-Commit-Position: refs/branch-heads/3202@{#85} Cr-Branched-From: fa6a5d8-refs/heads/master@{#499098}
1 parent 6d09a73 commit e6053d8

File tree

9 files changed

+189
-76
lines changed

9 files changed

+189
-76
lines changed

chrome/browser/media/webrtc/webrtc_rtp_browsertest.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,3 +381,11 @@ IN_PROC_BROWSER_TEST_F(WebRtcRtpBrowserTest, SwitchRemoteStreamAndBackAgain) {
381381
EXPECT_EQ("ok",
382382
ExecuteJavascript("switchRemoteStreamAndBackAgain()", left_tab_));
383383
}
384+
385+
IN_PROC_BROWSER_TEST_F(WebRtcRtpBrowserTest,
386+
SwitchRemoteStreamWithoutWaitingForPromisesToResolve) {
387+
StartServerAndOpenTabs();
388+
EXPECT_EQ("ok", ExecuteJavascript(
389+
"switchRemoteStreamWithoutWaitingForPromisesToResolve()",
390+
left_tab_));
391+
}

chrome/test/data/webrtc/peerconnection_rtp.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,70 @@ function switchRemoteStreamAndBackAgain() {
275275
});
276276
}
277277

278+
function switchRemoteStreamWithoutWaitingForPromisesToResolve() {
279+
let pc = new RTCPeerConnection();
280+
let trackEventsFired = 0;
281+
let streamEventsFired = 0;
282+
pc.ontrack = (e) => {
283+
++trackEventsFired;
284+
if (trackEventsFired == 1) {
285+
if (e.track.id != 'track0')
286+
throw failTest('Unexpected track id in first track event.');
287+
if (e.receiver.track != e.track)
288+
throw failTest('Unexpected receiver.track in first track event.');
289+
if (e.streams[0].id != 'stream0')
290+
throw failTest('Unexpected stream id in first track event.');
291+
// Because we did not wait for promises to resolve before calling
292+
// |setRemoteDescription| a second time, it may or may not have had an
293+
// effect here. This is inherently racey and we have to check if the
294+
// stream contains the track.
295+
if (e.streams[0].getTracks().length != 0) {
296+
if (e.streams[0].getTracks()[0] != e.track)
297+
throw failTest('Unexpected track in stream in first track event.');
298+
}
299+
} else if (trackEventsFired == 2) {
300+
if (e.track.id != 'track1')
301+
throw failTest('Unexpected track id in second track event.');
302+
if (e.receiver.track != e.track)
303+
throw failTest('Unexpected receiver.track in second track event.');
304+
if (e.streams[0].id != 'stream1')
305+
throw failTest('Unexpected stream id in second track event.');
306+
if (e.streams[0].getTracks()[0] != e.track)
307+
throw failTest('The track should belong to the stream in the second ' +
308+
'track event.');
309+
if (streamEventsFired != trackEventsFired)
310+
throw failTest('All stream events should already have fired.');
311+
returnToTest('ok');
312+
}
313+
};
314+
pc.onaddstream = (e) => {
315+
++streamEventsFired;
316+
if (streamEventsFired == 1) {
317+
if (e.stream.id != 'stream0')
318+
throw failTest('Unexpected stream id in first stream event.');
319+
// Because we did not wait for promises to resolve before calling
320+
// |setRemoteDescription| a second time, it may or may not have had an
321+
// effect here. This is inherently racey and we have to check if the
322+
// stream contains the track.
323+
if (e.stream.getTracks().length != 0) {
324+
if (e.stream.getTracks()[0].id != 'track0')
325+
throw failTest('Unexpected track id in first stream event.');
326+
}
327+
} else if (streamEventsFired == 2) {
328+
if (e.stream.id != 'stream1')
329+
throw failTest('Unexpected stream id in second stream event.');
330+
if (e.stream.getTracks()[0].id != 'track1')
331+
throw failTest('Unexpected track id in second stream event.');
332+
}
333+
};
334+
pc.setRemoteDescription(createOffer('stream0', 'track0'));
335+
pc.setRemoteDescription(createOffer('stream1', 'track1'));
336+
}
337+
338+
// TODO(hbos): Also try switching back again for the case where IDs do match
339+
// but the objects are in fact different. Verify that they are different objects
340+
// like in the |switchRemoteStreamAndBackAgain| test.
341+
278342
/**
279343
* Invokes the GC and returns "ok-gc".
280344
*/

content/renderer/media/rtc_peer_connection_handler.cc

Lines changed: 80 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -925,23 +925,29 @@ std::set<RTCPeerConnectionHandler*>* GetPeerConnectionHandlers() {
925925
return handlers;
926926
}
927927

928-
bool IsReceiverForStream(
929-
const rtc::scoped_refptr<webrtc::RtpReceiverInterface>& webrtc_receiver,
930-
const scoped_refptr<webrtc::MediaStreamInterface>& webrtc_stream) {
931-
rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track =
932-
webrtc_receiver->track();
933-
if (webrtc_track->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) {
934-
for (const auto& track : webrtc_stream->GetAudioTracks()) {
935-
if (webrtc_track == track)
936-
return true;
937-
}
938-
} else {
939-
for (const auto& track : webrtc_stream->GetVideoTracks()) {
940-
if (webrtc_track == track)
941-
return true;
942-
}
943-
}
944-
return false;
928+
rtc::scoped_refptr<webrtc::RtpReceiverInterface> FindReceiverForTrack(
929+
const std::string& track_id,
930+
const std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>&
931+
webrtc_receivers) {
932+
for (const auto& webrtc_receiver : webrtc_receivers) {
933+
if (webrtc_receiver->track()->id() == track_id)
934+
return webrtc_receiver;
935+
}
936+
return nullptr;
937+
}
938+
939+
std::unique_ptr<RTCRtpReceiver> CreateRTCRtpReceiverForTrack(
940+
webrtc::MediaStreamTrackInterface* webrtc_track,
941+
const std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>&
942+
webrtc_receivers,
943+
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map) {
944+
auto webrtc_receiver =
945+
FindReceiverForTrack(webrtc_track->id(), webrtc_receivers);
946+
DCHECK(webrtc_receiver);
947+
auto track_adapter = track_adapter_map->GetRemoteTrackAdapter(webrtc_track);
948+
DCHECK(track_adapter);
949+
return base::MakeUnique<RTCRtpReceiver>(std::move(webrtc_receiver),
950+
std::move(track_adapter));
945951
}
946952

947953
} // namespace
@@ -995,10 +1001,15 @@ class RTCPeerConnectionHandler::Observer
9951001
Observer(const base::WeakPtr<RTCPeerConnectionHandler>& handler)
9961002
: handler_(handler),
9971003
main_thread_(base::ThreadTaskRunnerHandle::Get()),
998-
track_adapter_map_(handler_->track_adapter_map_) {
1004+
track_adapter_map_(handler_->track_adapter_map_),
1005+
native_peer_connection_(nullptr) {
9991006
DCHECK(track_adapter_map_);
10001007
}
10011008

1009+
void Initialize(webrtc::PeerConnectionInterface* native_peer_connection) {
1010+
native_peer_connection_ = native_peer_connection;
1011+
}
1012+
10021013
protected:
10031014
friend class base::RefCountedThreadSafe<RTCPeerConnectionHandler::Observer>;
10041015
virtual ~Observer() {}
@@ -1015,18 +1026,41 @@ class RTCPeerConnectionHandler::Observer
10151026
}
10161027
}
10171028

1018-
void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override {
1019-
DCHECK(stream);
1029+
void OnAddStream(
1030+
rtc::scoped_refptr<MediaStreamInterface> webrtc_stream) override {
1031+
DCHECK(webrtc_stream);
1032+
DCHECK(native_peer_connection_);
1033+
DCHECK(!main_thread_->BelongsToCurrentThread());
10201034
std::unique_ptr<RemoteMediaStreamImpl> remote_stream(
1021-
new RemoteMediaStreamImpl(main_thread_, track_adapter_map_, stream));
1035+
new RemoteMediaStreamImpl(main_thread_, track_adapter_map_,
1036+
webrtc_stream));
1037+
1038+
// Because |SetRemoteDescription| is asynchronous it is unsafe to query the
1039+
// |native_peer_connection_|'s state after the callback has jumped back to
1040+
// the main thread - something could happen in-between this callback on the
1041+
// signaling thread and |OnAddStreamImpl|. Every state that the callback on
1042+
// the main thread needs to know about has to be passed as arguments.
1043+
// Get all receivers that belong to the stream's track.
1044+
std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>
1045+
webrtc_receivers = native_peer_connection_->GetReceivers();
1046+
std::vector<std::unique_ptr<blink::WebRTCRtpReceiver>> stream_web_receivers;
1047+
for (const auto& webrtc_audio_track : webrtc_stream->GetAudioTracks()) {
1048+
stream_web_receivers.push_back(CreateRTCRtpReceiverForTrack(
1049+
webrtc_audio_track.get(), webrtc_receivers, track_adapter_map_));
1050+
}
1051+
for (const auto& webrtc_video_track : webrtc_stream->GetVideoTracks()) {
1052+
stream_web_receivers.push_back(CreateRTCRtpReceiverForTrack(
1053+
webrtc_video_track.get(), webrtc_receivers, track_adapter_map_));
1054+
}
10221055

1023-
// The webkit object owned by RemoteMediaStreamImpl, will be initialized
1024-
// asynchronously and the posted task will execude after that initialization
1056+
// The webkit object owned by |RemoteMediaStreamImpl|, will be initialized
1057+
// asynchronously and the posted task will execute after that initialization
10251058
// is done.
10261059
main_thread_->PostTask(
10271060
FROM_HERE,
10281061
base::BindOnce(&RTCPeerConnectionHandler::Observer::OnAddStreamImpl,
1029-
this, base::Passed(&remote_stream)));
1062+
this, base::Passed(&remote_stream),
1063+
base::Passed(&stream_web_receivers)));
10301064
}
10311065

10321066
void OnRemoveStream(
@@ -1101,9 +1135,13 @@ class RTCPeerConnectionHandler::Observer
11011135
candidate->candidate().address().family()));
11021136
}
11031137

1104-
void OnAddStreamImpl(std::unique_ptr<RemoteMediaStreamImpl> stream) {
1105-
if (handler_)
1106-
handler_->OnAddStream(std::move(stream));
1138+
void OnAddStreamImpl(std::unique_ptr<RemoteMediaStreamImpl> stream,
1139+
std::vector<std::unique_ptr<blink::WebRTCRtpReceiver>>
1140+
stream_webrtc_receivers) {
1141+
if (handler_) {
1142+
handler_->OnAddStream(std::move(stream),
1143+
std::move(stream_webrtc_receivers));
1144+
}
11071145
}
11081146

11091147
void OnRemoveStreamImpl(const scoped_refptr<MediaStreamInterface>& stream) {
@@ -1128,6 +1166,9 @@ class RTCPeerConnectionHandler::Observer
11281166
const base::WeakPtr<RTCPeerConnectionHandler> handler_;
11291167
const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
11301168
const scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map_;
1169+
// Raw pointer. Only guaranteed to be valid within within callbacks on the
1170+
// signaling thread since these are triggered by |native_peer_connection_|.
1171+
webrtc::PeerConnectionInterface* native_peer_connection_;
11311172
};
11321173

11331174
RTCPeerConnectionHandler::RTCPeerConnectionHandler(
@@ -1197,6 +1238,7 @@ bool RTCPeerConnectionHandler::Initialize(
11971238
peer_connection_observer_ = new Observer(weak_factory_.GetWeakPtr());
11981239
native_peer_connection_ = dependency_factory_->CreatePeerConnection(
11991240
configuration_, frame_, peer_connection_observer_.get());
1241+
peer_connection_observer_->Initialize(native_peer_connection_.get());
12001242

12011243
if (!native_peer_connection_.get()) {
12021244
LOG(ERROR) << "Failed to initialize native PeerConnection.";
@@ -1225,6 +1267,7 @@ bool RTCPeerConnectionHandler::InitializeForTest(
12251267

12261268
native_peer_connection_ = dependency_factory_->CreatePeerConnection(
12271269
configuration_, nullptr, peer_connection_observer_.get());
1270+
peer_connection_observer_->Initialize(native_peer_connection_.get());
12281271
if (!native_peer_connection_.get()) {
12291272
LOG(ERROR) << "Failed to initialize native PeerConnection.";
12301273
return false;
@@ -1991,7 +2034,9 @@ void RTCPeerConnectionHandler::OnRenegotiationNeeded() {
19912034
}
19922035

19932036
void RTCPeerConnectionHandler::OnAddStream(
1994-
std::unique_ptr<RemoteMediaStreamImpl> stream) {
2037+
std::unique_ptr<RemoteMediaStreamImpl> stream,
2038+
std::vector<std::unique_ptr<blink::WebRTCRtpReceiver>>
2039+
stream_webrtc_receivers) {
19952040
DCHECK(thread_checker_.CalledOnValidThread());
19962041
DCHECK(remote_streams_.find(stream->webrtc_stream().get()) ==
19972042
remote_streams_.end());
@@ -2011,27 +2056,14 @@ void RTCPeerConnectionHandler::OnAddStream(
20112056
track_metrics_.AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM,
20122057
stream_ptr->webrtc_stream().get());
20132058
if (!is_closed_) {
2014-
// Get receivers for the tracks in this stream. We need to filter out the
2015-
// webrtc layer receivers of interest before creating content layer
2016-
// receivers so that we don't end up with content layer receivers for
2017-
// receivers of remote streams that have not been processed yet (this could
2018-
// yield track adapters that have not completed initialization).
2019-
// Note: This performs a synchronous call to the webrtc signaling thread.
2020-
// Once we switch over to |OnAddTrack| we'll get rid of these thread hops
2021-
// since it will contain the receiver. https://crbug.com/741619
2022-
std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>
2023-
webrtc_receivers = native_peer_connection_->GetReceivers();
2024-
std::vector<std::unique_ptr<blink::WebRTCRtpReceiver>> stream_web_receivers;
2025-
for (const auto& webrtc_receiver : webrtc_receivers) {
2026-
if (IsReceiverForStream(webrtc_receiver, stream_ptr->webrtc_stream()))
2027-
stream_web_receivers.push_back(GetWebRTCRtpReceiver(webrtc_receiver));
2028-
}
2029-
blink::WebVector<std::unique_ptr<blink::WebRTCRtpReceiver>> result(
2030-
stream_web_receivers.size());
2031-
for (size_t i = 0; i < stream_web_receivers.size(); ++i) {
2032-
result[i] = std::move(stream_web_receivers[i]);
2059+
blink::WebVector<std::unique_ptr<blink::WebRTCRtpReceiver>>
2060+
web_vector_stream_webrtc_receivers(stream_webrtc_receivers.size());
2061+
for (size_t i = 0; i < stream_webrtc_receivers.size(); ++i) {
2062+
web_vector_stream_webrtc_receivers[i] =
2063+
std::move(stream_webrtc_receivers[i]);
20332064
}
2034-
client_->DidAddRemoteStream(stream_ptr->webkit_stream(), &result);
2065+
client_->DidAddRemoteStream(stream_ptr->webkit_stream(),
2066+
&web_vector_stream_webrtc_receivers);
20352067
}
20362068
}
20372069

content/renderer/media/rtc_peer_connection_handler.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,9 @@ class CONTENT_EXPORT RTCPeerConnectionHandler
199199
void OnIceGatheringChange(
200200
webrtc::PeerConnectionInterface::IceGatheringState new_state);
201201
void OnRenegotiationNeeded();
202-
void OnAddStream(std::unique_ptr<RemoteMediaStreamImpl> stream);
202+
void OnAddStream(
203+
std::unique_ptr<RemoteMediaStreamImpl> stream,
204+
std::vector<std::unique_ptr<blink::WebRTCRtpReceiver>> web_receivers);
203205
void OnRemoveStream(
204206
const scoped_refptr<webrtc::MediaStreamInterface>& stream);
205207
void OnDataChannel(std::unique_ptr<RtcDataChannelHandler> handler);

content/renderer/media/webrtc/rtc_rtp_receiver.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ RTCRtpReceiver::RTCRtpReceiver(
2323
track_adapter_(std::move(track_adapter)) {
2424
DCHECK(webrtc_rtp_receiver_);
2525
DCHECK(track_adapter_);
26-
DCHECK_EQ(track_adapter_->webrtc_track(), webrtc_rtp_receiver_->track());
2726
}
2827

2928
RTCRtpReceiver::~RTCRtpReceiver() {}

content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,20 @@ scoped_refptr<WebRtcMediaStreamTrackAdapter>
3737
WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter(
3838
PeerConnectionDependencyFactory* factory,
3939
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
40-
webrtc::MediaStreamTrackInterface* webrtc_track) {
40+
const scoped_refptr<webrtc::MediaStreamTrackInterface>& webrtc_track) {
4141
DCHECK(factory);
4242
DCHECK(!main_thread->BelongsToCurrentThread());
4343
DCHECK(webrtc_track);
4444
scoped_refptr<WebRtcMediaStreamTrackAdapter> remote_track_adapter(
4545
new WebRtcMediaStreamTrackAdapter(factory, main_thread));
4646
if (webrtc_track->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) {
47-
remote_track_adapter->InitializeRemoteAudioTrack(
48-
static_cast<webrtc::AudioTrackInterface*>(webrtc_track));
47+
remote_track_adapter->InitializeRemoteAudioTrack(make_scoped_refptr(
48+
static_cast<webrtc::AudioTrackInterface*>(webrtc_track.get())));
4949
} else {
5050
DCHECK_EQ(webrtc_track->kind(),
5151
webrtc::MediaStreamTrackInterface::kVideoKind);
52-
remote_track_adapter->InitializeRemoteVideoTrack(
53-
static_cast<webrtc::VideoTrackInterface*>(webrtc_track));
52+
remote_track_adapter->InitializeRemoteVideoTrack(make_scoped_refptr(
53+
static_cast<webrtc::VideoTrackInterface*>(webrtc_track.get())));
5454
}
5555
return remote_track_adapter;
5656
}
@@ -174,15 +174,15 @@ void WebRtcMediaStreamTrackAdapter::InitializeLocalVideoTrack(
174174
}
175175

176176
void WebRtcMediaStreamTrackAdapter::InitializeRemoteAudioTrack(
177-
webrtc::AudioTrackInterface* webrtc_audio_track) {
177+
const scoped_refptr<webrtc::AudioTrackInterface>& webrtc_audio_track) {
178178
DCHECK(!main_thread_->BelongsToCurrentThread());
179179
DCHECK(!is_initialized_);
180180
DCHECK(!remote_track_can_complete_initialization_.IsSignaled());
181181
DCHECK(webrtc_audio_track);
182182
DCHECK_EQ(webrtc_audio_track->kind(),
183183
webrtc::MediaStreamTrackInterface::kAudioKind);
184184
remote_audio_track_adapter_ =
185-
new RemoteAudioTrackAdapter(main_thread_, webrtc_audio_track);
185+
new RemoteAudioTrackAdapter(main_thread_, webrtc_audio_track.get());
186186
webrtc_track_ = webrtc_audio_track;
187187
remote_track_can_complete_initialization_.Signal();
188188
main_thread_->PostTask(
@@ -193,13 +193,13 @@ void WebRtcMediaStreamTrackAdapter::InitializeRemoteAudioTrack(
193193
}
194194

195195
void WebRtcMediaStreamTrackAdapter::InitializeRemoteVideoTrack(
196-
webrtc::VideoTrackInterface* webrtc_video_track) {
196+
const scoped_refptr<webrtc::VideoTrackInterface>& webrtc_video_track) {
197197
DCHECK(!main_thread_->BelongsToCurrentThread());
198198
DCHECK(webrtc_video_track);
199199
DCHECK_EQ(webrtc_video_track->kind(),
200200
webrtc::MediaStreamTrackInterface::kVideoKind);
201201
remote_video_track_adapter_ =
202-
new RemoteVideoTrackAdapter(main_thread_, webrtc_video_track);
202+
new RemoteVideoTrackAdapter(main_thread_, webrtc_video_track.get());
203203
webrtc_track_ = webrtc_video_track;
204204
remote_track_can_complete_initialization_.Signal();
205205
main_thread_->PostTask(

content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,19 @@ class CONTENT_EXPORT WebRtcMediaStreamTrackAdapter
3232
: public base::RefCountedThreadSafe<WebRtcMediaStreamTrackAdapter> {
3333
public:
3434
// Invoke on the main thread. The returned adapter is fully initialized, see
35-
// |is_initialized|.
35+
// |is_initialized|. The adapter will keep a reference to the |main_thread|.
3636
static scoped_refptr<WebRtcMediaStreamTrackAdapter> CreateLocalTrackAdapter(
3737
PeerConnectionDependencyFactory* factory,
3838
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
3939
const blink::WebMediaStreamTrack& web_track);
4040
// Invoke on the webrtc signaling thread. Initialization finishes on the main
4141
// thread in a post, meaning returned adapters are ensured to be initialized
42-
// in posts to the main thread, see |is_initialized|.
42+
// in posts to the main thread, see |is_initialized|. The adapter will keep
43+
// references to the |main_thread| and |webrtc_track|.
4344
static scoped_refptr<WebRtcMediaStreamTrackAdapter> CreateRemoteTrackAdapter(
4445
PeerConnectionDependencyFactory* factory,
4546
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
46-
webrtc::MediaStreamTrackInterface* webrtc_track);
47+
const scoped_refptr<webrtc::MediaStreamTrackInterface>& webrtc_track);
4748
// Must be called before all external references are released (i.e. before
4849
// destruction). Invoke on the main thread. Disposing may finish
4950
// asynchronously using the webrtc signaling thread and the main thread. After
@@ -88,9 +89,9 @@ class CONTENT_EXPORT WebRtcMediaStreamTrackAdapter
8889
// Initialization of remote tracks starts on the webrtc signaling thread and
8990
// finishes on the main thread.
9091
void InitializeRemoteAudioTrack(
91-
webrtc::AudioTrackInterface* webrtc_audio_track);
92+
const scoped_refptr<webrtc::AudioTrackInterface>& webrtc_audio_track);
9293
void InitializeRemoteVideoTrack(
93-
webrtc::VideoTrackInterface* webrtc_video_track);
94+
const scoped_refptr<webrtc::VideoTrackInterface>& webrtc_video_track);
9495
void FinalizeRemoteTrackInitializationOnMainThread();
9596
void EnsureTrackIsInitialized();
9697

0 commit comments

Comments
 (0)