Commit 1c986af1 authored by xians@chromium.org's avatar xians@chromium.org

Fixed the crash when adding a chromium sink to remote audio track or adding a...

Fixed the crash when adding a chromium sink to remote audio track or adding a track to peerconnection more than once.

NOTRY=true

BUG=396447
TEST=open peerConnection demo, http://googlechrome.github.io/webrtc/samples/web/content/peerconnection/
2. start a call
3. Open JS console and input below codes:
# adding a chromium sink to remote audio track:
var v = new webkitMediaStream();
v.addTrack(pc2.getRemoteStreams()[0].getAudioTracks()[0]);
var a = document.createElement('audio');
a.src = URL.createObjectURL(v);

# add a track to peer connection more than once:
var v = new webkitMediaStream();
v.addTrack(pc2.getRemoteStreams()[0].getAudioTracks()[0]);
pc1.addStream(v);

Review URL: https://codereview.chromium.org/411903002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@285528 0039d316-1c4b-4281-b951-d872f2087c98
parent b75422a3
...@@ -49,13 +49,16 @@ bool MediaStreamTrackMetricsHost::OnMessageReceived( ...@@ -49,13 +49,16 @@ bool MediaStreamTrackMetricsHost::OnMessageReceived(
void MediaStreamTrackMetricsHost::OnAddTrack(uint64 id, void MediaStreamTrackMetricsHost::OnAddTrack(uint64 id,
bool is_audio, bool is_audio,
bool is_remote) { bool is_remote) {
DCHECK(tracks_.find(id) == tracks_.end()); if (tracks_.find(id) != tracks_.end())
return;
TrackInfo info = {is_audio, is_remote, base::TimeTicks::Now()}; TrackInfo info = {is_audio, is_remote, base::TimeTicks::Now()};
tracks_[id] = info; tracks_[id] = info;
} }
void MediaStreamTrackMetricsHost::OnRemoveTrack(uint64 id) { void MediaStreamTrackMetricsHost::OnRemoveTrack(uint64 id) {
DCHECK(tracks_.find(id) != tracks_.end()); if (tracks_.find(id) == tracks_.end())
return;
TrackInfo& info = tracks_[id]; TrackInfo& info = tracks_[id];
ReportDuration(info); ReportDuration(info);
......
...@@ -18,7 +18,11 @@ void MediaStreamAudioSink::AddToAudioTrack( ...@@ -18,7 +18,11 @@ void MediaStreamAudioSink::AddToAudioTrack(
DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio);
MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track); MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track);
// TODO(xians): Support remote audio track. // TODO(xians): Support remote audio track.
DCHECK(native_track->is_local_track()); if (!native_track->is_local_track()) {
LOG(ERROR) << "Can't add the sink to a remote audio track";
return;
}
WebRtcLocalAudioTrack* audio_track = WebRtcLocalAudioTrack* audio_track =
static_cast<WebRtcLocalAudioTrack*>(native_track); static_cast<WebRtcLocalAudioTrack*>(native_track);
audio_track->AddSink(sink); audio_track->AddSink(sink);
...@@ -29,7 +33,11 @@ void MediaStreamAudioSink::RemoveFromAudioTrack( ...@@ -29,7 +33,11 @@ void MediaStreamAudioSink::RemoveFromAudioTrack(
const blink::WebMediaStreamTrack& track) { const blink::WebMediaStreamTrack& track) {
MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track); MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track);
// TODO(xians): Support remote audio track. // TODO(xians): Support remote audio track.
DCHECK(native_track->is_local_track()); if (!native_track->is_local_track()) {
LOG(ERROR) << "Can't remove the sink from a remote audio track";
return;
}
WebRtcLocalAudioTrack* audio_track = WebRtcLocalAudioTrack* audio_track =
static_cast<WebRtcLocalAudioTrack*>(native_track); static_cast<WebRtcLocalAudioTrack*>(native_track);
audio_track->RemoveSink(sink); audio_track->RemoveSink(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