Implement incoming webrtc data based on tracksCurr
[WebKit-https.git] / Source / WebCore / Modules / mediastream / libwebrtc / LibWebRTCPeerConnectionBackend.h
1 /*
2  * Copyright (C) 2017 Apple Inc.
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 "PeerConnectionBackend.h"
30 #include <wtf/HashMap.h>
31
32 namespace webrtc {
33 class IceCandidateInterface;
34 }
35
36 namespace WebCore {
37
38 class LibWebRTCMediaEndpoint;
39 class RTCRtpReceiver;
40 class RTCSessionDescription;
41 class RTCStatsReport;
42 class RealtimeIncomingAudioSource;
43 class RealtimeIncomingVideoSource;
44 class RealtimeOutgoingAudioSource;
45 class RealtimeOutgoingVideoSource;
46
47 class LibWebRTCPeerConnectionBackend final : public PeerConnectionBackend {
48 public:
49     explicit LibWebRTCPeerConnectionBackend(RTCPeerConnection&);
50     ~LibWebRTCPeerConnectionBackend();
51
52 private:
53     void doCreateOffer(RTCOfferOptions&&) final;
54     void doCreateAnswer(RTCAnswerOptions&&) final;
55     void doSetLocalDescription(RTCSessionDescription&) final;
56     void doSetRemoteDescription(RTCSessionDescription&) final;
57     void doAddIceCandidate(RTCIceCandidate&) final;
58     void doStop() final;
59     std::unique_ptr<RTCDataChannelHandler> createDataChannelHandler(const String&, const RTCDataChannelInit&) final;
60     void setConfiguration(MediaEndpointConfiguration&&) final;
61     void getStats(MediaStreamTrack*, Ref<DeferredPromise>&&) final;
62     Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) final;
63
64     RefPtr<RTCSessionDescription> localDescription() const final;
65     RefPtr<RTCSessionDescription> currentLocalDescription() const final;
66     RefPtr<RTCSessionDescription> pendingLocalDescription() const final;
67
68     RefPtr<RTCSessionDescription> remoteDescription() const final;
69     RefPtr<RTCSessionDescription> currentRemoteDescription() const final;
70     RefPtr<RTCSessionDescription> pendingRemoteDescription() const final;
71
72     // FIXME: API to implement for real
73     void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) final { }
74
75     void emulatePlatformEvent(const String&) final { }
76
77     friend LibWebRTCMediaEndpoint;
78     RTCPeerConnection& connection() { return m_peerConnection; }
79     void addAudioSource(Ref<RealtimeOutgoingAudioSource>&&);
80     void addVideoSource(Ref<RealtimeOutgoingVideoSource>&&);
81
82     void getStatsSucceeded(const DeferredPromise&, Ref<RTCStatsReport>&&);
83     void getStatsFailed(const DeferredPromise&, Exception&&);
84
85     Vector<RefPtr<MediaStream>> getRemoteStreams() const final { return m_remoteStreams; }
86     void removeRemoteStream(MediaStream*);
87     void addRemoteStream(Ref<MediaStream>&&);
88
89     void notifyAddedTrack(RTCRtpSender&) final;
90
91     struct VideoReceiver {
92         Ref<RTCRtpReceiver> receiver;
93         Ref<RealtimeIncomingVideoSource> source;
94     };
95     struct AudioReceiver {
96         Ref<RTCRtpReceiver> receiver;
97         Ref<RealtimeIncomingAudioSource> source;
98     };
99     VideoReceiver videoReceiver(String&& trackId);
100     AudioReceiver audioReceiver(String&& trackId);
101
102 private:
103     Ref<LibWebRTCMediaEndpoint> m_endpoint;
104     bool m_isLocalDescriptionSet { false };
105     bool m_isRemoteDescriptionSet { false };
106
107     // FIXME: Make m_remoteStreams a Vector of Ref.
108     Vector<RefPtr<MediaStream>> m_remoteStreams;
109     Vector<std::unique_ptr<webrtc::IceCandidateInterface>> m_pendingCandidates;
110     Vector<Ref<RealtimeOutgoingAudioSource>> m_audioSources;
111     Vector<Ref<RealtimeOutgoingVideoSource>> m_videoSources;
112     HashMap<const DeferredPromise*, Ref<DeferredPromise>> m_statsPromises;
113     Vector<Ref<RTCRtpReceiver>> m_pendingReceivers;
114 };
115
116 } // namespace WebCore
117
118 #endif // USE(LIBWEBRTC)