commit 92724719a6819d61174ee3d6dd0879c29c7d20cb
parent a091522bd31547e1cbf68cb5f60866119edf4a77
Author: Andreas Pehrson <apehrson@mozilla.com>
Date: Thu, 23 Oct 2025 14:11:16 +0000
Bug 1771789 - Add and use an API for MediaStreamTrackSource cloning. r=jib
Note, no sources implement it yet.
Differential Revision: https://phabricator.services.mozilla.com/D266381
Diffstat:
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/dom/media/MediaStreamTrack.cpp b/dom/media/MediaStreamTrack.cpp
@@ -46,6 +46,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MediaStreamTrackSource)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+auto MediaStreamTrackSource::Clone() -> CloneResult { return {}; }
+
auto MediaStreamTrackSource::ApplyConstraints(
const dom::MediaTrackConstraints& aConstraints, CallerType aCallerType)
-> RefPtr<ApplyConstraintsPromise> {
diff --git a/dom/media/MediaStreamTrack.h b/dom/media/MediaStreamTrack.h
@@ -128,6 +128,18 @@ class MediaStreamTrackSource : public nsISupports {
*/
virtual void Destroy() {}
+ struct CloneResult {
+ RefPtr<MediaStreamTrackSource> mSource;
+ RefPtr<mozilla::MediaTrack> mInputTrack;
+ };
+
+ /**
+ * Clone this MediaStreamTrackSource. Cloned sources allow independent track
+ * settings. Not supported by all source types. A source not supporting
+ * cloning returns nullptr.
+ */
+ virtual CloneResult Clone();
+
/**
* Gets the source's MediaSourceEnum for usage by PeerConnections.
*/
@@ -645,8 +657,15 @@ class MediaStreamTrack : public DOMEventTargetHelper, public SupportsWeakPtr {
template <typename TrackType>
already_AddRefed<MediaStreamTrack> CloneInternal() {
- auto newTrack = MakeRefPtr<TrackType>(mWindow, mInputTrack, mSource,
- ReadyState(), Muted(), mConstraints);
+ auto cloneRes = mSource->Clone();
+ MOZ_ASSERT(!!cloneRes.mSource == !!cloneRes.mInputTrack);
+ if (!cloneRes.mSource || !cloneRes.mInputTrack) {
+ cloneRes.mSource = mSource;
+ cloneRes.mInputTrack = mInputTrack;
+ }
+ auto newTrack =
+ MakeRefPtr<TrackType>(mWindow, cloneRes.mInputTrack, cloneRes.mSource,
+ ReadyState(), Muted(), mConstraints);
newTrack->SetEnabled(Enabled());
newTrack->SetMuted(Muted());
return newTrack.forget();