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 #ifndef NSDOMMEDIASTREAM_H_
7 #define NSDOMMEDIASTREAM_H_
9 #include "ImageContainer.h"
11 #include "nsCycleCollectionParticipant.h"
12 #include "nsWrapperCache.h"
13 #include "nsIPrincipal.h"
14 #include "MediaTrackConstraints.h"
15 #include "mozilla/DOMEventTargetHelper.h"
16 #include "mozilla/RelativeTimeline.h"
17 #include "mozilla/WeakPtr.h"
24 enum class BlockingMode
;
27 class HTMLCanvasElement
;
28 class MediaStreamTrack
;
29 class MediaStreamTrackSource
;
30 class AudioStreamTrack
;
31 class VideoStreamTrack
;
39 #define NS_DOMMEDIASTREAM_IID \
41 0x8cb65468, 0x66c0, 0x444e, { \
42 0x89, 0x9f, 0x89, 0x1d, 0x9e, 0xd2, 0xbe, 0x7c \
47 * DOMMediaStream is the implementation of the js-exposed MediaStream interface.
49 * This is a thin main-thread class grouping MediaStreamTracks together.
51 class DOMMediaStream
: public DOMEventTargetHelper
,
52 public RelativeTimeline
,
53 public SupportsWeakPtr
{
54 typedef dom::MediaStreamTrack MediaStreamTrack
;
55 typedef dom::AudioStreamTrack AudioStreamTrack
;
56 typedef dom::VideoStreamTrack VideoStreamTrack
;
57 typedef dom::MediaStreamTrackSource MediaStreamTrackSource
;
60 typedef dom::MediaTrackConstraints MediaTrackConstraints
;
62 class TrackListener
: public nsISupports
{
64 NS_DECL_CYCLE_COLLECTING_ISUPPORTS
65 NS_DECL_CYCLE_COLLECTION_CLASS(TrackListener
)
68 * Called when the DOMMediaStream has a live track added, either by
69 * script (addTrack()) or the source creating one.
71 virtual void NotifyTrackAdded(const RefPtr
<MediaStreamTrack
>& aTrack
){};
74 * Called when the DOMMediaStream removes a live track from playback, either
75 * by script (removeTrack(), track.stop()) or the source ending it.
77 virtual void NotifyTrackRemoved(const RefPtr
<MediaStreamTrack
>& aTrack
){};
80 * Called when the DOMMediaStream has become active.
82 virtual void NotifyActive(){};
85 * Called when the DOMMediaStream has become inactive.
87 virtual void NotifyInactive(){};
90 * Called when the DOMMediaStream has become audible.
92 virtual void NotifyAudible(){};
95 * Called when the DOMMediaStream has become inaudible.
97 virtual void NotifyInaudible(){};
100 virtual ~TrackListener() = default;
103 explicit DOMMediaStream(nsPIDOMWindowInner
* aWindow
);
105 NS_DECL_ISUPPORTS_INHERITED
106 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DOMMediaStream
, DOMEventTargetHelper
)
107 NS_DECLARE_STATIC_IID_ACCESSOR(NS_DOMMEDIASTREAM_IID
)
109 virtual JSObject
* WrapObject(JSContext
* aCx
,
110 JS::Handle
<JSObject
*> aGivenProto
) override
;
114 static already_AddRefed
<DOMMediaStream
> Constructor(
115 const dom::GlobalObject
& aGlobal
, ErrorResult
& aRv
);
117 static already_AddRefed
<DOMMediaStream
> Constructor(
118 const dom::GlobalObject
& aGlobal
, const DOMMediaStream
& aStream
,
121 static already_AddRefed
<DOMMediaStream
> Constructor(
122 const dom::GlobalObject
& aGlobal
,
123 const dom::Sequence
<OwningNonNull
<MediaStreamTrack
>>& aTracks
,
126 static already_AddRefed
<dom::Promise
> CountUnderlyingStreams(
127 const dom::GlobalObject
& aGlobal
, ErrorResult
& aRv
);
129 void GetId(nsAString
& aID
) const;
131 void GetAudioTracks(nsTArray
<RefPtr
<AudioStreamTrack
>>& aTracks
) const;
132 void GetAudioTracks(nsTArray
<RefPtr
<MediaStreamTrack
>>& aTracks
) const;
133 void GetVideoTracks(nsTArray
<RefPtr
<VideoStreamTrack
>>& aTracks
) const;
134 void GetVideoTracks(nsTArray
<RefPtr
<MediaStreamTrack
>>& aTracks
) const;
135 void GetTracks(nsTArray
<RefPtr
<MediaStreamTrack
>>& aTracks
) const;
136 MediaStreamTrack
* GetTrackById(const nsAString
& aId
) const;
137 void AddTrack(MediaStreamTrack
& aTrack
);
138 void RemoveTrack(MediaStreamTrack
& aTrack
);
139 already_AddRefed
<DOMMediaStream
> Clone();
143 IMPL_EVENT_HANDLER(addtrack
)
144 IMPL_EVENT_HANDLER(removetrack
)
148 // Returns true if this stream contains a live audio track.
149 bool Audible() const;
152 * Returns true if this DOMMediaStream has aTrack in mTracks.
154 bool HasTrack(const MediaStreamTrack
& aTrack
) const;
157 * Returns a principal indicating who may access this stream. The stream
158 * contents can only be accessed by principals subsuming this principal.
160 already_AddRefed
<nsIPrincipal
> GetPrincipal();
162 // Webrtc allows the remote side to name a stream whatever it wants, and we
163 // need to surface this to content.
164 void AssignId(const nsAString
& aID
) { mID
= aID
; }
167 * Adds a MediaStreamTrack to mTracks and raises "addtrack".
169 * Note that "addtrack" is raised synchronously and only has an effect if
170 * this MediaStream is already exposed to script. For spec compliance this is
171 * to be called from an async task.
173 void AddTrackInternal(MediaStreamTrack
* aTrack
);
176 * Removes a MediaStreamTrack from mTracks and fires "removetrack" if it
179 * Note that "removetrack" is raised synchronously and only has an effect if
180 * this MediaStream is already exposed to script. For spec compliance this is
181 * to be called from an async task.
183 void RemoveTrackInternal(MediaStreamTrack
* aTrack
);
186 * Add an nsISupports object that this stream will keep alive as long as
187 * the stream itself is alive.
189 void AddConsumerToKeepAlive(nsISupports
* aConsumer
) {
190 mConsumersToKeepAlive
.AppendElement(aConsumer
);
193 // Registers a track listener to this MediaStream, for listening to changes
194 // to our track set. The caller must call UnregisterTrackListener before
195 // being destroyed, so we don't hold on to a dead pointer. Main thread only.
196 void RegisterTrackListener(TrackListener
* aListener
);
198 // Unregisters a track listener from this MediaStream. The caller must call
199 // UnregisterTrackListener before being destroyed, so we don't hold on to
200 // a dead pointer. Main thread only.
201 void UnregisterTrackListener(TrackListener
* aListener
);
204 virtual ~DOMMediaStream();
208 // Dispatches NotifyActive() to all registered track listeners.
211 // Dispatches NotifyInactive() to all registered track listeners.
212 void NotifyInactive();
214 // Dispatches NotifyAudible() to all registered track listeners.
215 void NotifyAudible();
217 // Dispatches NotifyInaudible() to all registered track listeners.
218 void NotifyInaudible();
220 // Dispatches NotifyTrackAdded() to all registered track listeners.
221 void NotifyTrackAdded(const RefPtr
<MediaStreamTrack
>& aTrack
);
223 // Dispatches NotifyTrackRemoved() to all registered track listeners.
224 void NotifyTrackRemoved(const RefPtr
<MediaStreamTrack
>& aTrack
);
226 // Dispatches "addtrack" or "removetrack".
227 nsresult
DispatchTrackEvent(const nsAString
& aName
,
228 const RefPtr
<MediaStreamTrack
>& aTrack
);
230 // MediaStreamTracks contained by this DOMMediaStream.
231 nsTArray
<RefPtr
<MediaStreamTrack
>> mTracks
;
233 // Listener tracking when live MediaStreamTracks in mTracks end.
234 class PlaybackTrackListener
;
235 RefPtr
<PlaybackTrackListener
> mPlaybackTrackListener
;
239 // Keep these alive while the stream is alive.
240 nsTArray
<nsCOMPtr
<nsISupports
>> mConsumersToKeepAlive
;
242 // The track listeners subscribe to changes in this stream's track set.
243 nsTArray
<RefPtr
<TrackListener
>> mTrackListeners
;
245 // True if this stream has live tracks.
246 bool mActive
= false;
248 // True if this stream has live audio tracks.
249 bool mAudible
= false;
252 NS_DEFINE_STATIC_IID_ACCESSOR(DOMMediaStream
, NS_DOMMEDIASTREAM_IID
)
254 } // namespace mozilla
256 #endif /* NSDOMMEDIASTREAM_H_ */