Bug 1890793: Assert CallArgs::newTarget is not gray. r=spidermonkey-reviewers,sfink...
[gecko.git] / dom / media / MediaStreamWindowCapturer.cpp
blob0e3eca801b63b8490c322ecf0f7aea0b94500f53
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/. */
6 #include "MediaStreamWindowCapturer.h"
8 #include "AudioStreamTrack.h"
9 #include "DOMMediaStream.h"
10 #include "MediaTrackGraph.h"
12 namespace mozilla {
13 using dom::AudioStreamTrack;
14 using dom::MediaStreamTrack;
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)
25 MediaStreamWindowCapturer::CapturedTrack::CapturedTrack(
26 MediaStreamTrack* aTrack, uint64_t aWindowID)
27 : mTrack(aTrack),
28 mPort(aTrack->Graph()->ConnectToCaptureTrack(aWindowID,
29 aTrack->GetTrack())) {}
31 MediaStreamWindowCapturer::CapturedTrack::~CapturedTrack() {
32 if (mPort) {
33 mPort->Destroy();
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;
46 AddTrack(t);
50 MediaStreamWindowCapturer::~MediaStreamWindowCapturer() = default;
52 void MediaStreamWindowCapturer::NotifyTrackAdded(
53 const RefPtr<MediaStreamTrack>& aTrack) {
54 if (AudioStreamTrack* at = aTrack->AsAudioStreamTrack()) {
55 AddTrack(at);
59 void MediaStreamWindowCapturer::NotifyTrackRemoved(
60 const RefPtr<MediaStreamTrack>& aTrack) {
61 if (AudioStreamTrack* at = aTrack->AsAudioStreamTrack()) {
62 RemoveTrack(at);
66 void MediaStreamWindowCapturer::AddTrack(AudioStreamTrack* aTrack) {
67 if (aTrack->Ended()) {
68 return;
70 mTracks.AppendElement(MakeUnique<CapturedTrack>(aTrack, mWindowId));
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;
81 } // namespace mozilla