tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

MediaStreamWindowCapturer.cpp (2594B)


      1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      4 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #include "MediaStreamWindowCapturer.h"
      7 
      8 #include "AudioStreamTrack.h"
      9 #include "DOMMediaStream.h"
     10 #include "MediaTrackGraph.h"
     11 
     12 namespace mozilla {
     13 using dom::AudioStreamTrack;
     14 using dom::MediaStreamTrack;
     15 
     16 NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaStreamWindowCapturer,
     17                                   DOMMediaStream::TrackListener)
     18 NS_IMPL_ADDREF_INHERITED(MediaStreamWindowCapturer,
     19                         DOMMediaStream::TrackListener)
     20 NS_IMPL_RELEASE_INHERITED(MediaStreamWindowCapturer,
     21                          DOMMediaStream::TrackListener)
     22 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaStreamWindowCapturer)
     23 NS_INTERFACE_MAP_END_INHERITING(DOMMediaStream::TrackListener)
     24 
     25 MediaStreamWindowCapturer::CapturedTrack::CapturedTrack(
     26    MediaStreamTrack* aTrack, uint64_t aWindowID)
     27    : mTrack(aTrack),
     28      mPort(aTrack->Graph()->ConnectToCaptureTrack(aWindowID,
     29                                                   aTrack->GetTrack())) {}
     30 
     31 MediaStreamWindowCapturer::CapturedTrack::~CapturedTrack() {
     32  if (mPort) {
     33    mPort->Destroy();
     34  }
     35 }
     36 
     37 MediaStreamWindowCapturer::MediaStreamWindowCapturer(DOMMediaStream* aStream,
     38                                                     uint64_t aWindowId)
     39    : mStream(aStream), mWindowId(aWindowId) {
     40  nsTArray<RefPtr<AudioStreamTrack>> tracks;
     41  mStream->GetAudioTracks(tracks);
     42  for (const auto& t : tracks) {
     43    if (t->Ended()) {
     44      continue;
     45    }
     46    AddTrack(t);
     47  }
     48 }
     49 
     50 MediaStreamWindowCapturer::~MediaStreamWindowCapturer() = default;
     51 
     52 void MediaStreamWindowCapturer::NotifyTrackAdded(
     53    const RefPtr<MediaStreamTrack>& aTrack) {
     54  if (AudioStreamTrack* at = aTrack->AsAudioStreamTrack()) {
     55    AddTrack(at);
     56  }
     57 }
     58 
     59 void MediaStreamWindowCapturer::NotifyTrackRemoved(
     60    const RefPtr<MediaStreamTrack>& aTrack) {
     61  if (AudioStreamTrack* at = aTrack->AsAudioStreamTrack()) {
     62    RemoveTrack(at);
     63  }
     64 }
     65 
     66 void MediaStreamWindowCapturer::AddTrack(AudioStreamTrack* aTrack) {
     67  if (aTrack->Ended()) {
     68    return;
     69  }
     70  mTracks.AppendElement(MakeUnique<CapturedTrack>(aTrack, mWindowId));
     71 }
     72 
     73 void MediaStreamWindowCapturer::RemoveTrack(AudioStreamTrack* aTrack) {
     74  for (size_t i = mTracks.Length(); i > 0; --i) {
     75    if (mTracks[i - 1]->mTrack == aTrack) {
     76      mTracks.RemoveElementAt(i - 1);
     77      break;
     78    }
     79  }
     80 }
     81 }  // namespace mozilla