Support arbitrary video resolution in getUserMedia API
[WebKit-https.git] / Source / WebCore / platform / mediastream / RealtimeVideoSource.h
index 1fb0334..3ba373a 100644 (file)
 #include "ImageBuffer.h"
 #include "MediaSample.h"
 #include "RealtimeMediaSource.h"
+#include "VideoPreset.h"
 #include <wtf/Lock.h>
 #include <wtf/RunLoop.h>
 
 namespace WebCore {
 
-struct FrameRateRange;
-struct VideoPreset;
-
 class RealtimeVideoSource : public RealtimeMediaSource {
 public:
     virtual ~RealtimeVideoSource();
@@ -50,16 +48,19 @@ protected:
     bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
     void setSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
 
-    using VideoPresets = Vector<VideoPreset>;
-    void setSupportedPresets(VideoPresets&&);
+    virtual void generatePresets() = 0;
+    virtual bool prefersPreset(VideoPreset&) { return true; }
+    virtual void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset>) { };
+    virtual bool canResizeVideoFrames() const { return false; }
+    bool shouldUsePreset(VideoPreset& current, VideoPreset& candidate);
 
-    struct CaptureSizeAndFrameRate {
-        IntSize size;
-        double frameRate;
-    };
-    std::optional<CaptureSizeAndFrameRate> bestSupportedSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>);
+    void setSupportedPresets(const Vector<Ref<VideoPreset>>&);
+    void setSupportedPresets(Vector<VideoPresetData>&&);
+    const Vector<Ref<VideoPreset>>& presets();
 
-    void addSupportedCapabilities(RealtimeMediaSourceCapabilities&) const;
+    bool frameRateRangeIncludesRate(const FrameRateRange&, double);
+
+    void updateCapabilities(RealtimeMediaSourceCapabilities&);
 
     void setDefaultSize(const IntSize& size) { m_defaultSize = size; }
 
@@ -68,75 +69,21 @@ protected:
     void dispatchMediaSampleToObservers(MediaSample&);
 
 private:
+    struct CaptureSizeAndFrameRate {
+        RefPtr<VideoPreset> encodingPreset;
+        IntSize requestedSize;
+        double requestedFrameRate { 0 };
+    };
+    bool supportsCaptureSize(std::optional<int>, std::optional<int>, const Function<bool(const IntSize&)>&&);
+    std::optional<CaptureSizeAndFrameRate> bestSupportedSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>);
+    bool presetSupportsFrameRate(RefPtr<VideoPreset>, double);
 
-    VideoPresets m_presets;
+    Vector<Ref<VideoPreset>> m_presets;
     Deque<double> m_observedFrameTimeStamps;
     double m_observedFrameRate { 0 };
     IntSize m_defaultSize;
 };
 
-struct FrameRateRange {
-    double minimum;
-    double maximum;
-
-    template<class Encoder> void encode(Encoder&) const;
-    template<class Decoder> static std::optional<FrameRateRange> decode(Decoder&);
-};
-
-template<class Encoder>
-void FrameRateRange::encode(Encoder& encoder) const
-{
-    encoder << minimum;
-    encoder << maximum;
-}
-
-template <class Decoder>
-std::optional<FrameRateRange> FrameRateRange::decode(Decoder& decoder)
-{
-    std::optional<double> minimum;
-    decoder >> minimum;
-    if (!minimum)
-        return std::nullopt;
-
-    std::optional<double> maximum;
-    decoder >> maximum;
-    if (!maximum)
-        return std::nullopt;
-
-    return FrameRateRange { *minimum, *maximum };
-}
-
-struct VideoPreset {
-    IntSize size;
-    Vector<FrameRateRange> frameRateRanges;
-
-    template<class Encoder> void encode(Encoder&) const;
-    template<class Decoder> static std::optional<VideoPreset> decode(Decoder&);
-};
-
-template<class Encoder>
-void VideoPreset::encode(Encoder& encoder) const
-{
-    encoder << size;
-    encoder << frameRateRanges;
-}
-
-template <class Decoder>
-std::optional<VideoPreset> VideoPreset::decode(Decoder& decoder)
-{
-    std::optional<IntSize> size;
-    decoder >> size;
-    if (!size)
-        return std::nullopt;
-
-    std::optional<Vector<FrameRateRange>> frameRateRanges;
-    decoder >> frameRateRanges;
-    if (!frameRateRanges)
-        return std::nullopt;
-
-    return VideoPreset { *size, *frameRateRanges };
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)