зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1213517 - Introduce AllocationHandle to MediaEngine::Allocate(). r=jesup
MozReview-Commit-ID: FKgK8OTwqbL --HG-- extra : rebase_source : b9532bc739e0f7ec78e2b964f7cf074981354332
This commit is contained in:
Родитель
e7503fa4a5
Коммит
6fa827422b
|
@ -586,11 +586,11 @@ public:
|
|||
NS_ASSERTION(!NS_IsMainThread(), "Never call on main thread");
|
||||
if (mAudioDevice) {
|
||||
mAudioDevice->GetSource()->Stop(source, kAudioTrack);
|
||||
mAudioDevice->GetSource()->Deallocate();
|
||||
mAudioDevice->Deallocate();
|
||||
}
|
||||
if (mVideoDevice) {
|
||||
mVideoDevice->GetSource()->Stop(source, kVideoTrack);
|
||||
mVideoDevice->GetSource()->Deallocate();
|
||||
mVideoDevice->Deallocate();
|
||||
}
|
||||
if (mType == MEDIA_STOP) {
|
||||
source->EndAllTrackAndFinish();
|
||||
|
@ -886,26 +886,20 @@ AudioDevice::GetSource()
|
|||
return static_cast<Source*>(&*mSource);
|
||||
}
|
||||
|
||||
nsresult VideoDevice::Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
nsresult MediaDevice::Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsACString& aOrigin) {
|
||||
return GetSource()->Allocate(aConstraints, aPrefs, mID, aOrigin);
|
||||
return GetSource()->Allocate(aConstraints, aPrefs, mID, aOrigin,
|
||||
getter_AddRefs(mAllocationHandle));
|
||||
}
|
||||
|
||||
nsresult AudioDevice::Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsACString& aOrigin) {
|
||||
return GetSource()->Allocate(aConstraints, aPrefs, mID, aOrigin);
|
||||
}
|
||||
|
||||
nsresult VideoDevice::Restart(const dom::MediaTrackConstraints &aConstraints,
|
||||
nsresult MediaDevice::Restart(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs) {
|
||||
return GetSource()->Restart(aConstraints, aPrefs, mID);
|
||||
}
|
||||
|
||||
nsresult AudioDevice::Restart(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs) {
|
||||
return GetSource()->Restart(aConstraints, aPrefs, mID);
|
||||
nsresult MediaDevice::Deallocate() {
|
||||
return GetSource()->Deallocate(mAllocationHandle);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1444,7 +1438,7 @@ public:
|
|||
if (NS_FAILED(rv)) {
|
||||
LOG(("Failed to allocate videosource %d\n",rv));
|
||||
if (mAudioDevice) {
|
||||
mAudioDevice->GetSource()->Deallocate();
|
||||
mAudioDevice->Deallocate();
|
||||
}
|
||||
Fail(NS_LITERAL_STRING("NotReadableError"),
|
||||
NS_LITERAL_STRING("Failed to allocate videosource"));
|
||||
|
|
|
@ -63,15 +63,25 @@ extern LogModule* GetMediaManagerLog();
|
|||
class MediaDevice : public nsIMediaDevice
|
||||
{
|
||||
public:
|
||||
typedef MediaEngineSource Source;
|
||||
|
||||
NS_DECL_THREADSAFE_ISUPPORTS
|
||||
NS_DECL_NSIMEDIADEVICE
|
||||
|
||||
void SetId(const nsAString& aID);
|
||||
virtual uint32_t GetBestFitnessDistance(
|
||||
const nsTArray<const dom::MediaTrackConstraintSet*>& aConstraintSets);
|
||||
virtual Source* GetSource() = 0;
|
||||
nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsACString& aOrigin);
|
||||
nsresult Restart(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs);
|
||||
nsresult Deallocate();
|
||||
protected:
|
||||
virtual ~MediaDevice() {}
|
||||
explicit MediaDevice(MediaEngineSource* aSource, bool aIsVideo);
|
||||
|
||||
static uint32_t FitnessDistance(nsString aN,
|
||||
const dom::OwningStringOrStringSequenceOrConstrainDOMStringParameters& aConstraint);
|
||||
private:
|
||||
|
@ -84,6 +94,7 @@ protected:
|
|||
nsString mID;
|
||||
dom::MediaSourceEnum mMediaSource;
|
||||
RefPtr<MediaEngineSource> mSource;
|
||||
RefPtr<MediaEngineSource::BaseAllocationHandle> mAllocationHandle;
|
||||
public:
|
||||
dom::MediaSourceEnum GetMediaSource() {
|
||||
return mMediaSource;
|
||||
|
@ -97,13 +108,8 @@ public:
|
|||
typedef MediaEngineVideoSource Source;
|
||||
|
||||
explicit VideoDevice(Source* aSource);
|
||||
NS_IMETHOD GetType(nsAString& aType);
|
||||
Source* GetSource();
|
||||
nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsACString& aOrigin);
|
||||
nsresult Restart(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs);
|
||||
NS_IMETHOD GetType(nsAString& aType) override;
|
||||
Source* GetSource() override;
|
||||
};
|
||||
|
||||
class AudioDevice : public MediaDevice
|
||||
|
@ -112,13 +118,8 @@ public:
|
|||
typedef MediaEngineAudioSource Source;
|
||||
|
||||
explicit AudioDevice(Source* aSource);
|
||||
NS_IMETHOD GetType(nsAString& aType);
|
||||
Source* GetSource();
|
||||
nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsACString& aOrigin);
|
||||
nsresult Restart(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs);
|
||||
NS_IMETHOD GetType(nsAString& aType) override;
|
||||
Source* GetSource() override;
|
||||
};
|
||||
|
||||
class GetUserMediaNotificationEvent: public Runnable
|
||||
|
|
|
@ -119,8 +119,16 @@ public:
|
|||
/* Populate the UUID of this device in the nsACString */
|
||||
virtual void GetUUID(nsACString&) = 0;
|
||||
|
||||
class BaseAllocationHandle
|
||||
{
|
||||
public:
|
||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BaseAllocationHandle);
|
||||
protected:
|
||||
virtual ~BaseAllocationHandle() {}
|
||||
};
|
||||
|
||||
/* Release the device back to the system. */
|
||||
virtual nsresult Deallocate() = 0;
|
||||
virtual nsresult Deallocate(BaseAllocationHandle* aHandle) = 0;
|
||||
|
||||
/* Start the device and add the track to the provided SourceMediaStream, with
|
||||
* the provided TrackID. You may start appending data to the track
|
||||
|
@ -179,7 +187,8 @@ public:
|
|||
virtual nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin) = 0;
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle) = 0;
|
||||
|
||||
virtual uint32_t GetBestFitnessDistance(
|
||||
const nsTArray<const dom::MediaTrackConstraintSet*>& aConstraintSets,
|
||||
|
|
|
@ -89,7 +89,8 @@ nsresult
|
|||
MediaEngineDefaultVideoSource::Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin)
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle)
|
||||
{
|
||||
if (mState != kReleased) {
|
||||
return NS_ERROR_FAILURE;
|
||||
|
@ -105,12 +106,14 @@ MediaEngineDefaultVideoSource::Allocate(const dom::MediaTrackConstraints &aConst
|
|||
mOpts.mWidth = mOpts.mWidth ? mOpts.mWidth : MediaEngine::DEFAULT_43_VIDEO_WIDTH;
|
||||
mOpts.mHeight = mOpts.mHeight ? mOpts.mHeight : MediaEngine::DEFAULT_43_VIDEO_HEIGHT;
|
||||
mState = kAllocated;
|
||||
aOutHandle = nullptr;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
MediaEngineDefaultVideoSource::Deallocate()
|
||||
MediaEngineDefaultVideoSource::Deallocate(BaseAllocationHandle* aHandle)
|
||||
{
|
||||
MOZ_ASSERT(!aHandle);
|
||||
if (mState != kStopped && mState != kAllocated) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
@ -410,7 +413,8 @@ nsresult
|
|||
MediaEngineDefaultAudioSource::Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin)
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle)
|
||||
{
|
||||
if (mState != kReleased) {
|
||||
return NS_ERROR_FAILURE;
|
||||
|
@ -426,12 +430,14 @@ MediaEngineDefaultAudioSource::Allocate(const dom::MediaTrackConstraints &aConst
|
|||
// generate sine wave (default 1KHz)
|
||||
mSineGenerator = new SineWaveGenerator(AUDIO_RATE,
|
||||
static_cast<uint32_t>(aPrefs.mFreq ? aPrefs.mFreq : 1000));
|
||||
aOutHandle = nullptr;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
MediaEngineDefaultAudioSource::Deallocate()
|
||||
MediaEngineDefaultAudioSource::Deallocate(BaseAllocationHandle* aHandle)
|
||||
{
|
||||
MOZ_ASSERT(!aHandle);
|
||||
if (mState != kStopped && mState != kAllocated) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
|
|
@ -47,8 +47,9 @@ public:
|
|||
nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin) override;
|
||||
nsresult Deallocate() override;
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle) override;
|
||||
nsresult Deallocate(BaseAllocationHandle* aHandle) override;
|
||||
nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) override;
|
||||
nsresult Stop(SourceMediaStream*, TrackID) override;
|
||||
nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
|
||||
|
@ -118,8 +119,9 @@ public:
|
|||
nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin) override;
|
||||
nsresult Deallocate() override;
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle) override;
|
||||
nsresult Deallocate(BaseAllocationHandle* aHandle) override;
|
||||
nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) override;
|
||||
nsresult Stop(SourceMediaStream*, TrackID) override;
|
||||
nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
|
||||
|
|
|
@ -87,20 +87,23 @@ MediaEngineRemoteVideoSource::Shutdown()
|
|||
MOZ_ASSERT(mState == kStopped);
|
||||
}
|
||||
|
||||
if (mState == kAllocated || mState == kStopped) {
|
||||
Deallocate();
|
||||
for (auto& registered : mRegisteredHandles) {
|
||||
MOZ_ASSERT(mState == kAllocated || mState == kStopped);
|
||||
Deallocate(registered.get());
|
||||
}
|
||||
|
||||
mState = kReleased;
|
||||
MOZ_ASSERT(mState == kReleased);
|
||||
mInitDone = false;
|
||||
return;
|
||||
}
|
||||
|
||||
nsresult
|
||||
MediaEngineRemoteVideoSource::Allocate(const dom::MediaTrackConstraints& aConstraints,
|
||||
const MediaEnginePrefs& aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin)
|
||||
MediaEngineRemoteVideoSource::Allocate(
|
||||
const dom::MediaTrackConstraints& aConstraints,
|
||||
const MediaEnginePrefs& aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle)
|
||||
{
|
||||
LOG((__PRETTY_FUNCTION__));
|
||||
AssertIsOnOwningThread();
|
||||
|
@ -110,6 +113,9 @@ MediaEngineRemoteVideoSource::Allocate(const dom::MediaTrackConstraints& aConstr
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
RefPtr<AllocationHandle> handle = new AllocationHandle(aConstraints);
|
||||
mRegisteredHandles.AppendElement(handle);
|
||||
|
||||
if (mState == kReleased) {
|
||||
// Note: if shared, we don't allow a later opener to affect the resolution.
|
||||
// (This may change depending on spec changes for Constraints/settings)
|
||||
|
@ -137,16 +143,28 @@ MediaEngineRemoteVideoSource::Allocate(const dom::MediaTrackConstraints& aConstr
|
|||
}
|
||||
|
||||
++mNrAllocations;
|
||||
|
||||
handle.forget(aOutHandle);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
MediaEngineRemoteVideoSource::Deallocate()
|
||||
MediaEngineRemoteVideoSource::Deallocate(BaseAllocationHandle* aHandle)
|
||||
{
|
||||
LOG((__PRETTY_FUNCTION__));
|
||||
AssertIsOnOwningThread();
|
||||
MOZ_ASSERT(aHandle);
|
||||
RefPtr<AllocationHandle> handle = static_cast<AllocationHandle*>(aHandle);
|
||||
|
||||
class Comparator {
|
||||
public:
|
||||
static bool Equals(const RefPtr<AllocationHandle>& a,
|
||||
const RefPtr<AllocationHandle>& b) {
|
||||
return a.get() == b.get();
|
||||
}
|
||||
};
|
||||
MOZ_ASSERT(mRegisteredHandles.Contains(handle, Comparator()));
|
||||
mRegisteredHandles.RemoveElementAt(mRegisteredHandles.IndexOf(handle, 0,
|
||||
Comparator()));
|
||||
--mNrAllocations;
|
||||
MOZ_ASSERT(mNrAllocations >= 0, "Double-deallocations are prohibited");
|
||||
|
||||
|
|
|
@ -71,11 +71,23 @@ public:
|
|||
dom::MediaSourceEnum aMediaSource,
|
||||
const char* aMonitorName = "RemoteVideo.Monitor");
|
||||
|
||||
class AllocationHandle : public BaseAllocationHandle
|
||||
{
|
||||
public:
|
||||
AllocationHandle(const dom::MediaTrackConstraints& aConstraints)
|
||||
: mConstraints(aConstraints) {}
|
||||
private:
|
||||
~AllocationHandle() override {}
|
||||
public:
|
||||
dom::MediaTrackConstraints mConstraints;
|
||||
};
|
||||
|
||||
nsresult Allocate(const dom::MediaTrackConstraints& aConstraints,
|
||||
const MediaEnginePrefs& aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin) override;
|
||||
nsresult Deallocate() override;;
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle) override;
|
||||
nsresult Deallocate(BaseAllocationHandle* aHandle) override;;
|
||||
nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) override;
|
||||
nsresult Stop(SourceMediaStream*, TrackID) override;
|
||||
nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
|
||||
|
@ -109,6 +121,8 @@ private:
|
|||
|
||||
dom::MediaSourceEnum mMediaSource; // source of media (camera | application | screen)
|
||||
mozilla::camera::CaptureEngine mCapEngine;
|
||||
|
||||
nsTArray<RefPtr<AllocationHandle>> mRegisteredHandles;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -139,14 +139,15 @@ nsresult
|
|||
MediaEngineTabVideoSource::Allocate(const dom::MediaTrackConstraints& aConstraints,
|
||||
const MediaEnginePrefs& aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin)
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle)
|
||||
{
|
||||
// windowId is not a proper constraint, so just read it.
|
||||
// It has no well-defined behavior in advanced, so ignore it there.
|
||||
|
||||
mWindowId = aConstraints.mBrowserWindow.WasPassed() ?
|
||||
aConstraints.mBrowserWindow.Value() : -1;
|
||||
|
||||
aOutHandle = nullptr;
|
||||
return Restart(aConstraints, aPrefs, aDeviceId);
|
||||
}
|
||||
|
||||
|
@ -178,8 +179,9 @@ MediaEngineTabVideoSource::Restart(const dom::MediaTrackConstraints& aConstraint
|
|||
}
|
||||
|
||||
nsresult
|
||||
MediaEngineTabVideoSource::Deallocate()
|
||||
MediaEngineTabVideoSource::Deallocate(BaseAllocationHandle* aHandle)
|
||||
{
|
||||
MOZ_ASSERT(!aHandle);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -25,8 +25,9 @@ class MediaEngineTabVideoSource : public MediaEngineVideoSource, nsIDOMEventList
|
|||
nsresult Allocate(const dom::MediaTrackConstraints &,
|
||||
const mozilla::MediaEnginePrefs&,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin) override;
|
||||
nsresult Deallocate() override;
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle) override;
|
||||
nsresult Deallocate(BaseAllocationHandle* aHandle) override;
|
||||
nsresult Start(mozilla::SourceMediaStream*, mozilla::TrackID, const mozilla::PrincipalHandle&) override;
|
||||
void SetDirectListeners(bool aHasDirectListeners) override {};
|
||||
void NotifyPull(mozilla::MediaStreamGraph*, mozilla::SourceMediaStream*, mozilla::TrackID, mozilla::StreamTime, const mozilla::PrincipalHandle& aPrincipalHandle) override;
|
||||
|
|
|
@ -77,14 +77,17 @@ public:
|
|||
nsresult Allocate(const dom::MediaTrackConstraints& aConstraints,
|
||||
const MediaEnginePrefs& aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin) override
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle) override
|
||||
{
|
||||
// Nothing to do here, everything is managed in MediaManager.cpp
|
||||
aOutHandle = nullptr;
|
||||
return NS_OK;
|
||||
}
|
||||
nsresult Deallocate() override
|
||||
nsresult Deallocate(BaseAllocationHandle* aHandle) override
|
||||
{
|
||||
// Nothing to do here, everything is managed in MediaManager.cpp
|
||||
MOZ_ASSERT(!aHandle);
|
||||
return NS_OK;
|
||||
}
|
||||
void Shutdown() override
|
||||
|
@ -451,8 +454,9 @@ public:
|
|||
nsresult Allocate(const dom::MediaTrackConstraints& aConstraints,
|
||||
const MediaEnginePrefs& aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin) override;
|
||||
nsresult Deallocate() override;
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle) override;
|
||||
nsresult Deallocate(BaseAllocationHandle* aHandle) override;
|
||||
nsresult Start(SourceMediaStream* aStream,
|
||||
TrackID aID,
|
||||
const PrincipalHandle& aPrincipalHandle) override;
|
||||
|
|
|
@ -222,7 +222,8 @@ nsresult
|
|||
MediaEngineWebRTCMicrophoneSource::Allocate(const dom::MediaTrackConstraints &aConstraints,
|
||||
const MediaEnginePrefs &aPrefs,
|
||||
const nsString& aDeviceId,
|
||||
const nsACString& aOrigin)
|
||||
const nsACString& aOrigin,
|
||||
BaseAllocationHandle** aOutHandle)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
if (mState == kReleased) {
|
||||
|
@ -258,6 +259,7 @@ MediaEngineWebRTCMicrophoneSource::Allocate(const dom::MediaTrackConstraints &aC
|
|||
}
|
||||
}
|
||||
++mNrAllocations;
|
||||
aOutHandle = nullptr;
|
||||
return Restart(aConstraints, aPrefs, aDeviceId);
|
||||
}
|
||||
|
||||
|
@ -309,9 +311,10 @@ MediaEngineWebRTCMicrophoneSource::Restart(const dom::MediaTrackConstraints& aCo
|
|||
}
|
||||
|
||||
nsresult
|
||||
MediaEngineWebRTCMicrophoneSource::Deallocate()
|
||||
MediaEngineWebRTCMicrophoneSource::Deallocate(BaseAllocationHandle* aHandle)
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
MOZ_ASSERT(!aHandle);
|
||||
--mNrAllocations;
|
||||
MOZ_ASSERT(mNrAllocations >= 0, "Double-deallocations are prohibited");
|
||||
if (mNrAllocations == 0) {
|
||||
|
@ -732,8 +735,9 @@ MediaEngineWebRTCMicrophoneSource::Shutdown()
|
|||
MOZ_ASSERT(mState == kStopped);
|
||||
}
|
||||
|
||||
if (mState == kAllocated || mState == kStopped) {
|
||||
Deallocate();
|
||||
while (mNrAllocations) {
|
||||
MOZ_ASSERT(mState == kAllocated || mState == kStopped);
|
||||
Deallocate(nullptr); // XXX Extend concurrent constraints code to mics.
|
||||
}
|
||||
|
||||
FreeChannel();
|
||||
|
|
Загрузка…
Ссылка в новой задаче