15a8d8a91a6889345aa677eafb55635557b88ebc
[WebKit-https.git] / Source / WebCore / platform / mediastream / RealtimeMediaSource.h
1 /*
2  * Copyright (C) 2011 Ericsson AB. All rights reserved.
3  * Copyright (C) 2012 Google Inc. All rights reserved.
4  * Copyright (C) 2013-2017 Apple Inc. All rights reserved.
5  * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer
15  *    in the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of Ericsson nor the names of its contributors
18  *    may be used to endorse or promote products derived from this
19  *    software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #pragma once
35
36 #if ENABLE(MEDIA_STREAM)
37
38 #include "AudioSourceProvider.h"
39 #include "CaptureDevice.h"
40 #include "Image.h"
41 #include "MediaConstraints.h"
42 #include "MediaSample.h"
43 #include "PlatformLayer.h"
44 #include "RealtimeMediaSourceCapabilities.h"
45 #include <wtf/RefCounted.h>
46 #include <wtf/Vector.h>
47 #include <wtf/WeakPtr.h>
48 #include <wtf/text/WTFString.h>
49
50 namespace WTF {
51 class MediaTime;
52 }
53
54 namespace WebCore {
55
56 class AudioStreamDescription;
57 class FloatRect;
58 class GraphicsContext;
59 class MediaStreamPrivate;
60 class OrientationNotifier;
61 class PlatformAudioData;
62 class RealtimeMediaSourceSettings;
63
64 struct CaptureSourceOrError;
65
66 class WEBCORE_EXPORT RealtimeMediaSource : public RefCounted<RealtimeMediaSource> {
67 public:
68     class Observer {
69     public:
70         virtual ~Observer() { }
71         
72         // Source state changes.
73         virtual void sourceStopped() { }
74         virtual void sourceMutedChanged() { }
75         virtual void sourceEnabledChanged() { }
76         virtual void sourceSettingsChanged() { }
77
78         // Observer state queries.
79         virtual bool preventSourceFromStopping() { return false; }
80         
81         // Called on the main thread.
82         virtual void videoSampleAvailable(MediaSample&) { }
83
84         // May be called on a background thread.
85         virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) { }
86     };
87
88     class AudioCaptureFactory {
89     public:
90         virtual ~AudioCaptureFactory() = default;
91         virtual CaptureSourceOrError createAudioCaptureSource(const String& audioDeviceID, const MediaConstraints*) = 0;
92         
93     protected:
94         AudioCaptureFactory() = default;
95     };
96
97     class VideoCaptureFactory {
98     public:
99         virtual ~VideoCaptureFactory() = default;
100         virtual CaptureSourceOrError createVideoCaptureSource(const String& videoDeviceID, const MediaConstraints*) = 0;
101
102     protected:
103         VideoCaptureFactory() = default;
104     };
105
106     virtual ~RealtimeMediaSource() { }
107
108     const String& id() const { return m_id; }
109
110     const String& persistentID() const { return m_persistentID; }
111     virtual void setPersistentID(const String& persistentID) { m_persistentID = persistentID; }
112
113     enum class Type { None, Audio, Video };
114     Type type() const { return m_type; }
115
116     virtual const String& name() const { return m_name; }
117     virtual void setName(const String& name) { m_name = name; }
118     
119     virtual unsigned fitnessScore() const { return m_fitnessScore; }
120
121     virtual const RealtimeMediaSourceCapabilities& capabilities() const = 0;
122     virtual const RealtimeMediaSourceSettings& settings() const = 0;
123
124     using SuccessHandler = std::function<void()>;
125     using FailureHandler = std::function<void(const String& badConstraint, const String& errorString)>;
126     virtual void applyConstraints(const MediaConstraints&, SuccessHandler&&, FailureHandler&&);
127     std::optional<std::pair<String, String>> applyConstraints(const MediaConstraints&);
128
129     virtual bool supportsConstraints(const MediaConstraints&, String&);
130     virtual bool supportsConstraint(const MediaConstraint&) const;
131
132     virtual void settingsDidChange();
133
134     virtual bool isIsolated() const { return false; }
135     
136     void videoSampleAvailable(MediaSample&);
137     void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t);
138     
139     bool stopped() const { return m_stopped; }
140
141     virtual bool muted() const { return m_muted; }
142     virtual void setMuted(bool);
143
144     virtual bool enabled() const { return m_enabled; }
145     virtual void setEnabled(bool);
146
147     virtual bool isCaptureSource() const { return false; }
148
149     virtual void monitorOrientation(OrientationNotifier&) { }
150     
151     WEBCORE_EXPORT void addObserver(Observer&);
152     WEBCORE_EXPORT void removeObserver(Observer&);
153
154     virtual void startProducingData() { }
155     virtual void stopProducingData() { }
156     virtual bool isProducingData() const { return false; }
157
158     void stop(Observer* callingObserver = nullptr);
159     void requestStop(Observer* callingObserver = nullptr);
160
161     virtual void reset();
162
163     virtual AudioSourceProvider* audioSourceProvider() { return nullptr; }
164
165     void setWidth(int);
166     void setHeight(int);
167     const IntSize& size() const { return m_size; }
168     virtual bool applySize(const IntSize&) { return false; }
169
170     double frameRate() const { return m_frameRate; }
171     void setFrameRate(double);
172     virtual bool applyFrameRate(double) { return false; }
173
174     double aspectRatio() const { return m_aspectRatio; }
175     void setAspectRatio(double);
176     virtual bool applyAspectRatio(double) { return false; }
177
178     RealtimeMediaSourceSettings::VideoFacingMode facingMode() const { return m_facingMode; }
179     void setFacingMode(RealtimeMediaSourceSettings::VideoFacingMode);
180     virtual bool applyFacingMode(RealtimeMediaSourceSettings::VideoFacingMode) { return false; }
181
182     double volume() const { return m_volume; }
183     void setVolume(double);
184     virtual bool applyVolume(double) { return false; }
185
186     int sampleRate() const { return m_sampleRate; }
187     void setSampleRate(int);
188     virtual bool applySampleRate(int) { return false; }
189
190     int sampleSize() const { return m_sampleSize; }
191     void setSampleSize(int);
192     virtual bool applySampleSize(int) { return false; }
193
194     bool echoCancellation() const { return m_echoCancellation; }
195     void setEchoCancellation(bool);
196     virtual bool applyEchoCancellation(bool) { return false; }
197
198 protected:
199     RealtimeMediaSource(const String& id, Type, const String& name);
200
201     void scheduleDeferredTask(std::function<void()>&&);
202
203     virtual void beginConfiguration() { }
204     virtual void commitConfiguration() { }
205
206     virtual bool selectSettings(const MediaConstraints&, FlattenedConstraint&, String&);
207     virtual double fitnessDistance(const MediaConstraint&);
208     virtual bool supportsSizeAndFrameRate(std::optional<IntConstraint> width, std::optional<IntConstraint> height, std::optional<DoubleConstraint>, String&, double& fitnessDistance);
209     virtual bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>);
210     virtual void applyConstraint(const MediaConstraint&);
211     virtual void applyConstraints(const FlattenedConstraint&);
212     virtual void applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>);
213
214     const Vector<Observer*> observers() const { return m_observers; }
215
216     void notifyMutedObservers() const;
217
218     void initializeVolume(double volume) { m_volume = volume; }
219     void initializeSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
220     void initializeEchoCancellation(bool echoCancellation) { m_echoCancellation = echoCancellation; }
221
222     bool m_muted { false };
223     bool m_enabled { true };
224
225 private:
226     WeakPtr<RealtimeMediaSource> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
227
228     WeakPtrFactory<RealtimeMediaSource> m_weakPtrFactory;
229     String m_id;
230     String m_persistentID;
231     Type m_type;
232     String m_name;
233     Vector<Observer*> m_observers;
234     IntSize m_size;
235     double m_frameRate { 30 };
236     double m_aspectRatio { 0 };
237     double m_volume { 1 };
238     double m_sampleRate { 0 };
239     double m_sampleSize { 0 };
240     double m_fitnessScore { std::numeric_limits<double>::infinity() };
241     RealtimeMediaSourceSettings::VideoFacingMode m_facingMode { RealtimeMediaSourceSettings::User};
242
243     bool m_echoCancellation { false };
244     bool m_stopped { false };
245     bool m_pendingSettingsDidChangeNotification { false };
246     bool m_suppressNotifications { true };
247 };
248
249 struct CaptureSourceOrError {
250     CaptureSourceOrError() = default;
251     CaptureSourceOrError(Ref<RealtimeMediaSource>&& source) : captureSource(WTFMove(source)) { }
252     CaptureSourceOrError(String&& message) : errorMessage(WTFMove(message)) { }
253     
254     operator bool()  const { return !!captureSource; }
255     Ref<RealtimeMediaSource> source() { return captureSource.releaseNonNull(); }
256     
257     RefPtr<RealtimeMediaSource> captureSource;
258     String errorMessage;
259 };
260
261 } // namespace WebCore
262
263 #endif // ENABLE(MEDIA_STREAM)