8f8ad9886d39480eb01bec83e143e55c981aa426
[WebKit-https.git] / Source / WebCore / Modules / mediastream / MediaStream.h
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  * Copyright (C) 2011, 2015 Ericsson AB. All rights reserved.
4  * Copyright (C) 2013-2015 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  * 1.  Redistributions of source code must retain the above copyright
11  *     notice, this list of conditions and the following disclaimer.
12  * 2.  Redistributions in binary form must reproduce the above copyright
13  *     notice, this list of conditions and the following disclaimer in the
14  *     documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #ifndef MediaStream_h
29 #define MediaStream_h
30
31 #if ENABLE(MEDIA_STREAM)
32
33 #include "ContextDestructionObserver.h"
34 #include "EventTarget.h"
35 #include "ExceptionBase.h"
36 #include "MediaProducer.h"
37 #include "MediaStreamPrivate.h"
38 #include "MediaStreamTrack.h"
39 #include "ScriptWrappable.h"
40 #include "Timer.h"
41 #include "URLRegistry.h"
42 #include <wtf/HashMap.h>
43 #include <wtf/RefCounted.h>
44 #include <wtf/RefPtr.h>
45
46 namespace WebCore {
47
48 class Document;
49
50 class MediaStream final : public URLRegistrable, public EventTargetWithInlineData, public ContextDestructionObserver, public MediaStreamTrack::Observer, public MediaStreamPrivate::Observer, private MediaProducer, public RefCounted<MediaStream> {
51 public:
52     class Observer {
53     public:
54         virtual ~Observer() { }
55         virtual void didAddOrRemoveTrack() = 0;
56     };
57
58     static Ref<MediaStream> create(ScriptExecutionContext&);
59     static Ref<MediaStream> create(ScriptExecutionContext&, MediaStream&);
60     static Ref<MediaStream> create(ScriptExecutionContext&, const MediaStreamTrackVector&);
61     static Ref<MediaStream> create(ScriptExecutionContext&, RefPtr<MediaStreamPrivate>&&);
62     virtual ~MediaStream();
63
64     String id() const { return m_private->id(); }
65
66     void addTrack(MediaStreamTrack&);
67     void removeTrack(MediaStreamTrack&);
68     MediaStreamTrack* getTrackById(String);
69
70     MediaStreamTrackVector getAudioTracks() const;
71     MediaStreamTrackVector getVideoTracks() const;
72     MediaStreamTrackVector getTracks() const;
73
74     RefPtr<MediaStream> clone();
75
76     bool active() const { return m_isActive; }
77     bool muted() const { return m_isMuted; }
78
79     MediaStreamPrivate* privateStream() const { return m_private.get(); }
80
81     // EventTarget
82     EventTargetInterface eventTargetInterface() const final { return MediaStreamEventTargetInterfaceType; }
83     ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); }
84
85     using RefCounted<MediaStream>::ref;
86     using RefCounted<MediaStream>::deref;
87
88     // URLRegistrable
89     URLRegistry& registry() const override;
90
91     void addObserver(Observer*);
92     void removeObserver(Observer*);
93
94 protected:
95     MediaStream(ScriptExecutionContext&, const MediaStreamTrackVector&);
96     MediaStream(ScriptExecutionContext&, RefPtr<MediaStreamPrivate>&&);
97
98     // ContextDestructionObserver
99     void contextDestroyed() final;
100
101 private:
102     enum class StreamModifier { DomAPI, Platform };
103
104     // EventTarget
105     void refEventTarget() final { ref(); }
106     void derefEventTarget() final { deref(); }
107
108     // MediaStreamTrack::Observer
109     void trackDidEnd() final;
110
111     // MediaStreamPrivate::Observer
112     void activeStatusChanged() final;
113     void didAddTrack(MediaStreamTrackPrivate&) final;
114     void didRemoveTrack(MediaStreamTrackPrivate&) final;
115     void characteristicsChanged() final;
116
117     // MediaProducer
118     void pageMutedStateDidChange() final;
119     MediaProducer::MediaStateFlags mediaState() const final;
120
121     bool internalAddTrack(Ref<MediaStreamTrack>&&, StreamModifier);
122     bool internalRemoveTrack(const String&, StreamModifier);
123
124     void scheduleActiveStateChange();
125     void activityEventTimerFired();
126     void setIsActive(bool);
127     void statusDidChange();
128
129     Document* document() const;
130
131     MediaStreamTrackVector trackVectorForType(RealtimeMediaSource::Type) const;
132
133     RefPtr<MediaStreamPrivate> m_private;
134
135     HashMap<String, RefPtr<MediaStreamTrack>> m_trackSet;
136
137     Timer m_activityEventTimer;
138     Vector<Ref<Event>> m_scheduledActivityEvents;
139
140     Vector<Observer*> m_observers;
141
142     bool m_isActive { false };
143     bool m_isMuted { true };
144     bool m_externallyMuted { false };
145 };
146
147 } // namespace WebCore
148
149 #endif // ENABLE(MEDIA_STREAM)
150
151 #endif // MediaStream_h