Bug 1213517 - Introduce AllocationHandle to MediaEngine::Allocate(). r=jesup

MozReview-Commit-ID: FKgK8OTwqbL

--HG--
extra : rebase_source : b9532bc739e0f7ec78e2b964f7cf074981354332
This commit is contained in:
Jan-Ivar Bruaroey 2016-06-30 15:43:24 -04:00
Родитель e7503fa4a5
Коммит 6fa827422b
11 изменённых файлов: 118 добавлений и 63 удалений

Просмотреть файл

@ -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();