/src/mozilla-central/media/mtransport/nricemediastream.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
5 | | * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | // Original author: ekr@rtfm.com |
8 | | |
9 | | // Some of this code is cut-and-pasted from nICEr. Copyright is: |
10 | | |
11 | | /* |
12 | | Copyright (c) 2007, Adobe Systems, Incorporated |
13 | | All rights reserved. |
14 | | |
15 | | Redistribution and use in source and binary forms, with or without |
16 | | modification, are permitted provided that the following conditions are |
17 | | met: |
18 | | |
19 | | * Redistributions of source code must retain the above copyright |
20 | | notice, this list of conditions and the following disclaimer. |
21 | | |
22 | | * Redistributions in binary form must reproduce the above copyright |
23 | | notice, this list of conditions and the following disclaimer in the |
24 | | documentation and/or other materials provided with the distribution. |
25 | | |
26 | | * Neither the name of Adobe Systems, Network Resonance nor the names of its |
27 | | contributors may be used to endorse or promote products derived from |
28 | | this software without specific prior written permission. |
29 | | |
30 | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
31 | | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
32 | | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
33 | | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
34 | | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
35 | | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
36 | | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
37 | | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
38 | | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
39 | | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
40 | | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
41 | | */ |
42 | | |
43 | | // This is a wrapper around the nICEr ICE stack |
44 | | #ifndef nricemediastream_h__ |
45 | | #define nricemediastream_h__ |
46 | | |
47 | | #include <string> |
48 | | #include <vector> |
49 | | |
50 | | #include "sigslot.h" |
51 | | |
52 | | #include "mozilla/RefPtr.h" |
53 | | #include "mozilla/UniquePtr.h" |
54 | | #include "nsCOMPtr.h" |
55 | | #include "nsIEventTarget.h" |
56 | | #include "nsITimer.h" |
57 | | |
58 | | #include "m_cpp_utils.h" |
59 | | |
60 | | |
61 | | namespace mozilla { |
62 | | |
63 | | typedef struct nr_ice_ctx_ nr_ice_ctx; |
64 | | typedef struct nr_ice_peer_ctx_ nr_ice_peer_ctx; |
65 | | typedef struct nr_ice_media_stream_ nr_ice_media_stream; |
66 | | |
67 | | class NrIceCtx; |
68 | | |
69 | | struct NrIceAddr { |
70 | | std::string host; |
71 | | uint16_t port; |
72 | | std::string transport; |
73 | | }; |
74 | | |
75 | | /* A summary of a candidate, for use in asking which candidate |
76 | | pair is active */ |
77 | | struct NrIceCandidate { |
78 | | enum Type { |
79 | | ICE_HOST, |
80 | | ICE_SERVER_REFLEXIVE, |
81 | | ICE_PEER_REFLEXIVE, |
82 | | ICE_RELAYED |
83 | | }; |
84 | | |
85 | | enum TcpType { |
86 | | ICE_NONE, |
87 | | ICE_ACTIVE, |
88 | | ICE_PASSIVE, |
89 | | ICE_SO |
90 | | }; |
91 | | |
92 | | NrIceAddr cand_addr; |
93 | | NrIceAddr local_addr; |
94 | | Type type; |
95 | | TcpType tcp_type; |
96 | | std::string codeword; |
97 | | std::string label; |
98 | | bool trickled; |
99 | | }; |
100 | | |
101 | | struct NrIceCandidatePair { |
102 | | |
103 | | enum State { |
104 | | STATE_FROZEN, |
105 | | STATE_WAITING, |
106 | | STATE_IN_PROGRESS, |
107 | | STATE_FAILED, |
108 | | STATE_SUCCEEDED, |
109 | | STATE_CANCELLED |
110 | | }; |
111 | | |
112 | | State state; |
113 | | uint64_t priority; |
114 | | // Set regardless of who nominated it. Does not necessarily mean that it is |
115 | | // ready to be selected (ie; nominated by peer, but our check has not |
116 | | // succeeded yet.) Note: since this implementation uses aggressive nomination, |
117 | | // when we are the controlling agent, this will always be set if the pair is |
118 | | // in STATE_SUCCEEDED. |
119 | | bool nominated; |
120 | | bool writable; |
121 | | bool readable; |
122 | | // Set if this candidate pair has been selected. Note: Since we are using |
123 | | // aggressive nomination, this could change frequently as ICE runs. |
124 | | bool selected; |
125 | | NrIceCandidate local; |
126 | | NrIceCandidate remote; |
127 | | // TODO(bcampen@mozilla.com): Is it important to put the foundation in here? |
128 | | std::string codeword; |
129 | | uint64_t component_id; |
130 | | |
131 | | // for RTCIceCandidatePairStats |
132 | | uint64_t bytes_sent; |
133 | | uint64_t bytes_recvd; |
134 | | uint64_t ms_since_last_send; |
135 | | uint64_t ms_since_last_recv; |
136 | | }; |
137 | | |
138 | | class NrIceMediaStream { |
139 | | public: |
140 | | NrIceMediaStream(NrIceCtx *ctx, |
141 | | const std::string& id, |
142 | | const std::string& name, |
143 | | size_t components); |
144 | | |
145 | | nsresult SetIceCredentials(const std::string& ufrag, const std::string& pwd); |
146 | | nsresult ConnectToPeer(const std::string& ufrag, |
147 | | const std::string& pwd, |
148 | | const std::vector<std::string>& peer_attrs); |
149 | | enum State { ICE_CONNECTING, ICE_OPEN, ICE_CLOSED}; |
150 | | |
151 | 0 | State state() const { return state_; } |
152 | | |
153 | | // The name of the stream |
154 | 0 | const std::string& name() const { return name_; } |
155 | | |
156 | | // Get all the ICE attributes; used for testing |
157 | | std::vector<std::string> GetAttributes() const; |
158 | | |
159 | | nsresult GetLocalCandidates(std::vector<NrIceCandidate>* candidates) const; |
160 | | nsresult GetRemoteCandidates(std::vector<NrIceCandidate>* candidates) const; |
161 | | |
162 | | // Get all candidate pairs, whether in the check list or triggered check |
163 | | // queue, in priority order. |out_pairs| is cleared before being filled. |
164 | | nsresult GetCandidatePairs(std::vector<NrIceCandidatePair>* out_pairs) const; |
165 | | |
166 | | nsresult GetDefaultCandidate(int component, NrIceCandidate* candidate) const; |
167 | | |
168 | | // Parse trickle ICE candidate |
169 | | nsresult ParseTrickleCandidate(const std::string& candidate); |
170 | | |
171 | | // Disable a component |
172 | | nsresult DisableComponent(int component); |
173 | | |
174 | | // Get the candidate pair currently active. It's the |
175 | | // caller's responsibility to free these. |
176 | | nsresult GetActivePair(int component, |
177 | | UniquePtr<NrIceCandidate>* local, |
178 | | UniquePtr<NrIceCandidate>* remote); |
179 | | |
180 | | // Get the current ICE consent send status plus the timeval of the last |
181 | | // consent update time. |
182 | | nsresult GetConsentStatus(int component, bool *can_send, struct timeval *ts); |
183 | | |
184 | | // The number of components |
185 | 0 | size_t components() const { return components_; } |
186 | | |
187 | | bool HasStream(nr_ice_media_stream *stream) const; |
188 | | // Signals to indicate events. API users can (and should) |
189 | | // register for these. |
190 | | |
191 | | // Send a packet |
192 | | nsresult SendPacket(int component_id, const unsigned char *data, size_t len); |
193 | | |
194 | | // Set your state to ready. Called by the NrIceCtx; |
195 | | void Ready(); |
196 | | void Failed(); |
197 | | |
198 | | // Close the stream. Called by the NrIceCtx. |
199 | | // Different from the destructor because other people |
200 | | // might be holding RefPtrs but we want those writes to fail once |
201 | | // the context has been destroyed. |
202 | | void Close(); |
203 | | |
204 | | // So the receiver of SignalCandidate can determine which transport |
205 | | // the candidate belongs to. |
206 | 0 | const std::string& GetId() const { return id_; } |
207 | | |
208 | | sigslot::signal2<NrIceMediaStream *, const std::string& > |
209 | | SignalCandidate; // A new ICE candidate: |
210 | | |
211 | | sigslot::signal1<NrIceMediaStream *> SignalReady; // Candidate pair ready. |
212 | | sigslot::signal1<NrIceMediaStream *> SignalFailed; // Candidate pair failed. |
213 | | sigslot::signal4<NrIceMediaStream *, int, const unsigned char *, int> |
214 | | SignalPacketReceived; // Incoming packet |
215 | | |
216 | | NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NrIceMediaStream) |
217 | | |
218 | | private: |
219 | | ~NrIceMediaStream(); |
220 | | |
221 | | DISALLOW_COPY_ASSIGN(NrIceMediaStream); |
222 | | |
223 | | void CloseStream(nr_ice_media_stream **stream); |
224 | | |
225 | | State state_; |
226 | | nr_ice_ctx *ctx_; |
227 | | nr_ice_peer_ctx *ctx_peer_; |
228 | | const std::string name_; |
229 | | const size_t components_; |
230 | | nr_ice_media_stream *stream_; |
231 | | nr_ice_media_stream *old_stream_; |
232 | | const std::string id_; |
233 | | }; |
234 | | |
235 | | |
236 | | } // close namespace |
237 | | #endif |