Line data Source code
1 : /* This Source Code Form is subject to the terms of the Mozilla Public
2 : * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
4 :
5 : #ifndef _JSEPSESSIONIMPL_H_
6 : #define _JSEPSESSIONIMPL_H_
7 :
8 : #include <set>
9 : #include <string>
10 : #include <vector>
11 :
12 : #include "signaling/src/jsep/JsepCodecDescription.h"
13 : #include "signaling/src/jsep/JsepTrack.h"
14 : #include "signaling/src/jsep/JsepSession.h"
15 : #include "signaling/src/jsep/JsepTrack.h"
16 : #include "signaling/src/sdp/SipccSdpParser.h"
17 : #include "signaling/src/sdp/SdpHelper.h"
18 : #include "signaling/src/common/PtrVector.h"
19 :
20 : namespace mozilla {
21 :
22 0 : class JsepUuidGenerator
23 : {
24 : public:
25 0 : virtual ~JsepUuidGenerator() {}
26 : virtual bool Generate(std::string* id) = 0;
27 : };
28 :
29 0 : class JsepSessionImpl : public JsepSession
30 : {
31 : public:
32 0 : JsepSessionImpl(const std::string& name, UniquePtr<JsepUuidGenerator> uuidgen)
33 0 : : JsepSession(name),
34 : mIsOfferer(false),
35 : mWasOffererLastTime(false),
36 : mIceControlling(false),
37 : mRemoteIsIceLite(false),
38 : mRemoteIceIsRestarting(false),
39 : mBundlePolicy(kBundleBalanced),
40 : mSessionId(0),
41 : mSessionVersion(0),
42 0 : mUuidGen(Move(uuidgen)),
43 0 : mSdpHelper(&mLastError)
44 : {
45 0 : }
46 :
47 : // Implement JsepSession methods.
48 : virtual nsresult Init() override;
49 :
50 : virtual nsresult AddTrack(const RefPtr<JsepTrack>& track) override;
51 :
52 : virtual nsresult RemoveTrack(const std::string& streamId,
53 : const std::string& trackId) override;
54 :
55 : virtual nsresult SetIceCredentials(const std::string& ufrag,
56 : const std::string& pwd) override;
57 0 : virtual const std::string& GetUfrag() const override { return mIceUfrag; }
58 0 : virtual const std::string& GetPwd() const override { return mIcePwd; }
59 : nsresult SetBundlePolicy(JsepBundlePolicy policy) override;
60 :
61 : virtual bool
62 0 : RemoteIsIceLite() const override
63 : {
64 0 : return mRemoteIsIceLite;
65 : }
66 :
67 : virtual bool
68 0 : RemoteIceIsRestarting() const override
69 : {
70 0 : return mRemoteIceIsRestarting;
71 : }
72 :
73 : virtual std::vector<std::string>
74 0 : GetIceOptions() const override
75 : {
76 0 : return mIceOptions;
77 : }
78 :
79 : virtual nsresult AddDtlsFingerprint(const std::string& algorithm,
80 : const std::vector<uint8_t>& value) override;
81 :
82 : nsresult AddRtpExtension(std::vector<SdpExtmapAttributeList::Extmap>& extensions,
83 : const std::string& extensionName,
84 : SdpDirectionAttribute::Direction direction);
85 : virtual nsresult AddAudioRtpExtension(
86 : const std::string& extensionName,
87 : SdpDirectionAttribute::Direction direction =
88 : SdpDirectionAttribute::Direction::kSendrecv) override;
89 :
90 : virtual nsresult AddVideoRtpExtension(
91 : const std::string& extensionName,
92 : SdpDirectionAttribute::Direction direction =
93 : SdpDirectionAttribute::Direction::kSendrecv) override;
94 :
95 : virtual std::vector<JsepCodecDescription*>&
96 0 : Codecs() override
97 : {
98 0 : return mSupportedCodecs.values;
99 : }
100 :
101 : virtual nsresult ReplaceTrack(const std::string& oldStreamId,
102 : const std::string& oldTrackId,
103 : const std::string& newStreamId,
104 : const std::string& newTrackId) override;
105 :
106 : virtual nsresult SetParameters(
107 : const std::string& streamId,
108 : const std::string& trackId,
109 : const std::vector<JsepTrack::JsConstraints>& constraints) override;
110 :
111 : virtual nsresult GetParameters(
112 : const std::string& streamId,
113 : const std::string& trackId,
114 : std::vector<JsepTrack::JsConstraints>* outConstraints) override;
115 :
116 : virtual std::vector<RefPtr<JsepTrack>> GetLocalTracks() const override;
117 :
118 : virtual std::vector<RefPtr<JsepTrack>> GetRemoteTracks() const override;
119 :
120 : virtual std::vector<RefPtr<JsepTrack>>
121 : GetRemoteTracksAdded() const override;
122 :
123 : virtual std::vector<RefPtr<JsepTrack>>
124 : GetRemoteTracksRemoved() const override;
125 :
126 : virtual nsresult CreateOffer(const JsepOfferOptions& options,
127 : std::string* offer) override;
128 :
129 : virtual nsresult CreateAnswer(const JsepAnswerOptions& options,
130 : std::string* answer) override;
131 :
132 : virtual std::string GetLocalDescription(JsepDescriptionPendingOrCurrent type)
133 : const override;
134 :
135 : virtual std::string GetRemoteDescription(JsepDescriptionPendingOrCurrent type)
136 : const override;
137 :
138 : virtual nsresult SetLocalDescription(JsepSdpType type,
139 : const std::string& sdp) override;
140 :
141 : virtual nsresult SetRemoteDescription(JsepSdpType type,
142 : const std::string& sdp) override;
143 :
144 : virtual nsresult AddRemoteIceCandidate(const std::string& candidate,
145 : const std::string& mid,
146 : uint16_t level) override;
147 :
148 : virtual nsresult AddLocalIceCandidate(const std::string& candidate,
149 : uint16_t level,
150 : std::string* mid,
151 : bool* skipped) override;
152 :
153 : virtual nsresult UpdateDefaultCandidate(
154 : const std::string& defaultCandidateAddr,
155 : uint16_t defaultCandidatePort,
156 : const std::string& defaultRtcpCandidateAddr,
157 : uint16_t defaultRtcpCandidatePort,
158 : uint16_t level) override;
159 :
160 : virtual nsresult EndOfLocalCandidates(uint16_t level) override;
161 :
162 : virtual nsresult Close() override;
163 :
164 : virtual const std::string GetLastError() const override;
165 :
166 : virtual bool
167 0 : IsIceControlling() const override
168 : {
169 0 : return mIceControlling;
170 : }
171 :
172 : virtual bool
173 0 : IsOfferer() const override
174 : {
175 0 : return mIsOfferer;
176 : }
177 :
178 : // Access transports.
179 : virtual std::vector<RefPtr<JsepTransport>>
180 0 : GetTransports() const override
181 : {
182 0 : return mTransports;
183 : }
184 :
185 : virtual std::vector<JsepTrackPair>
186 0 : GetNegotiatedTrackPairs() const override
187 : {
188 0 : return mNegotiatedTrackPairs;
189 : }
190 :
191 : virtual bool AllLocalTracksAreAssigned() const override;
192 :
193 : private:
194 0 : struct JsepDtlsFingerprint {
195 : std::string mAlgorithm;
196 : std::vector<uint8_t> mValue;
197 : };
198 :
199 0 : struct JsepSendingTrack {
200 : RefPtr<JsepTrack> mTrack;
201 : Maybe<size_t> mAssignedMLine;
202 : };
203 :
204 0 : struct JsepReceivingTrack {
205 : RefPtr<JsepTrack> mTrack;
206 : Maybe<size_t> mAssignedMLine;
207 : };
208 :
209 : // Non-const so it can set mLastError
210 : nsresult CreateGenericSDP(UniquePtr<Sdp>* sdp);
211 : void AddExtmap(SdpMediaSection* msection) const;
212 : void AddMid(const std::string& mid, SdpMediaSection* msection) const;
213 : const std::vector<SdpExtmapAttributeList::Extmap>* GetRtpExtensions(
214 : SdpMediaSection::MediaType type) const;
215 :
216 : void AddCommonExtmaps(const SdpMediaSection& remoteMsection,
217 : SdpMediaSection* msection);
218 : nsresult SetupIds();
219 : nsresult CreateSsrc(uint32_t* ssrc);
220 : void SetupDefaultCodecs();
221 : void SetupDefaultRtpExtensions();
222 : void SetState(JsepSignalingState state);
223 : // Non-const so it can set mLastError
224 : nsresult ParseSdp(const std::string& sdp, UniquePtr<Sdp>* parsedp);
225 : nsresult SetLocalDescriptionOffer(UniquePtr<Sdp> offer);
226 : nsresult SetLocalDescriptionAnswer(JsepSdpType type, UniquePtr<Sdp> answer);
227 : nsresult SetRemoteDescriptionOffer(UniquePtr<Sdp> offer);
228 : nsresult SetRemoteDescriptionAnswer(JsepSdpType type, UniquePtr<Sdp> answer);
229 : nsresult ValidateLocalDescription(const Sdp& description);
230 : nsresult ValidateRemoteDescription(const Sdp& description);
231 : nsresult ValidateOffer(const Sdp& offer);
232 : nsresult ValidateAnswer(const Sdp& offer, const Sdp& answer);
233 : nsresult SetRemoteTracksFromDescription(const Sdp* remoteDescription);
234 : // Non-const because we use our Uuid generator
235 : nsresult CreateReceivingTrack(size_t mline,
236 : const Sdp& sdp,
237 : const SdpMediaSection& msection,
238 : RefPtr<JsepTrack>* track);
239 : nsresult HandleNegotiatedSession(const UniquePtr<Sdp>& local,
240 : const UniquePtr<Sdp>& remote);
241 : nsresult AddTransportAttributes(SdpMediaSection* msection,
242 : SdpSetupAttribute::Role dtlsRole);
243 : nsresult CopyPreviousTransportParams(const Sdp& oldAnswer,
244 : const Sdp& offerersPreviousSdp,
245 : const Sdp& newOffer,
246 : Sdp* newLocal);
247 : nsresult SetupOfferMSections(const JsepOfferOptions& options, Sdp* sdp);
248 : // Non-const so it can assign m-line index to tracks
249 : nsresult SetupOfferMSectionsByType(SdpMediaSection::MediaType type,
250 : const Maybe<size_t>& offerToReceive,
251 : Sdp* sdp);
252 : nsresult BindLocalTracks(SdpMediaSection::MediaType mediatype,
253 : Sdp* sdp);
254 : nsresult BindRemoteTracks(SdpMediaSection::MediaType mediatype,
255 : Sdp* sdp,
256 : size_t* offerToReceive);
257 : nsresult SetRecvAsNeededOrDisable(SdpMediaSection::MediaType mediatype,
258 : Sdp* sdp,
259 : size_t* offerToRecv);
260 : void SetupOfferToReceiveMsection(SdpMediaSection* offer);
261 : nsresult AddRecvonlyMsections(SdpMediaSection::MediaType mediatype,
262 : size_t count,
263 : Sdp* sdp);
264 : nsresult AddReofferMsections(const Sdp& oldLocalSdp,
265 : const Sdp& oldAnswer,
266 : Sdp* newSdp);
267 : void SetupBundle(Sdp* sdp) const;
268 : nsresult GetRemoteIds(const Sdp& sdp,
269 : const SdpMediaSection& msection,
270 : std::string* streamId,
271 : std::string* trackId);
272 : nsresult CreateOfferMSection(SdpMediaSection::MediaType type,
273 : SdpMediaSection::Protocol proto,
274 : SdpDirectionAttribute::Direction direction,
275 : Sdp* sdp);
276 : nsresult GetFreeMsectionForSend(SdpMediaSection::MediaType type,
277 : Sdp* sdp,
278 : SdpMediaSection** msection);
279 : nsresult CreateAnswerMSection(const JsepAnswerOptions& options,
280 : size_t mlineIndex,
281 : const SdpMediaSection& remoteMsection,
282 : Sdp* sdp);
283 : nsresult SetRecvonlySsrc(SdpMediaSection* msection);
284 : nsresult BindMatchingLocalTrackToAnswer(SdpMediaSection* msection);
285 : nsresult BindMatchingRemoteTrackToAnswer(SdpMediaSection* msection);
286 : nsresult DetermineAnswererSetupRole(const SdpMediaSection& remoteMsection,
287 : SdpSetupAttribute::Role* rolep);
288 : nsresult MakeNegotiatedTrackPair(const SdpMediaSection& remote,
289 : const SdpMediaSection& local,
290 : const RefPtr<JsepTransport>& transport,
291 : bool usingBundle,
292 : size_t transportLevel,
293 : JsepTrackPair* trackPairOut);
294 : void InitTransport(const SdpMediaSection& msection, JsepTransport* transport);
295 :
296 : nsresult FinalizeTransport(const SdpAttributeList& remote,
297 : const SdpAttributeList& answer,
298 : const RefPtr<JsepTransport>& transport);
299 :
300 : nsresult GetNegotiatedBundledMids(SdpHelper::BundledMids* bundledMids);
301 :
302 : nsresult EnableOfferMsection(SdpMediaSection* msection);
303 :
304 : mozilla::Sdp* GetParsedLocalDescription(JsepDescriptionPendingOrCurrent type)
305 : const;
306 : mozilla::Sdp* GetParsedRemoteDescription(JsepDescriptionPendingOrCurrent type)
307 : const;
308 : const Sdp* GetAnswer() const;
309 :
310 : std::vector<JsepSendingTrack> mLocalTracks;
311 : std::vector<JsepReceivingTrack> mRemoteTracks;
312 : // By the most recent SetRemoteDescription
313 : std::vector<JsepReceivingTrack> mRemoteTracksAdded;
314 : std::vector<JsepReceivingTrack> mRemoteTracksRemoved;
315 : std::vector<RefPtr<JsepTransport> > mTransports;
316 : // So we can rollback
317 : std::vector<RefPtr<JsepTransport> > mOldTransports;
318 : std::vector<JsepTrackPair> mNegotiatedTrackPairs;
319 :
320 : bool mIsOfferer;
321 : bool mWasOffererLastTime;
322 : bool mIceControlling;
323 : std::string mIceUfrag;
324 : std::string mIcePwd;
325 : bool mRemoteIsIceLite;
326 : bool mRemoteIceIsRestarting;
327 : std::vector<std::string> mIceOptions;
328 : JsepBundlePolicy mBundlePolicy;
329 : std::vector<JsepDtlsFingerprint> mDtlsFingerprints;
330 : uint64_t mSessionId;
331 : uint64_t mSessionVersion;
332 : std::vector<SdpExtmapAttributeList::Extmap> mAudioRtpExtensions;
333 : std::vector<SdpExtmapAttributeList::Extmap> mVideoRtpExtensions;
334 : UniquePtr<JsepUuidGenerator> mUuidGen;
335 : std::string mDefaultRemoteStreamId;
336 : std::map<size_t, std::string> mDefaultRemoteTrackIdsByLevel;
337 : std::string mCNAME;
338 : // Used to prevent duplicate local SSRCs. Not used to prevent local/remote or
339 : // remote-only duplication, which will be important for EKT but not now.
340 : std::set<uint32_t> mSsrcs;
341 : // When an m-section doesn't have a local track, it still needs an ssrc, which
342 : // is stored here.
343 : std::vector<uint32_t> mRecvonlySsrcs;
344 : UniquePtr<Sdp> mGeneratedLocalDescription; // Created but not set.
345 : UniquePtr<Sdp> mCurrentLocalDescription;
346 : UniquePtr<Sdp> mCurrentRemoteDescription;
347 : UniquePtr<Sdp> mPendingLocalDescription;
348 : UniquePtr<Sdp> mPendingRemoteDescription;
349 : PtrVector<JsepCodecDescription> mSupportedCodecs;
350 : std::string mLastError;
351 : SipccSdpParser mParser;
352 : SdpHelper mSdpHelper;
353 : };
354 :
355 : } // namespace mozilla
356 :
357 : #endif
|