summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/MediaEngineDefault.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webrtc/MediaEngineDefault.h')
-rw-r--r--dom/media/webrtc/MediaEngineDefault.h215
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_ */