Unreviewed, rolling out r244627.
[WebKit-https.git] / Source / WebCore / platform / mediastream / VideoPreset.h
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(MEDIA_STREAM)
29
30 #include "FontCascade.h"
31 #include "ImageBuffer.h"
32 #include "MediaSample.h"
33 #include "RealtimeMediaSource.h"
34 #include <wtf/Lock.h>
35 #include <wtf/RunLoop.h>
36
37 namespace WebCore {
38
39 struct FrameRateRange {
40     double minimum;
41     double maximum;
42
43     template<class Encoder> void encode(Encoder&) const;
44     template<class Decoder> static Optional<FrameRateRange> decode(Decoder&);
45 };
46
47 template<class Encoder>
48 void FrameRateRange::encode(Encoder& encoder) const
49 {
50     encoder << minimum;
51     encoder << maximum;
52 }
53
54 template <class Decoder>
55 Optional<FrameRateRange> FrameRateRange::decode(Decoder& decoder)
56 {
57     Optional<double> minimum;
58     decoder >> minimum;
59     if (!minimum)
60         return WTF::nullopt;
61
62     Optional<double> maximum;
63     decoder >> maximum;
64     if (!maximum)
65         return WTF::nullopt;
66
67     return FrameRateRange { *minimum, *maximum };
68 }
69
70 struct VideoPresetData {
71     IntSize size;
72     Vector<FrameRateRange> frameRateRanges;
73
74     template<class Encoder> void encode(Encoder&) const;
75     template<class Decoder> static Optional<VideoPresetData> decode(Decoder&);
76 };
77
78 template<class Encoder>
79 void VideoPresetData::encode(Encoder& encoder) const
80 {
81     encoder << size;
82     encoder << frameRateRanges;
83 }
84
85 template <class Decoder>
86 Optional<VideoPresetData> VideoPresetData::decode(Decoder& decoder)
87 {
88     Optional<IntSize> size;
89     decoder >> size;
90     if (!size)
91         return WTF::nullopt;
92
93     Optional<Vector<FrameRateRange>> frameRateRanges;
94     decoder >> frameRateRanges;
95     if (!frameRateRanges)
96         return WTF::nullopt;
97
98     return VideoPresetData { *size, *frameRateRanges };
99 }
100
101 class VideoPreset : public RefCounted<VideoPreset> {
102 public:
103     static Ref<VideoPreset> create(VideoPresetData&& data)
104     {
105         return adoptRef(*new VideoPreset(data.size, WTFMove(data.frameRateRanges), Base));
106     }
107
108     enum VideoPresetType {
109         Base,
110         AVCapture,
111         GStreamer
112     };
113
114     IntSize size;
115     Vector<FrameRateRange> frameRateRanges;
116     VideoPresetType type;
117
118 protected:
119     VideoPreset(IntSize size, Vector<FrameRateRange>&& frameRateRanges, VideoPresetType type)
120         : size(size)
121         , frameRateRanges(WTFMove(frameRateRanges))
122         , type(type)
123     {
124     }
125 };
126
127 } // namespace WebCore
128
129 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::VideoPreset)
130     static bool isType(const WebCore::VideoPreset& preset) { return preset.type == WebCore::VideoPreset::VideoPresetType::Base; }
131 SPECIALIZE_TYPE_TRAITS_END()
132
133 #endif // ENABLE(MEDIA_STREAM)
134