1/*
2 * Copyright (C) 2013 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#ifndef MediaStreamSourceCapabilities_h
27#define MediaStreamSourceCapabilities_h
28
29#if ENABLE(MEDIA_STREAM)
30
31#include "MediaStreamSourceStates.h"
32#include <wtf/RefCounted.h>
33#include <wtf/Vector.h>
34#include <wtf/text/AtomicString.h>
35
36namespace WebCore {
37
38class MediaStreamSourceCapabilityRange {
39public:
40
41    MediaStreamSourceCapabilityRange(float min, float max, bool supported = true)
42        : m_type(Float)
43    {
44        m_min.asFloat = min;
45        m_max.asFloat = max;
46        m_supported = supported;
47    }
48
49    MediaStreamSourceCapabilityRange(unsigned long min, unsigned long max, bool supported = true)
50        : m_type(ULong)
51    {
52        m_min.asULong = min;
53        m_max.asULong = max;
54        m_supported = supported;
55    }
56
57    MediaStreamSourceCapabilityRange()
58    {
59        m_type = Undefined;
60        m_min.asULong = 0;
61        m_max.asULong = 0;
62        m_supported = false;
63    }
64
65    enum Type { Undefined, Float, ULong };
66
67    union ValueUnion {
68        unsigned long asULong;
69        float asFloat;
70    };
71
72    const ValueUnion& min() const { return m_min; }
73    const ValueUnion& max() const { return m_max; }
74    Type type() const { return m_type; }
75    bool supported() const { return m_supported; }
76
77private:
78    ValueUnion m_min;
79    ValueUnion m_max;
80    Type m_type;
81    bool m_supported;
82};
83
84class MediaStreamSourceCapabilities : public RefCounted<MediaStreamSourceCapabilities> {
85public:
86    static PassRefPtr<MediaStreamSourceCapabilities> create()
87    {
88        return adoptRef(new MediaStreamSourceCapabilities());
89    }
90
91    ~MediaStreamSourceCapabilities() { }
92
93    const Vector<MediaStreamSourceStates::SourceType>& sourceTypes() { return m_sourceType; }
94    void setSourceType(MediaStreamSourceStates::SourceType sourceType) { m_sourceType.resizeToFit(1); addSourceType(sourceType); }
95    void addSourceType(MediaStreamSourceStates::SourceType sourceType)
96    {
97        if (sourceType == MediaStreamSourceStates::Camera)
98            m_videoSource = true;
99        m_sourceType.append(sourceType);
100    }
101
102    const Vector<AtomicString>& sourceId() { return m_sourceId; }
103    void setSourceId(const AtomicString& id)  { m_sourceId.reserveCapacity(1); m_sourceId.insert(0, id); }
104
105    const Vector<MediaStreamSourceStates::VideoFacingMode>& facingModes() { return m_facingMode; }
106    void addFacingMode(MediaStreamSourceStates::VideoFacingMode mode) { m_facingMode.append(mode); }
107
108    const MediaStreamSourceCapabilityRange& width() { return m_width; }
109    void setWidthRange(const MediaStreamSourceCapabilityRange& width) { m_width = width; }
110
111    const MediaStreamSourceCapabilityRange& height() { return m_height; }
112    void setHeightRange(const MediaStreamSourceCapabilityRange& height) { m_height = height; }
113
114    const MediaStreamSourceCapabilityRange& frameRate() { return m_frameRate; }
115    void setFrameRateRange(const MediaStreamSourceCapabilityRange& frameRate) { m_frameRate = frameRate; }
116
117    const MediaStreamSourceCapabilityRange& aspectRatio() { return m_aspectRatio; }
118    void setAspectRatioRange(const MediaStreamSourceCapabilityRange& aspectRatio) { m_aspectRatio = aspectRatio; }
119
120    const MediaStreamSourceCapabilityRange& volume() { return m_volume; }
121    void setVolumeRange(const MediaStreamSourceCapabilityRange& volume) { m_volume = volume; }
122
123    bool hasVideoSource() { return m_videoSource; }
124    void setHasVideoSource(bool isVideo) { m_videoSource = isVideo;; }
125
126private:
127    MediaStreamSourceCapabilities()
128        : m_videoSource(false)
129    {
130    }
131
132    Vector<AtomicString> m_sourceId;
133    Vector<MediaStreamSourceStates::SourceType> m_sourceType;
134    Vector<MediaStreamSourceStates::VideoFacingMode> m_facingMode;
135
136    MediaStreamSourceCapabilityRange m_width;
137    MediaStreamSourceCapabilityRange m_height;
138    MediaStreamSourceCapabilityRange m_frameRate;
139    MediaStreamSourceCapabilityRange m_aspectRatio;
140    MediaStreamSourceCapabilityRange m_volume;
141
142    bool m_videoSource;
143};
144
145} // namespace WebCore
146
147#endif // MediaStreamSourceCapabilities_h
148
149#endif
150