--- a/dom/camera/DOMCameraControl.cpp
+++ b/dom/camera/DOMCameraControl.cpp
@@ -525,17 +525,17 @@ nsDOMCameraControl::TrackCreated(TrackID
MOZ_RELEASE_ASSERT(mWindow, "Shouldn't have been created with a null window!");
nsIPrincipal* principal = mWindow->GetExtantDoc()
? mWindow->GetExtantDoc()->NodePrincipal()
: nullptr;
// This track is not connected through a port.
MediaInputPort* inputPort = nullptr;
dom::VideoStreamTrack* track =
- new dom::VideoStreamTrack(this, aTrackID, aTrackID, nsString(),
+ new dom::VideoStreamTrack(this, aTrackID, aTrackID,
new BasicUnstoppableTrackSource(principal));
RefPtr<TrackPort> port =
new TrackPort(inputPort, track,
TrackPort::InputPortOwnership::OWNED);
mTracks.AppendElement(port.forget());
NotifyTrackAdded(track);
}
--- a/dom/html/HTMLCanvasElement.cpp
+++ b/dom/html/HTMLCanvasElement.cpp
@@ -677,17 +677,17 @@ HTMLCanvasElement::CaptureStream(const O
nsCOMPtr<nsIPrincipal> principal = NodePrincipal();
nsresult rv =
stream->Init(aFrameRate, videoTrackId, principal);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
- stream->CreateDOMTrack(videoTrackId, MediaSegment::VIDEO, nsString(),
+ stream->CreateDOMTrack(videoTrackId, MediaSegment::VIDEO,
new BasicUnstoppableTrackSource(principal));
rv = RegisterFrameCaptureListener(stream->FrameCaptureListener());
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -1869,17 +1869,19 @@ class HTMLMediaElement::CaptureStreamTra
public DecoderPrincipalChangeObserver
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(CaptureStreamTrackSource,
MediaStreamTrackSource)
explicit CaptureStreamTrackSource(HTMLMediaElement* aElement)
- : MediaStreamTrackSource(nsCOMPtr<nsIPrincipal>(aElement->GetCurrentPrincipal()), true)
+ : MediaStreamTrackSource(nsCOMPtr<nsIPrincipal>(aElement->GetCurrentPrincipal()),
+ true,
+ nsString())
, mElement(aElement)
{
MOZ_ASSERT(mElement);
mElement->AddDecoderPrincipalChangeObserver(this);
}
MediaSourceEnum GetMediaSource() const override
{
@@ -2013,24 +2015,24 @@ HTMLMediaElement::CaptureStreamInternal(
aFinishWhenEnded);
if (mReadyState >= HAVE_METADATA) {
// Expose the tracks to JS directly.
if (HasAudio()) {
TrackID audioTrackId = mMediaInfo.mAudio.mTrackId;
RefPtr<MediaStreamTrackSource> trackSource =
getter->GetMediaStreamTrackSource(audioTrackId);
out->mStream->CreateDOMTrack(audioTrackId, MediaSegment::AUDIO,
- nsString(), trackSource);
+ trackSource);
}
if (HasVideo()) {
TrackID videoTrackId = mMediaInfo.mVideo.mTrackId;
RefPtr<MediaStreamTrackSource> trackSource =
getter->GetMediaStreamTrackSource(videoTrackId);
out->mStream->CreateDOMTrack(videoTrackId, MediaSegment::VIDEO,
- nsString(), trackSource);
+ trackSource);
}
}
}
RefPtr<DOMMediaStream> result = out->mStream;
return result.forget();
}
already_AddRefed<DOMMediaStream>
--- a/dom/media/AudioStreamTrack.h
+++ b/dom/media/AudioStreamTrack.h
@@ -10,19 +10,19 @@
#include "DOMMediaStream.h"
namespace mozilla {
namespace dom {
class AudioStreamTrack : public MediaStreamTrack {
public:
AudioStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
- TrackID aInputTrackID, const nsString& aLabel,
+ TrackID aInputTrackID,
MediaStreamTrackSource* aSource)
- : MediaStreamTrack(aStream, aTrackID, aInputTrackID, aLabel, aSource) {}
+ : MediaStreamTrack(aStream, aTrackID, aInputTrackID, aSource) {}
JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
AudioStreamTrack* AsAudioStreamTrack() override { return this; }
const AudioStreamTrack* AsAudioStreamTrack() const override { return this; }
// WebIDL
@@ -30,17 +30,16 @@ public:
protected:
already_AddRefed<MediaStreamTrack> CloneInternal(DOMMediaStream* aOwningStream,
TrackID aTrackID) override
{
return do_AddRef(new AudioStreamTrack(aOwningStream,
aTrackID,
mInputTrackID,
- mLabel,
mSource));
}
};
} // namespace dom
} // namespace mozilla
#endif /* AUDIOSTREAMTRACK_H_ */
--- a/dom/media/DOMMediaStream.cpp
+++ b/dom/media/DOMMediaStream.cpp
@@ -144,17 +144,17 @@ public:
}
if (!source) {
NS_ASSERTION(false, "Dynamic track created without an explicit TrackSource");
nsPIDOMWindowInner* window = mStream->GetParentObject();
nsIDocument* doc = window ? window->GetExtantDoc() : nullptr;
nsIPrincipal* principal = doc ? doc->NodePrincipal() : nullptr;
source = new BasicUnstoppableTrackSource(principal);
}
- track = mStream->CreateDOMTrack(aTrackID, aType, nsString(), source);
+ track = mStream->CreateDOMTrack(aTrackID, aType, source);
}
}
void DoNotifyTrackEnded(MediaStream* aInputStream, TrackID aInputTrackID)
{
MOZ_ASSERT(NS_IsMainThread());
if (!mStream) {
@@ -784,17 +784,17 @@ DOMMediaStream::InitAudioCaptureStream(n
RefPtr<BasicUnstoppableTrackSource> audioCaptureSource =
new BasicUnstoppableTrackSource(aPrincipal, MediaSourceEnum::AudioCapture);
AudioCaptureStream* audioCaptureStream =
static_cast<AudioCaptureStream*>(aGraph->CreateAudioCaptureStream(this, AUDIO_TRACK));
InitInputStreamCommon(audioCaptureStream, aGraph);
InitOwnedStreamCommon(aGraph);
InitPlaybackStreamCommon(aGraph);
- CreateDOMTrack(AUDIO_TRACK, MediaSegment::AUDIO, nsString(), audioCaptureSource);
+ CreateDOMTrack(AUDIO_TRACK, MediaSegment::AUDIO, audioCaptureSource);
audioCaptureStream->Start();
}
void
DOMMediaStream::InitInputStreamCommon(MediaStream* aStream,
MediaStreamGraph* aGraph)
{
MOZ_ASSERT(!mOwnedStream, "Input stream must be initialized before owned stream");
@@ -956,31 +956,30 @@ bool
DOMMediaStream::RemovePrincipalChangeObserver(
PrincipalChangeObserver<DOMMediaStream>* aObserver)
{
return mPrincipalChangeObservers.RemoveElement(aObserver);
}
MediaStreamTrack*
DOMMediaStream::CreateDOMTrack(TrackID aTrackID, MediaSegment::Type aType,
- const nsString& aLabel,
MediaStreamTrackSource* aSource)
{
MOZ_RELEASE_ASSERT(mInputStream);
MOZ_RELEASE_ASSERT(mOwnedStream);
MOZ_ASSERT(FindOwnedDOMTrack(GetInputStream(), aTrackID) == nullptr);
MediaStreamTrack* track;
switch (aType) {
case MediaSegment::AUDIO:
- track = new AudioStreamTrack(this, aTrackID, aTrackID, aLabel, aSource);
+ track = new AudioStreamTrack(this, aTrackID, aTrackID, aSource);
break;
case MediaSegment::VIDEO:
- track = new VideoStreamTrack(this, aTrackID, aTrackID, aLabel, aSource);
+ track = new VideoStreamTrack(this, aTrackID, aTrackID, aSource);
break;
default:
MOZ_CRASH("Unhandled track type");
}
LOG(LogLevel::Debug, ("DOMMediaStream %p Created new track %p with ID %u", this, track, aTrackID));
mOwnedTracks.AppendElement(
--- a/dom/media/DOMMediaStream.h
+++ b/dom/media/DOMMediaStream.h
@@ -517,17 +517,16 @@ public:
/**
* Called for each track in our owned stream to indicate to JS that we
* are carrying that track.
*
* Creates a MediaStreamTrack, adds it to mTracks and returns it.
*/
MediaStreamTrack* CreateDOMTrack(TrackID aTrackID, MediaSegment::Type aType,
- const nsString& aLabel,
MediaStreamTrackSource* aSource);
/**
* Creates a MediaStreamTrack cloned from aTrack, adds it to mTracks and
* returns it.
* aCloneTrackID is the TrackID the new track will get in mOwnedStream.
*/
already_AddRefed<MediaStreamTrack> CloneDOMTrack(MediaStreamTrack& aTrack,
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -837,21 +837,22 @@ public:
msg->RegisterCaptureStreamForWindow(
mWindowID, domStream->GetInputStream()->AsProcessedStream());
window->SetAudioCapture(true);
} else {
class LocalTrackSource : public MediaStreamTrackSource
{
public:
LocalTrackSource(nsIPrincipal* aPrincipal,
+ const nsString& aLabel,
GetUserMediaCallbackMediaStreamListener* aListener,
const MediaSourceEnum aSource,
const TrackID aTrackID,
const PeerIdentity* aPeerIdentity)
- : MediaStreamTrackSource(aPrincipal, false), mListener(aListener),
+ : MediaStreamTrackSource(aPrincipal, false, aLabel), mListener(aListener),
mSource(aSource), mTrackID(aTrackID), mPeerIdentity(aPeerIdentity) {}
MediaSourceEnum GetMediaSource() const override
{
return mSource;
}
const PeerIdentity* GetPeerIdentity() const override
@@ -920,31 +921,29 @@ public:
new FakeTrackSourceGetter(principal));
if (mAudioDevice) {
nsString audioDeviceName;
mAudioDevice->GetName(audioDeviceName);
const MediaSourceEnum source =
mAudioDevice->GetSource()->GetMediaSource();
RefPtr<MediaStreamTrackSource> audioSource =
- new LocalTrackSource(principal, mListener, source, kAudioTrack,
- mPeerIdentity);
- domStream->CreateDOMTrack(kAudioTrack, MediaSegment::AUDIO,
- audioDeviceName, audioSource);
+ new LocalTrackSource(principal, audioDeviceName, mListener, source,
+ kAudioTrack, mPeerIdentity);
+ domStream->CreateDOMTrack(kAudioTrack, MediaSegment::AUDIO, audioSource);
}
if (mVideoDevice) {
nsString videoDeviceName;
mVideoDevice->GetName(videoDeviceName);
const MediaSourceEnum source =
mVideoDevice->GetSource()->GetMediaSource();
RefPtr<MediaStreamTrackSource> videoSource =
- new LocalTrackSource(principal, mListener, source, kVideoTrack,
- mPeerIdentity);
- domStream->CreateDOMTrack(kVideoTrack, MediaSegment::VIDEO,
- videoDeviceName, videoSource);
+ new LocalTrackSource(principal, videoDeviceName, mListener, source,
+ kVideoTrack, mPeerIdentity);
+ domStream->CreateDOMTrack(kVideoTrack, MediaSegment::VIDEO, videoSource);
}
stream = domStream->GetInputStream()->AsSourceStream();
}
if (!domStream || sInShutdown) {
nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onFailure = mOnFailure.forget();
LOG(("Returning error for getUserMedia() - no stream"));
--- a/dom/media/MediaStreamTrack.cpp
+++ b/dom/media/MediaStreamTrack.cpp
@@ -95,21 +95,21 @@ public:
}
protected:
// These fields may only be accessed on the main thread
MediaStreamTrack* mTrack;
};
MediaStreamTrack::MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
- TrackID aInputTrackID, const nsString& aLabel,
+ TrackID aInputTrackID,
MediaStreamTrackSource* aSource)
: mOwningStream(aStream), mTrackID(aTrackID),
mInputTrackID(aInputTrackID), mSource(aSource),
- mPrincipal(aSource->GetPrincipal()), mLabel(aLabel),
+ mPrincipal(aSource->GetPrincipal()),
mEnded(false), mEnabled(true), mRemote(aSource->IsRemote()), mStopped(false)
{
if (!gMediaStreamTrackLog) {
gMediaStreamTrackLog = PR_NewLogModule("MediaStreamTrack");
}
GetSource().RegisterSink(this);
--- a/dom/media/MediaStreamTrack.h
+++ b/dom/media/MediaStreamTrack.h
@@ -50,19 +50,22 @@ class MediaStreamTrackSource : public ns
public:
class Sink
{
public:
virtual void PrincipalChanged() = 0;
};
- MediaStreamTrackSource(nsIPrincipal* aPrincipal, const bool aIsRemote)
+ MediaStreamTrackSource(nsIPrincipal* aPrincipal,
+ const bool aIsRemote,
+ const nsString& aLabel)
: mPrincipal(aPrincipal),
mIsRemote(aIsRemote),
+ mLabel(aLabel),
mStopped(false)
{
MOZ_COUNT_CTOR(MediaStreamTrackSource);
}
/**
* Gets the source's MediaSourceEnum for usage by PeerConnections.
*/
@@ -93,16 +96,21 @@ public:
/**
* Indicates whether the track is remote or not per the MediaCapture and
* Streams spec.
*/
virtual bool IsRemote() const { return mIsRemote; }
/**
+ * MediaStreamTrack::GetLabel (see spec) calls through to here.
+ */
+ void GetLabel(nsAString& aLabel) { aLabel.Assign(mLabel); }
+
+ /**
* Forwards a photo request to backends that support it. Other backends return
* NS_ERROR_NOT_IMPLEMENTED to indicate that a MediaStreamGraph-based fallback
* should be used.
*/
virtual nsresult TakePhoto(MediaEnginePhotoCallback*) const { return NS_ERROR_NOT_IMPLEMENTED; }
/**
* We provide a fallback solution to ApplyConstraints() here.
@@ -164,31 +172,36 @@ protected:
nsCOMPtr<nsIPrincipal> mPrincipal;
// Currently registered sinks.
nsTArray<Sink*> mSinks;
// True if this is a remote track source, i.e., a PeerConnection.
const bool mIsRemote;
+ // The label of the track we are the source of per the MediaStreamTrack spec.
+ const nsString mLabel;
+
// True if this source is not remote, all MediaStreamTrack users have
// unregistered from this source and Stop() has been called.
bool mStopped;
};
/**
* Basic implementation of MediaStreamTrackSource that ignores Stop().
*/
class BasicUnstoppableTrackSource : public MediaStreamTrackSource
{
public:
explicit BasicUnstoppableTrackSource(nsIPrincipal* aPrincipal,
const MediaSourceEnum aMediaSource =
MediaSourceEnum::Other)
- : MediaStreamTrackSource(aPrincipal, true), mMediaSource(aMediaSource) {}
+ : MediaStreamTrackSource(aPrincipal, true, nsString())
+ , mMediaSource(aMediaSource)
+ {}
MediaSourceEnum GetMediaSource() const override { return mMediaSource; }
void Stop() override {}
protected:
~BasicUnstoppableTrackSource() {}
@@ -213,17 +226,17 @@ class MediaStreamTrack : public DOMEvent
class PrincipalHandleListener;
public:
/**
* aTrackID is the MediaStreamGraph track ID for the track in the
* MediaStream owned by aStream.
*/
MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
- TrackID aInputTrackID, const nsString& aLabel,
+ TrackID aInputTrackID,
MediaStreamTrackSource* aSource);
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamTrack,
DOMEventTargetHelper)
nsPIDOMWindowInner* GetParentObject() const;
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override = 0;
@@ -232,17 +245,17 @@ public:
virtual VideoStreamTrack* AsVideoStreamTrack() { return nullptr; }
virtual const AudioStreamTrack* AsAudioStreamTrack() const { return nullptr; }
virtual const VideoStreamTrack* AsVideoStreamTrack() const { return nullptr; }
// WebIDL
virtual void GetKind(nsAString& aKind) = 0;
void GetId(nsAString& aID) const;
- void GetLabel(nsAString& aLabel) { aLabel.Assign(mLabel); }
+ void GetLabel(nsAString& aLabel) { GetSource().GetLabel(aLabel); }
bool Enabled() { return mEnabled; }
void SetEnabled(bool aEnabled);
void Stop();
already_AddRefed<Promise>
ApplyConstraints(const dom::MediaTrackConstraints& aConstraints, ErrorResult &aRv);
already_AddRefed<MediaStreamTrack> Clone();
bool Ended() const { return mEnded; }
@@ -371,17 +384,16 @@ protected:
TrackID mTrackID;
TrackID mInputTrackID;
RefPtr<MediaStreamTrackSource> mSource;
RefPtr<MediaStreamTrack> mOriginalTrack;
nsCOMPtr<nsIPrincipal> mPrincipal;
nsCOMPtr<nsIPrincipal> mPendingPrincipal;
RefPtr<PrincipalHandleListener> mPrincipalHandleListener;
nsString mID;
- nsString mLabel;
bool mEnded;
bool mEnabled;
const bool mRemote;
bool mStopped;
};
} // namespace dom
} // namespace mozilla
--- a/dom/media/VideoStreamTrack.h
+++ b/dom/media/VideoStreamTrack.h
@@ -10,19 +10,19 @@
#include "DOMMediaStream.h"
namespace mozilla {
namespace dom {
class VideoStreamTrack : public MediaStreamTrack {
public:
VideoStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
- TrackID aInputTrackID, const nsString& aLabel,
+ TrackID aInputTrackID,
MediaStreamTrackSource* aSource)
- : MediaStreamTrack(aStream, aTrackID, aInputTrackID, aLabel, aSource) {}
+ : MediaStreamTrack(aStream, aTrackID, aInputTrackID, aSource) {}
JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
VideoStreamTrack* AsVideoStreamTrack() override { return this; }
const VideoStreamTrack* AsVideoStreamTrack() const override { return this; }
// WebIDL
@@ -30,17 +30,16 @@ public:
protected:
already_AddRefed<MediaStreamTrack> CloneInternal(DOMMediaStream* aOwningStream,
TrackID aTrackID) override
{
return do_AddRef(new VideoStreamTrack(aOwningStream,
aTrackID,
mInputTrackID,
- mLabel,
mSource));
}
};
} // namespace dom
} // namespace mozilla
#endif /* VIDEOSTREAMTRACK_H_ */
--- a/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
+++ b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
@@ -35,17 +35,17 @@ MediaStreamAudioDestinationNode::MediaSt
aContext->Graph()))
{
// Ensure an audio track with the correct ID is exposed to JS
nsIDocument* doc = aContext->GetParentObject()->GetExtantDoc();
RefPtr<MediaStreamTrackSource> source =
new BasicUnstoppableTrackSource(doc->NodePrincipal(),
MediaSourceEnum::AudioCapture);
mDOMStream->CreateDOMTrack(AudioNodeStream::AUDIO_TRACK,
- MediaSegment::AUDIO, nsString(), source);
+ MediaSegment::AUDIO, source);
ProcessedMediaStream* outputStream = mDOMStream->GetInputStream()->AsProcessedStream();
MOZ_ASSERT(!!outputStream);
AudioNodeEngine* engine = new AudioNodeEngine(this);
mStream = AudioNodeStream::Create(aContext, engine,
AudioNodeStream::EXTERNAL_OUTPUT);
mPort = outputStream->AllocateInputPort(mStream, AudioNodeStream::AUDIO_TRACK);
}
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
@@ -1802,33 +1802,32 @@ PeerConnectionImpl::CreateNewRemoteTrack
++numNewAudioTracks;
} else if (track->GetMediaType() == SdpMediaSection::kVideo) {
++numNewVideoTracks;
} else {
MOZ_ASSERT(false);
continue;
}
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
- RefPtr<RemoteTrackSource> source = new RemoteTrackSource(principal);
+ RefPtr<RemoteTrackSource> source =
+ new RemoteTrackSource(principal, nsString());
#else
RefPtr<MediaStreamTrackSource> source = new MediaStreamTrackSource();
#endif
TrackID trackID = info->GetNextAvailableNumericTrackId();
RefPtr<MediaStreamTrack> domTrack;
if (track->GetMediaType() == SdpMediaSection::kAudio) {
domTrack =
info->GetMediaStream()->CreateDOMTrack(trackID,
MediaSegment::AUDIO,
- nsString(),
source);
} else {
domTrack =
info->GetMediaStream()->CreateDOMTrack(trackID,
MediaSegment::VIDEO,
- nsString(),
source);
}
info->AddTrack(track->GetTrackId(), domTrack);
CSFLogDebug(logTag, "Added remote track %s/%s",
info->GetId().c_str(), track->GetTrackId().c_str());
} else {
++numPreexistingTrackIds;
}
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.h
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.h
@@ -157,18 +157,18 @@ private:
already_AddRefed<MediaPipeline> ForgetPipelineByTrackId_m(
const std::string& trackId);
};
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
class RemoteTrackSource : public dom::MediaStreamTrackSource
{
public:
- explicit RemoteTrackSource(nsIPrincipal* aPrincipal)
- : dom::MediaStreamTrackSource(aPrincipal, true) {}
+ explicit RemoteTrackSource(nsIPrincipal* aPrincipal, const nsString& aLabel)
+ : dom::MediaStreamTrackSource(aPrincipal, true, aLabel) {}
dom::MediaSourceEnum GetMediaSource() const override
{
return dom::MediaSourceEnum::Other;
}
already_AddRefed<dom::Promise>
ApplyConstraints(nsPIDOMWindowInner* aWindow,
--- a/media/webrtc/signaling/test/FakeMediaStreams.h
+++ b/media/webrtc/signaling/test/FakeMediaStreams.h
@@ -526,17 +526,17 @@ public:
return ((mHintContents & HINT_CONTENTS_AUDIO) && aTrack.AsAudioStreamTrack()) ||
((mHintContents & HINT_CONTENTS_VIDEO) && aTrack.AsVideoStreamTrack());
}
void SetTrackEnabled(mozilla::TrackID aTrackID, bool aEnabled) {}
Fake_MediaStreamTrack*
CreateDOMTrack(mozilla::TrackID aTrackID, mozilla::MediaSegment::Type aType,
- const nsString& aLabel, Fake_MediaStreamTrackSource* aSource)
+ Fake_MediaStreamTrackSource* aSource)
{
switch(aType) {
case mozilla::MediaSegment::AUDIO: {
return mAudioTrack;
}
case mozilla::MediaSegment::VIDEO: {
return mVideoTrack;
}