• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <https/PlainSocket.h>
20 #include <https/RunLoop.h>
21 #include <webrtc/DTLS.h>
22 #include <webrtc/RTPSender.h>
23 #include <webrtc/RTPSession.h>
24 #include <webrtc/SCTPHandler.h>
25 #include <webrtc/ServerState.h>
26 #include <webrtc/STUNMessage.h>
27 
28 #include <memory>
29 #include <string_view>
30 #include <vector>
31 
32 struct MyWebSocketHandler;
33 
34 struct RTPSocketHandler
35     : public std::enable_shared_from_this<RTPSocketHandler> {
36 
37     static constexpr size_t kMaxUDPPayloadSize = 1536;
38 
39     static constexpr uint32_t TRACK_VIDEO = 1;
40     static constexpr uint32_t TRACK_AUDIO = 2;
41     static constexpr uint32_t TRACK_DATA  = 4;
42 
43     enum class TransportType {
44         UDP,
45         TCP,
46     };
47 
48     explicit RTPSocketHandler(
49             std::shared_ptr<RunLoop> runLoop,
50             std::shared_ptr<ServerState> serverState,
51             TransportType type,
52             int domain,
53             uint32_t trackMask,
54             std::shared_ptr<RTPSession> session);
55 
56     uint16_t getLocalPort() const;
57     std::string getLocalUFrag() const;
58     std::string getLocalIPString() const;
59 
60     void run();
61 
62     void queueDatagram(
63             const sockaddr_storage &addr, const void *data, size_t size);
64 
65     void queueRTCPDatagram(const void *data, size_t size);
66     void queueRTPDatagram(const void *data, size_t size);
67 
68     void notifyDTLSConnected();
69 
70 private:
71     struct Datagram {
72         explicit Datagram(
73                 const sockaddr_storage &addr, const void *data, size_t size);
74 
75         const void *data() const;
76         size_t size() const;
77 
78         const sockaddr_storage &remoteAddress() const;
79 
80     private:
81         std::vector<uint8_t> mData;
82         sockaddr_storage mAddr;
83     };
84 
85     std::shared_ptr<RunLoop> mRunLoop;
86     std::shared_ptr<ServerState> mServerState;
87     TransportType mTransportType;
88     uint16_t mLocalPort;
89     uint32_t mTrackMask;
90     std::shared_ptr<RTPSession> mSession;
91 
92     std::shared_ptr<BufferedSocket> mSocket;
93     std::shared_ptr<DTLS> mDTLS;
94     std::shared_ptr<SCTPHandler> mSCTPHandler;
95 
96     std::deque<std::shared_ptr<Datagram>> mOutQueue;
97     bool mSendPending;
98     bool mDTLSConnected;
99 
100     std::shared_ptr<RTPSender> mRTPSender;
101 
102     // for TransportType TCP:
103     std::shared_ptr<PlainSocket> mServerSocket;
104     sockaddr_storage mClientAddr;
105     socklen_t mClientAddrLen;
106 
107     std::vector<uint8_t> mInBuffer;
108     size_t mInBufferLength;
109 
110     std::vector<uint8_t> mOutBuffer;
111 
112     void onReceive();
113     void onDTLSReceive(const uint8_t *data, size_t size);
114 
115     void pingRemote(std::shared_ptr<RTPSession> session);
116 
117     bool matchesSession(const STUNMessage &msg) const;
118 
119     void scheduleDrainOutQueue();
120     void drainOutQueue();
121 
122     int onSRTPReceive(uint8_t *data, size_t size);
123 
124     void onTCPConnect();
125     void onTCPReceive();
126 
127     void onPacketReceived(
128             const sockaddr_storage &addr,
129             socklen_t addrLen,
130             uint8_t *data,
131             size_t size);
132 
133     void queueTCPOutputPacket(const uint8_t *data, size_t size);
134     void sendTCPOutputData();
135 };
136 
137 
138