Bug 1259788 - Remove direct track listeners from TrackUnionStream before inputs are removed. r?jesup
MozReview-Commit-ID: DTHF2pHEFSt
--- a/dom/media/TrackUnionStream.cpp
+++ b/dom/media/TrackUnionStream.cpp
@@ -53,16 +53,20 @@ TrackUnionStream::TrackUnionStream() :
void TrackUnionStream::RemoveInput(MediaInputPort* aPort)
{
STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p removing input %p", this, aPort));
for (int32_t i = mTrackMap.Length() - 1; i >= 0; --i) {
if (mTrackMap[i].mInputPort == aPort) {
STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p removing trackmap entry %d", this, i));
EndTrack(i);
+ for (auto listener : mTrackMap[i].mOwnedDirectListeners) {
+ // Remove listeners while the entry still exists.
+ RemoveDirectTrackListenerImpl(listener, mTrackMap[i].mOutputTrackID);
+ }
mTrackMap.RemoveElementAt(i);
}
}
ProcessedMediaStream::RemoveInput(aPort);
}
void TrackUnionStream::ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags)
{
if (IsFinishedOnGraphThread()) {
@@ -125,16 +129,20 @@ TrackUnionStream::TrackUnionStream() :
}
for (int32_t i = mTrackMap.Length() - 1; i >= 0; --i) {
if (mappedTracksFinished[i]) {
EndTrack(i);
} else {
allFinished = false;
}
if (!mappedTracksWithMatchingInputTracks[i]) {
+ for (auto listener : mTrackMap[i].mOwnedDirectListeners) {
+ // Remove listeners while the entry still exists.
+ RemoveDirectTrackListenerImpl(listener, mTrackMap[i].mOutputTrackID);
+ }
mTrackMap.RemoveElementAt(i);
}
}
if (allFinished && mAutofinish && (aFlags & ALLOW_FINISH)) {
// All streams have finished and won't add any more tracks, and
// all our tracks have actually finished and been removed from our map,
// so we're finished now.
FinishOnGraphThread();