diff options
Diffstat (limited to 'dom/media/webrtc/MediaEngineDefault.h')
-rw-r--r-- | dom/media/webrtc/MediaEngineDefault.h | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/dom/media/webrtc/MediaEngineDefault.h b/dom/media/webrtc/MediaEngineDefault.h new file mode 100644 index 000000000..c305e00bb --- /dev/null +++ b/dom/media/webrtc/MediaEngineDefault.h @@ -0,0 +1,215 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MEDIAENGINEDEFAULT_H_ +#define MEDIAENGINEDEFAULT_H_ + +#include "nsITimer.h" + +#include "nsAutoPtr.h" +#include "nsCOMPtr.h" +#include "DOMMediaStream.h" +#include "nsComponentManagerUtils.h" +#include "mozilla/Monitor.h" + +#include "VideoUtils.h" +#include "MediaEngine.h" +#include "VideoSegment.h" +#include "AudioSegment.h" +#include "StreamTracks.h" +#ifdef MOZ_WEBRTC +#include "MediaEngineCameraVideoSource.h" +#endif +#include "MediaStreamGraph.h" +#include "MediaTrackConstraints.h" + +namespace mozilla { + +namespace layers { +class ImageContainer; +} // namespace layers + +class MediaEngineDefault; + +/** + * The default implementation of the MediaEngine interface. + */ +class MediaEngineDefaultVideoSource : public nsITimerCallback, +#ifdef MOZ_WEBRTC + public MediaEngineCameraVideoSource +#else + public MediaEngineVideoSource +#endif +{ +public: + MediaEngineDefaultVideoSource(); + + void GetName(nsAString&) const override; + void GetUUID(nsACString&) const override; + + nsresult Allocate(const dom::MediaTrackConstraints &aConstraints, + const MediaEnginePrefs &aPrefs, + const nsString& aDeviceId, + const nsACString& aOrigin, + AllocationHandle** aOutHandle, + const char** aOutBadConstraint) override; + nsresult Deallocate(AllocationHandle* aHandle) override; + nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) override; + nsresult Stop(SourceMediaStream*, TrackID) override; + nsresult Restart(AllocationHandle* aHandle, + const dom::MediaTrackConstraints& aConstraints, + const MediaEnginePrefs &aPrefs, + const nsString& aDeviceId, + const char** aOutBadConstraint) override; + void SetDirectListeners(bool aHasDirectListeners) override {}; + void NotifyPull(MediaStreamGraph* aGraph, + SourceMediaStream *aSource, + TrackID aId, + StreamTime aDesiredTime, + const PrincipalHandle& aPrincipalHandle) override; + uint32_t GetBestFitnessDistance( + const nsTArray<const NormalizedConstraintSet*>& aConstraintSets, + const nsString& aDeviceId) const override; + + bool IsFake() override { + return true; + } + + dom::MediaSourceEnum GetMediaSource() const override { + return dom::MediaSourceEnum::Camera; + } + + nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) override + { + return NS_ERROR_NOT_IMPLEMENTED; + } + + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_NSITIMERCALLBACK + +protected: + ~MediaEngineDefaultVideoSource(); + + friend class MediaEngineDefault; + + TrackID mTrackID; + nsCOMPtr<nsITimer> mTimer; + // mMonitor protects mImage access/changes, and transitions of mState + // from kStarted to kStopped (which are combined with EndTrack() and + // image changes). + Monitor mMonitor; + RefPtr<layers::Image> mImage; + + RefPtr<layers::ImageContainer> mImageContainer; + + MediaEnginePrefs mOpts; + int mCb; + int mCr; +}; + +class SineWaveGenerator; + +class MediaEngineDefaultAudioSource : public MediaEngineAudioSource +{ +public: + MediaEngineDefaultAudioSource(); + + void GetName(nsAString&) const override; + void GetUUID(nsACString&) const override; + + nsresult Allocate(const dom::MediaTrackConstraints &aConstraints, + const MediaEnginePrefs &aPrefs, + const nsString& aDeviceId, + const nsACString& aOrigin, + AllocationHandle** aOutHandle, + const char** aOutBadConstraint) override; + nsresult Deallocate(AllocationHandle* aHandle) override; + nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) override; + nsresult Stop(SourceMediaStream*, TrackID) override; + nsresult Restart(AllocationHandle* aHandle, + const dom::MediaTrackConstraints& aConstraints, + const MediaEnginePrefs &aPrefs, + const nsString& aDeviceId, + const char** aOutBadConstraint) override; + void SetDirectListeners(bool aHasDirectListeners) override {}; + void inline AppendToSegment(AudioSegment& aSegment, + TrackTicks aSamples, + const PrincipalHandle& aPrincipalHandle); + void NotifyPull(MediaStreamGraph* aGraph, + SourceMediaStream *aSource, + TrackID aId, + StreamTime aDesiredTime, + const PrincipalHandle& aPrincipalHandle) override; + + void NotifyOutputData(MediaStreamGraph* aGraph, + AudioDataValue* aBuffer, size_t aFrames, + TrackRate aRate, uint32_t aChannels) override + {} + void NotifyInputData(MediaStreamGraph* aGraph, + const AudioDataValue* aBuffer, size_t aFrames, + TrackRate aRate, uint32_t aChannels) override + {} + void DeviceChanged() override + {} + bool IsFake() override { + return true; + } + + dom::MediaSourceEnum GetMediaSource() const override { + return dom::MediaSourceEnum::Microphone; + } + + nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) override + { + return NS_ERROR_NOT_IMPLEMENTED; + } + + uint32_t GetBestFitnessDistance( + const nsTArray<const NormalizedConstraintSet*>& aConstraintSets, + const nsString& aDeviceId) const override; + + NS_DECL_THREADSAFE_ISUPPORTS + +protected: + ~MediaEngineDefaultAudioSource(); + + TrackID mTrackID; + + TrackTicks mLastNotify; // Accessed in ::Start(), then on NotifyPull (from MSG thread) + + // Created on Allocate, then accessed from NotifyPull (MSG thread) + nsAutoPtr<SineWaveGenerator> mSineGenerator; +}; + + +class MediaEngineDefault : public MediaEngine +{ + typedef MediaEngine Super; +public: + explicit MediaEngineDefault() : mMutex("mozilla::MediaEngineDefault") {} + + void EnumerateVideoDevices(dom::MediaSourceEnum, + nsTArray<RefPtr<MediaEngineVideoSource> >*) override; + void EnumerateAudioDevices(dom::MediaSourceEnum, + nsTArray<RefPtr<MediaEngineAudioSource> >*) override; + void Shutdown() override { + MutexAutoLock lock(mMutex); + + mVSources.Clear(); + mASources.Clear(); + }; + +private: + ~MediaEngineDefault() {} + + Mutex mMutex; + // protected with mMutex: + + nsTArray<RefPtr<MediaEngineVideoSource> > mVSources; + nsTArray<RefPtr<MediaEngineAudioSource> > mASources; +}; + +} // namespace mozilla + +#endif /* NSMEDIAENGINEDEFAULT_H_ */ |