Bug 1435673 - Fix calling Deallocate() without SetTrack(). r?padenot draft
authorAndreas Pehrson <pehrsons@mozilla.com>
Mon, 05 Feb 2018 10:48:23 +0100
changeset 751118 75f71e9cc2af266c9644ac9f60704ac37493023c
parent 750475 841512e696b91825d24c6dd1a18d277c5f7d2be4
child 751119 38ef97e16e0397ade3cce0b7d1f198406b00115c
push id97865
push userbmo:apehrson@mozilla.com
push dateMon, 05 Feb 2018 13:47:03 +0000
reviewerspadenot
bugs1435673, 1299515
milestone60.0a1
Bug 1435673 - Fix calling Deallocate() without SetTrack(). r?padenot Before bug 1299515 we assigned stream and track id in Allocate(), meaning that any Deallocate() had a guarantee of them being set. This changed to require an extra step of SetTrack() to assign stream and track id. Deallocate() needs to handle this, which it does with this patch. MozReview-Commit-ID: Js0cXXOR2Bb
dom/media/webrtc/MediaEngineRemoteVideoSource.cpp
dom/media/webrtc/MediaEngineTabVideoSource.cpp
dom/media/webrtc/MediaEngineWebRTCAudio.cpp
--- a/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp
+++ b/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp
@@ -211,20 +211,20 @@ MediaEngineRemoteVideoSource::Allocate(
 
 nsresult
 MediaEngineRemoteVideoSource::Deallocate(const RefPtr<const AllocationHandle>& aHandle)
 {
   LOG((__PRETTY_FUNCTION__));
   AssertIsOnOwningThread();
 
   MOZ_ASSERT(mState == kStopped || mState == kAllocated);
-  MOZ_ASSERT(mStream);
-  MOZ_ASSERT(IsTrackIDExplicit(mTrackID));
 
-  mStream->EndTrack(mTrackID);
+  if (mStream && IsTrackIDExplicit(mTrackID)) {
+    mStream->EndTrack(mTrackID);
+  }
 
   {
     MutexAutoLock lock(mMutex);
 
     mStream = nullptr;
     mTrackID = TRACK_NONE;
     mPrincipal = PRINCIPAL_HANDLE_NONE;
     mState = kReleased;
--- a/dom/media/webrtc/MediaEngineTabVideoSource.cpp
+++ b/dom/media/webrtc/MediaEngineTabVideoSource.cpp
@@ -192,17 +192,19 @@ MediaEngineTabVideoSource::Reconfigure(c
 
 nsresult
 MediaEngineTabVideoSource::Deallocate(const RefPtr<const AllocationHandle>& aHandle)
 {
   AssertIsOnOwningThread();
   MOZ_ASSERT(!aHandle);
   MOZ_ASSERT(mState == kAllocated || mState == kStopped);
 
-  MOZ_ASSERT(IsTrackIDExplicit(mTrackID));
+  if (mStream && IsTrackIDExplicit(mTrackID)) {
+    mStream->EndTrack(mTrackID);
+  }
 
   NS_DispatchToMainThread(do_AddRef(new DestroyRunnable(this)));
 
   {
     MutexAutoLock lock(mMutex);
     mState = kReleased;
   }
 
--- a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
@@ -595,17 +595,20 @@ nsresult
 MediaEngineWebRTCMicrophoneSource::Deallocate(const RefPtr<const AllocationHandle>& aHandle)
 {
   AssertIsOnOwningThread();
 
   size_t i = mAllocations.IndexOf(aHandle, 0, AllocationHandleComparator());
   MOZ_ASSERT(i != mAllocations.NoIndex);
   MOZ_ASSERT(!mAllocations[i].mEnabled,
              "Source should be stopped for the track before removing");
-  mAllocations[i].mStream->EndTrack(mAllocations[i].mTrackID);
+  if (mAllocations[i].mStream && IsTrackIDExplicit(mAllocations[i].mTrackID)) {
+    mAllocations[i].mStream->EndTrack(mAllocations[i].mTrackID);
+  }
+
   {
     MutexAutoLock lock(mMutex);
     mAllocations.RemoveElementAt(i);
   }
 
   if (mAllocations.IsEmpty()) {
     // If empty, no callbacks to deliver data should be occuring
     MOZ_ASSERT(mState != kReleased, "Source not allocated");