Fix build for PLATFORM(IOS_FAMILY) && !ENABLE(REVEAL), for example, tvOS
[WebKit-https.git] / Source / WebCore / platform / mediastream / MediaStreamPrivate.h
1 /*
2  * Copyright (C) 2011, 2015 Ericsson AB. All rights reserved.
3  * Copyright (C) 2012 Google Inc. All rights reserved.
4  * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
5  * Copyright (C) 2015-2019 Apple Inc. All rights reserved.
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 #ifndef MediaStreamPrivate_h
35 #define MediaStreamPrivate_h
36
37 #if ENABLE(MEDIA_STREAM)
38
39 #include "FloatSize.h"
40 #include "MediaStreamTrackPrivate.h"
41 #include <wtf/Function.h>
42 #include <wtf/HashMap.h>
43 #include <wtf/MediaTime.h>
44 #include <wtf/RefPtr.h>
45 #include <wtf/UUID.h>
46 #include <wtf/Vector.h>
47 #include <wtf/WeakHashSet.h>
48
49 namespace WebCore {
50
51 class MediaStream;
52 class OrientationNotifier;
53
54 class MediaStreamPrivate final
55     : public MediaStreamTrackPrivate::Observer
56     , public RefCounted<MediaStreamPrivate>
57 #if !RELEASE_LOG_DISABLED
58     , private LoggerHelper
59 #endif
60 {
61 public:
62     class Observer : public CanMakeWeakPtr<Observer> {
63     public:
64         virtual ~Observer() = default;
65
66         virtual void characteristicsChanged() { }
67         virtual void activeStatusChanged() { }
68         virtual void didAddTrack(MediaStreamTrackPrivate&) { }
69         virtual void didRemoveTrack(MediaStreamTrackPrivate&) { }
70     };
71
72     static Ref<MediaStreamPrivate> create(Ref<const Logger>&&, Ref<RealtimeMediaSource>&&);
73     static Ref<MediaStreamPrivate> create(Ref<const Logger>&&, RefPtr<RealtimeMediaSource>&& audioSource, RefPtr<RealtimeMediaSource>&& videoSource);
74     static Ref<MediaStreamPrivate> create(Ref<const Logger>&& logger, const MediaStreamTrackPrivateVector& tracks, String&& id = createCanonicalUUIDString()) { return adoptRef(*new MediaStreamPrivate(WTFMove(logger), tracks, WTFMove(id))); }
75
76     WEBCORE_EXPORT virtual ~MediaStreamPrivate();
77
78     void addObserver(Observer&);
79     void removeObserver(Observer&);
80
81     String id() const { return m_id; }
82
83     MediaStreamTrackPrivateVector tracks() const;
84     bool hasTracks() const { return !m_trackSet.isEmpty(); }
85     void forEachTrack(const Function<void(const MediaStreamTrackPrivate&)>&) const;
86     void forEachTrack(const Function<void(MediaStreamTrackPrivate&)>&);
87     MediaStreamTrackPrivate* activeVideoTrack() { return m_activeVideoTrack; }
88
89     bool active() const { return m_isActive; }
90     void updateActiveState();
91
92     void addTrack(Ref<MediaStreamTrackPrivate>&&);
93     WEBCORE_EXPORT void removeTrack(MediaStreamTrackPrivate&);
94
95     void startProducingData();
96     void stopProducingData();
97     bool isProducingData() const;
98
99     bool hasVideo() const;
100     bool hasAudio() const;
101     bool muted() const;
102
103     FloatSize intrinsicSize() const;
104
105     void monitorOrientation(OrientationNotifier&);
106
107 #if !RELEASE_LOG_DISABLED
108     const Logger& logger() const final { return m_logger; }
109     const void* logIdentifier() const final { return m_logIdentifier; }
110 #endif
111
112 private:
113     MediaStreamPrivate(Ref<const Logger>&&, const MediaStreamTrackPrivateVector&, String&&);
114
115     // MediaStreamTrackPrivate::Observer
116     void trackStarted(MediaStreamTrackPrivate&) override;
117     void trackEnded(MediaStreamTrackPrivate&) override;
118     void trackMutedChanged(MediaStreamTrackPrivate&) override;
119     void trackSettingsChanged(MediaStreamTrackPrivate&) override;
120     void trackEnabledChanged(MediaStreamTrackPrivate&) override;
121
122     void characteristicsChanged();
123     void updateActiveVideoTrack();
124
125     bool computeActiveState();
126     void forEachObserver(const Function<void(Observer&)>&);
127
128 #if !RELEASE_LOG_DISABLED
129     const char* logClassName() const final { return "MediaStreamPrivate"; }
130     WTFLogChannel& logChannel() const final;
131 #endif
132
133     WeakHashSet<Observer> m_observers;
134     String m_id;
135     MediaStreamTrackPrivate* m_activeVideoTrack { nullptr };
136     HashMap<String, RefPtr<MediaStreamTrackPrivate>> m_trackSet;
137     bool m_isActive { false };
138 #if !RELEASE_LOG_DISABLED
139     Ref<const Logger> m_logger;
140     const void* m_logIdentifier;
141 #endif
142 };
143
144 typedef Vector<RefPtr<MediaStreamPrivate>> MediaStreamPrivateVector;
145
146 } // namespace WebCore
147
148 #endif // ENABLE(MEDIA_STREAM)
149
150 #endif // MediaStreamPrivate_h