f2ba6bc525a32ef42c448208f136c06743e0abc6
[WebKit-https.git] / Source / WebCore / Modules / mediastream / libwebrtc / LibWebRTCMediaEndpoint.h
1 /*
2  * Copyright (C) 2017-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. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #pragma once
26
27 #if USE(LIBWEBRTC)
28
29 #include "LibWebRTCObservers.h"
30 #include "LibWebRTCProvider.h"
31 #include "PeerConnectionBackend.h"
32 #include "RTCRtpReceiver.h"
33 #include "RealtimeOutgoingAudioSource.h"
34 #include "RealtimeOutgoingVideoSource.h"
35 #include <Timer.h>
36
37 #pragma GCC diagnostic push
38 #pragma GCC diagnostic ignored "-Wunused-parameter"
39
40 #include <webrtc/api/jsep.h>
41 #include <webrtc/api/peerconnectioninterface.h>
42 #include <webrtc/pc/peerconnectionfactory.h>
43 #include <webrtc/pc/rtcstatscollector.h>
44
45 #pragma GCC diagnostic pop
46
47 #include <wtf/LoggerHelper.h>
48 #include <wtf/ThreadSafeRefCounted.h>
49
50 namespace webrtc {
51 class CreateSessionDescriptionObserver;
52 class DataChannelInterface;
53 class IceCandidateInterface;
54 class MediaStreamInterface;
55 class PeerConnectionObserver;
56 class SessionDescriptionInterface;
57 class SetSessionDescriptionObserver;
58 }
59
60 namespace WebCore {
61
62 class LibWebRTCProvider;
63 class LibWebRTCPeerConnectionBackend;
64 class LibWebRTCRtpSenderBackend;
65 class MediaStreamTrack;
66 class RTCSessionDescription;
67
68 class LibWebRTCMediaEndpoint
69     : public ThreadSafeRefCounted<LibWebRTCMediaEndpoint, WTF::DestructionThread::Main>
70     , private webrtc::PeerConnectionObserver
71     , private webrtc::RTCStatsCollectorCallback
72 #if !RELEASE_LOG_DISABLED
73     , private LoggerHelper
74 #endif
75 {
76 public:
77     static Ref<LibWebRTCMediaEndpoint> create(LibWebRTCPeerConnectionBackend& peerConnection, LibWebRTCProvider& client) { return adoptRef(*new LibWebRTCMediaEndpoint(peerConnection, client)); }
78     virtual ~LibWebRTCMediaEndpoint() = default;
79
80     bool setConfiguration(LibWebRTCProvider&, webrtc::PeerConnectionInterface::RTCConfiguration&&);
81
82     webrtc::PeerConnectionInterface& backend() const { ASSERT(m_backend); return *m_backend.get(); }
83     void doSetLocalDescription(RTCSessionDescription&);
84     void doSetRemoteDescription(RTCSessionDescription&);
85     void doCreateOffer(const RTCOfferOptions&);
86     void doCreateAnswer();
87     void getStats(MediaStreamTrack*, Ref<DeferredPromise>&&);
88     std::unique_ptr<RTCDataChannelHandler> createDataChannel(const String&, const RTCDataChannelInit&);
89     bool addIceCandidate(webrtc::IceCandidateInterface& candidate) { return m_backend->AddIceCandidate(&candidate); }
90
91     void stop();
92     bool isStopped() const { return !m_backend; }
93
94     RefPtr<RTCSessionDescription> localDescription() const;
95     RefPtr<RTCSessionDescription> remoteDescription() const;
96     RefPtr<RTCSessionDescription> currentLocalDescription() const;
97     RefPtr<RTCSessionDescription> currentRemoteDescription() const;
98     RefPtr<RTCSessionDescription> pendingLocalDescription() const;
99     RefPtr<RTCSessionDescription> pendingRemoteDescription() const;
100
101     bool addTrack(LibWebRTCRtpSenderBackend&, MediaStreamTrack&, const Vector<String>&);
102     void removeTrack(LibWebRTCRtpSenderBackend&);
103
104 private:
105     LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend&, LibWebRTCProvider&);
106
107     // webrtc::PeerConnectionObserver API
108     void OnSignalingChange(webrtc::PeerConnectionInterface::SignalingState) final;
109     void OnAddStream(rtc::scoped_refptr<webrtc::MediaStreamInterface>) final;
110     void OnRemoveStream(rtc::scoped_refptr<webrtc::MediaStreamInterface>) final;
111     void OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface>) final;
112     void OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&) final;
113     void OnRenegotiationNeeded() final;
114     void OnIceConnectionChange(webrtc::PeerConnectionInterface::IceConnectionState) final;
115     void OnIceGatheringChange(webrtc::PeerConnectionInterface::IceGatheringState) final;
116     void OnIceCandidate(const webrtc::IceCandidateInterface*) final;
117     void OnIceCandidatesRemoved(const std::vector<cricket::Candidate>&) final;
118
119     void createSessionDescriptionSucceeded(std::unique_ptr<webrtc::SessionDescriptionInterface>&&);
120     void createSessionDescriptionFailed(const std::string&);
121     void setLocalSessionDescriptionSucceeded();
122     void setLocalSessionDescriptionFailed(const std::string&);
123     void setRemoteSessionDescriptionSucceeded();
124     void setRemoteSessionDescriptionFailed(const std::string&);
125     void addRemoteStream(webrtc::MediaStreamInterface&);
126     void addRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&);
127     void removeRemoteStream(webrtc::MediaStreamInterface&);
128
129     void OnStatsDelivered(const rtc::scoped_refptr<const webrtc::RTCStatsReport>&) final;
130     void gatherStatsForLogging();
131     void startLoggingStats();
132     void stopLoggingStats();
133
134     MediaStream& mediaStreamFromRTCStream(webrtc::MediaStreamInterface&);
135
136     void AddRef() const { ref(); }
137     rtc::RefCountReleaseStatus Release() const
138     {
139         auto result = refCount() - 1;
140         deref();
141         return result ? rtc::RefCountReleaseStatus::kOtherRefsRemained
142         : rtc::RefCountReleaseStatus::kDroppedLastRef;
143     }
144
145 #if !RELEASE_LOG_DISABLED
146     const Logger& logger() const final { return m_logger.get(); }
147     const void* logIdentifier() const final { return m_logIdentifier; }
148     const char* logClassName() const final { return "LibWebRTCMediaEndpoint"; }
149     WTFLogChannel& logChannel() const final;
150
151     Seconds statsLogInterval(int64_t) const;
152 #endif
153
154     LibWebRTCPeerConnectionBackend& m_peerConnectionBackend;
155     webrtc::PeerConnectionFactoryInterface& m_peerConnectionFactory;
156     rtc::scoped_refptr<webrtc::PeerConnectionInterface> m_backend;
157
158     friend CreateSessionDescriptionObserver<LibWebRTCMediaEndpoint>;
159     friend SetLocalSessionDescriptionObserver<LibWebRTCMediaEndpoint>;
160     friend SetRemoteSessionDescriptionObserver<LibWebRTCMediaEndpoint>;
161
162     CreateSessionDescriptionObserver<LibWebRTCMediaEndpoint> m_createSessionDescriptionObserver;
163     SetLocalSessionDescriptionObserver<LibWebRTCMediaEndpoint> m_setLocalSessionDescriptionObserver;
164     SetRemoteSessionDescriptionObserver<LibWebRTCMediaEndpoint> m_setRemoteSessionDescriptionObserver;
165
166     HashMap<webrtc::MediaStreamInterface*, RefPtr<MediaStream>> m_streams;
167
168     bool m_isInitiator { false };
169     Timer m_statsLogTimer;
170
171     HashMap<String, rtc::scoped_refptr<webrtc::MediaStreamInterface>> m_localStreams;
172
173 #if !RELEASE_LOG_DISABLED
174     int64_t m_statsFirstDeliveredTimestamp { 0 };
175     Ref<const Logger> m_logger;
176     const void* m_logIdentifier;
177 #endif
178 };
179
180 } // namespace WebCore
181
182 #endif // USE(LIBWEBRTC)