mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	This prevents HTMLMediaElements from being prematurely cycle-collected, and also makes things a bit safer. Differential Revision: https://phabricator.services.mozilla.com/D205734
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
 | 
						|
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 | 
						|
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
#include "MediaStreamWindowCapturer.h"
 | 
						|
 | 
						|
#include "AudioStreamTrack.h"
 | 
						|
#include "DOMMediaStream.h"
 | 
						|
#include "MediaTrackGraph.h"
 | 
						|
 | 
						|
namespace mozilla {
 | 
						|
using dom::AudioStreamTrack;
 | 
						|
using dom::MediaStreamTrack;
 | 
						|
 | 
						|
NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaStreamWindowCapturer,
 | 
						|
                                   DOMMediaStream::TrackListener)
 | 
						|
NS_IMPL_ADDREF_INHERITED(MediaStreamWindowCapturer,
 | 
						|
                         DOMMediaStream::TrackListener)
 | 
						|
NS_IMPL_RELEASE_INHERITED(MediaStreamWindowCapturer,
 | 
						|
                          DOMMediaStream::TrackListener)
 | 
						|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaStreamWindowCapturer)
 | 
						|
NS_INTERFACE_MAP_END_INHERITING(DOMMediaStream::TrackListener)
 | 
						|
 | 
						|
MediaStreamWindowCapturer::CapturedTrack::CapturedTrack(
 | 
						|
    MediaStreamTrack* aTrack, uint64_t aWindowID)
 | 
						|
    : mTrack(aTrack),
 | 
						|
      mPort(aTrack->Graph()->ConnectToCaptureTrack(aWindowID,
 | 
						|
                                                   aTrack->GetTrack())) {}
 | 
						|
 | 
						|
MediaStreamWindowCapturer::CapturedTrack::~CapturedTrack() {
 | 
						|
  if (mPort) {
 | 
						|
    mPort->Destroy();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
MediaStreamWindowCapturer::MediaStreamWindowCapturer(DOMMediaStream* aStream,
 | 
						|
                                                     uint64_t aWindowId)
 | 
						|
    : mStream(aStream), mWindowId(aWindowId) {
 | 
						|
  nsTArray<RefPtr<AudioStreamTrack>> tracks;
 | 
						|
  mStream->GetAudioTracks(tracks);
 | 
						|
  for (const auto& t : tracks) {
 | 
						|
    if (t->Ended()) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
    AddTrack(t);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
MediaStreamWindowCapturer::~MediaStreamWindowCapturer() = default;
 | 
						|
 | 
						|
void MediaStreamWindowCapturer::NotifyTrackAdded(
 | 
						|
    const RefPtr<MediaStreamTrack>& aTrack) {
 | 
						|
  if (AudioStreamTrack* at = aTrack->AsAudioStreamTrack()) {
 | 
						|
    AddTrack(at);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void MediaStreamWindowCapturer::NotifyTrackRemoved(
 | 
						|
    const RefPtr<MediaStreamTrack>& aTrack) {
 | 
						|
  if (AudioStreamTrack* at = aTrack->AsAudioStreamTrack()) {
 | 
						|
    RemoveTrack(at);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void MediaStreamWindowCapturer::AddTrack(AudioStreamTrack* aTrack) {
 | 
						|
  if (aTrack->Ended()) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  mTracks.AppendElement(MakeUnique<CapturedTrack>(aTrack, mWindowId));
 | 
						|
}
 | 
						|
 | 
						|
void MediaStreamWindowCapturer::RemoveTrack(AudioStreamTrack* aTrack) {
 | 
						|
  for (size_t i = mTracks.Length(); i > 0; --i) {
 | 
						|
    if (mTracks[i - 1]->mTrack == aTrack) {
 | 
						|
      mTracks.RemoveElementAt(i - 1);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
}  // namespace mozilla
 |