blob: 132e0a6b8c92fc966c6e3813a0e463767d56f78a [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
11// Types and classes used in media session descriptions.
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#ifndef PC_MEDIASESSION_H_
14#define PC_MEDIASESSION_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000016#include <algorithm>
deadbeef0ed85b22016-02-23 17:24:52 -080017#include <map>
Steve Anton1a9d3c32018-12-10 17:18:54 -080018#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000019#include <string>
20#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000021
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "api/mediatypes.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "media/base/mediaconstants.h"
24#include "media/base/mediaengine.h" // For DataChannelType
Jonas Oreland1cd39fa2018-10-11 07:47:12 +020025#include "p2p/base/icecredentialsiterator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "p2p/base/transportdescriptionfactory.h"
Zhi Huang365381f2018-04-13 16:44:34 -070027#include "pc/jseptransport.h"
Steve Anton4ab68ee2017-12-19 14:26:11 -080028#include "pc/sessiondescription.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
30namespace cricket {
31
32class ChannelManager;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000033
zhihuang8f65cdf2016-05-06 18:40:30 -070034// Default RTCP CNAME for unit tests.
35const char kDefaultRtcpCname[] = "DefaultRtcpCname";
36
zhihuang1c378ed2017-08-17 14:10:50 -070037// Options for an RtpSender contained with an media description/"m=" section.
38struct SenderOptions {
39 std::string track_id;
Steve Anton8ffb9c32017-08-31 15:45:38 -070040 std::vector<std::string> stream_ids;
zhihuang1c378ed2017-08-17 14:10:50 -070041 int num_sim_layers;
42};
jiayl@webrtc.org742922b2014-10-07 21:32:43 +000043
zhihuang1c378ed2017-08-17 14:10:50 -070044// Options for an individual media description/"m=" section.
45struct MediaDescriptionOptions {
46 MediaDescriptionOptions(MediaType type,
47 const std::string& mid,
Steve Anton1d03a752017-11-27 14:30:09 -080048 webrtc::RtpTransceiverDirection direction,
zhihuang1c378ed2017-08-17 14:10:50 -070049 bool stopped)
50 : type(type), mid(mid), direction(direction), stopped(stopped) {}
zhihuanga77e6bb2017-08-14 18:17:48 -070051
zhihuang1c378ed2017-08-17 14:10:50 -070052 // TODO(deadbeef): When we don't support Plan B, there will only be one
53 // sender per media description and this can be simplified.
54 void AddAudioSender(const std::string& track_id,
Steve Anton8ffb9c32017-08-31 15:45:38 -070055 const std::vector<std::string>& stream_ids);
zhihuang1c378ed2017-08-17 14:10:50 -070056 void AddVideoSender(const std::string& track_id,
Steve Anton8ffb9c32017-08-31 15:45:38 -070057 const std::vector<std::string>& stream_ids,
olka3c747662017-08-17 06:50:32 -070058 int num_sim_layers);
zhihuanga77e6bb2017-08-14 18:17:48 -070059
zhihuang1c378ed2017-08-17 14:10:50 -070060 // Internally just uses sender_options.
61 void AddRtpDataChannel(const std::string& track_id,
62 const std::string& stream_id);
olka3c747662017-08-17 06:50:32 -070063
zhihuang1c378ed2017-08-17 14:10:50 -070064 MediaType type;
65 std::string mid;
Steve Anton1d03a752017-11-27 14:30:09 -080066 webrtc::RtpTransceiverDirection direction;
zhihuang1c378ed2017-08-17 14:10:50 -070067 bool stopped;
68 TransportOptions transport_options;
69 // Note: There's no equivalent "RtpReceiverOptions" because only send
70 // stream information goes in the local descriptions.
71 std::vector<SenderOptions> sender_options;
72
73 private:
74 // Doesn't DCHECK on |type|.
75 void AddSenderInternal(const std::string& track_id,
Steve Anton8ffb9c32017-08-31 15:45:38 -070076 const std::vector<std::string>& stream_ids,
olka3c747662017-08-17 06:50:32 -070077 int num_sim_layers);
zhihuang1c378ed2017-08-17 14:10:50 -070078};
olka3c747662017-08-17 06:50:32 -070079
zhihuang1c378ed2017-08-17 14:10:50 -070080// Provides a mechanism for describing how m= sections should be generated.
81// The m= section with index X will use media_description_options[X]. There
82// must be an option for each existing section if creating an answer, or a
83// subsequent offer.
84struct MediaSessionOptions {
85 MediaSessionOptions() {}
olka3c747662017-08-17 06:50:32 -070086
zhihuang1c378ed2017-08-17 14:10:50 -070087 bool has_audio() const { return HasMediaDescription(MEDIA_TYPE_AUDIO); }
88 bool has_video() const { return HasMediaDescription(MEDIA_TYPE_VIDEO); }
89 bool has_data() const { return HasMediaDescription(MEDIA_TYPE_DATA); }
90
91 bool HasMediaDescription(MediaType type) const;
92
93 DataChannelType data_channel_type = DCT_NONE;
zhihuang1c378ed2017-08-17 14:10:50 -070094 bool vad_enabled = true; // When disabled, removes all CN codecs from SDP.
95 bool rtcp_mux_enabled = true;
96 bool bundle_enabled = false;
Johannes Kron89f874e2018-11-12 10:25:48 +010097 bool offer_extmap_allow_mixed = false;
zhihuang1c378ed2017-08-17 14:10:50 -070098 std::string rtcp_cname = kDefaultRtcpCname;
Benjamin Wrighta54daf12018-10-11 15:33:17 -070099 webrtc::CryptoOptions crypto_options;
zhihuang1c378ed2017-08-17 14:10:50 -0700100 // List of media description options in the same order that the media
101 // descriptions will be generated.
102 std::vector<MediaDescriptionOptions> media_description_options;
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200103 std::vector<IceParameters> pooled_ice_credentials;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104};
105
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106// Creates media session descriptions according to the supplied codecs and
107// other fields, as well as the supplied per-call options.
108// When creating answers, performs the appropriate negotiation
109// of the various fields to determine the proper result.
110class MediaSessionDescriptionFactory {
111 public:
112 // Default ctor; use methods below to set configuration.
113 // The TransportDescriptionFactory is not owned by MediaSessionDescFactory,
114 // so it must be kept alive by the user of this class.
115 explicit MediaSessionDescriptionFactory(
116 const TransportDescriptionFactory* factory);
117 // This helper automatically sets up the factory to get its configuration
118 // from the specified ChannelManager.
119 MediaSessionDescriptionFactory(ChannelManager* cmanager,
120 const TransportDescriptionFactory* factory);
121
ossudedfd282016-06-14 07:12:39 -0700122 const AudioCodecs& audio_sendrecv_codecs() const;
ossu075af922016-06-14 03:29:38 -0700123 const AudioCodecs& audio_send_codecs() const;
124 const AudioCodecs& audio_recv_codecs() const;
125 void set_audio_codecs(const AudioCodecs& send_codecs,
126 const AudioCodecs& recv_codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 void set_audio_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
128 audio_rtp_extensions_ = extensions;
129 }
Steve Anton8f66ddb2018-12-10 16:08:05 -0800130 RtpHeaderExtensions audio_rtp_header_extensions() const {
Steve Anton1b8773d2018-04-06 11:13:34 -0700131 RtpHeaderExtensions extensions = audio_rtp_extensions_;
132 // If we are Unified Plan, also offer the MID header extension.
Steve Anton8f66ddb2018-12-10 16:08:05 -0800133 if (is_unified_plan_) {
Steve Anton1b8773d2018-04-06 11:13:34 -0700134 extensions.push_back(webrtc::RtpExtension(
135 webrtc::RtpExtension::kMidUri, webrtc::RtpExtension::kMidDefaultId));
136 }
137 return extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 }
139 const VideoCodecs& video_codecs() const { return video_codecs_; }
140 void set_video_codecs(const VideoCodecs& codecs) { video_codecs_ = codecs; }
141 void set_video_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
142 video_rtp_extensions_ = extensions;
143 }
Steve Anton8f66ddb2018-12-10 16:08:05 -0800144 RtpHeaderExtensions video_rtp_header_extensions() const {
Steve Anton1b8773d2018-04-06 11:13:34 -0700145 RtpHeaderExtensions extensions = video_rtp_extensions_;
146 // If we are Unified Plan, also offer the MID header extension.
Steve Anton8f66ddb2018-12-10 16:08:05 -0800147 if (is_unified_plan_) {
Steve Anton1b8773d2018-04-06 11:13:34 -0700148 extensions.push_back(webrtc::RtpExtension(
149 webrtc::RtpExtension::kMidUri, webrtc::RtpExtension::kMidDefaultId));
150 }
151 return extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 }
153 const DataCodecs& data_codecs() const { return data_codecs_; }
154 void set_data_codecs(const DataCodecs& codecs) { data_codecs_ = codecs; }
155 SecurePolicy secure() const { return secure_; }
156 void set_secure(SecurePolicy s) { secure_ = s; }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157
jbauch5869f502017-06-29 12:31:36 -0700158 void set_enable_encrypted_rtp_header_extensions(bool enable) {
159 enable_encrypted_rtp_header_extensions_ = enable;
160 }
161
Steve Anton8f66ddb2018-12-10 16:08:05 -0800162 void set_is_unified_plan(bool is_unified_plan) {
163 is_unified_plan_ = is_unified_plan;
164 }
165
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166 SessionDescription* CreateOffer(
167 const MediaSessionOptions& options,
168 const SessionDescription* current_description) const;
169 SessionDescription* CreateAnswer(
zstein4b2e0822017-02-17 19:48:38 -0800170 const SessionDescription* offer,
171 const MediaSessionOptions& options,
172 const SessionDescription* current_description) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000173
174 private:
ossu075af922016-06-14 03:29:38 -0700175 const AudioCodecs& GetAudioCodecsForOffer(
Steve Anton1d03a752017-11-27 14:30:09 -0800176 const webrtc::RtpTransceiverDirection& direction) const;
ossu075af922016-06-14 03:29:38 -0700177 const AudioCodecs& GetAudioCodecsForAnswer(
Steve Anton1d03a752017-11-27 14:30:09 -0800178 const webrtc::RtpTransceiverDirection& offer,
179 const webrtc::RtpTransceiverDirection& answer) const;
Steve Anton5c72e712018-12-10 14:25:30 -0800180 void GetCodecsForOffer(
181 const std::vector<const ContentInfo*>& current_active_contents,
182 AudioCodecs* audio_codecs,
183 VideoCodecs* video_codecs,
184 DataCodecs* data_codecs) const;
185 void GetCodecsForAnswer(
186 const std::vector<const ContentInfo*>& current_active_contents,
187 const SessionDescription& remote_offer,
188 AudioCodecs* audio_codecs,
189 VideoCodecs* video_codecs,
190 DataCodecs* data_codecs) const;
191 void GetRtpHdrExtsToOffer(
192 const std::vector<const ContentInfo*>& current_active_contents,
Steve Anton5c72e712018-12-10 14:25:30 -0800193 RtpHeaderExtensions* audio_extensions,
194 RtpHeaderExtensions* video_extensions) const;
Yves Gerey665174f2018-06-19 15:03:05 +0200195 bool AddTransportOffer(const std::string& content_name,
196 const TransportOptions& transport_options,
197 const SessionDescription* current_desc,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200198 SessionDescription* offer,
199 IceCredentialsIterator* ice_credentials) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200
Steve Anton1a9d3c32018-12-10 17:18:54 -0800201 std::unique_ptr<TransportDescription> CreateTransportAnswer(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 const std::string& content_name,
203 const SessionDescription* offer_desc,
204 const TransportOptions& transport_options,
deadbeefb7892532017-02-22 19:35:18 -0800205 const SessionDescription* current_desc,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200206 bool require_transport_attributes,
207 IceCredentialsIterator* ice_credentials) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208
Yves Gerey665174f2018-06-19 15:03:05 +0200209 bool AddTransportAnswer(const std::string& content_name,
210 const TransportDescription& transport_desc,
211 SessionDescription* answer_desc) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000212
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000213 // Helpers for adding media contents to the SessionDescription. Returns true
214 // it succeeds or the media content is not needed, or false if there is any
215 // error.
216
217 bool AddAudioContentForOffer(
zhihuang1c378ed2017-08-17 14:10:50 -0700218 const MediaDescriptionOptions& media_description_options,
219 const MediaSessionOptions& session_options,
220 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000221 const SessionDescription* current_description,
222 const RtpHeaderExtensions& audio_rtp_extensions,
223 const AudioCodecs& audio_codecs,
224 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200225 SessionDescription* desc,
226 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000227
228 bool AddVideoContentForOffer(
zhihuang1c378ed2017-08-17 14:10:50 -0700229 const MediaDescriptionOptions& media_description_options,
230 const MediaSessionOptions& session_options,
231 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000232 const SessionDescription* current_description,
233 const RtpHeaderExtensions& video_rtp_extensions,
234 const VideoCodecs& video_codecs,
235 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200236 SessionDescription* desc,
237 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000238
239 bool AddDataContentForOffer(
zhihuang1c378ed2017-08-17 14:10:50 -0700240 const MediaDescriptionOptions& media_description_options,
241 const MediaSessionOptions& session_options,
242 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000243 const SessionDescription* current_description,
zhihuang1c378ed2017-08-17 14:10:50 -0700244 const DataCodecs& data_codecs,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000245 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200246 SessionDescription* desc,
247 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000248
zhihuang1c378ed2017-08-17 14:10:50 -0700249 bool AddAudioContentForAnswer(
250 const MediaDescriptionOptions& media_description_options,
251 const MediaSessionOptions& session_options,
252 const ContentInfo* offer_content,
253 const SessionDescription* offer_description,
254 const ContentInfo* current_content,
255 const SessionDescription* current_description,
256 const TransportInfo* bundle_transport,
257 const AudioCodecs& audio_codecs,
258 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200259 SessionDescription* answer,
260 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000261
zhihuang1c378ed2017-08-17 14:10:50 -0700262 bool AddVideoContentForAnswer(
263 const MediaDescriptionOptions& media_description_options,
264 const MediaSessionOptions& session_options,
265 const ContentInfo* offer_content,
266 const SessionDescription* offer_description,
267 const ContentInfo* current_content,
268 const SessionDescription* current_description,
269 const TransportInfo* bundle_transport,
270 const VideoCodecs& video_codecs,
271 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200272 SessionDescription* answer,
273 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000274
zhihuang1c378ed2017-08-17 14:10:50 -0700275 bool AddDataContentForAnswer(
276 const MediaDescriptionOptions& media_description_options,
277 const MediaSessionOptions& session_options,
278 const ContentInfo* offer_content,
279 const SessionDescription* offer_description,
280 const ContentInfo* current_content,
281 const SessionDescription* current_description,
282 const TransportInfo* bundle_transport,
283 const DataCodecs& data_codecs,
284 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200285 SessionDescription* answer,
286 IceCredentialsIterator* ice_credentials) const;
zhihuang1c378ed2017-08-17 14:10:50 -0700287
288 void ComputeAudioCodecsIntersectionAndUnion();
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000289
Steve Anton8f66ddb2018-12-10 16:08:05 -0800290 bool is_unified_plan_ = false;
ossu075af922016-06-14 03:29:38 -0700291 AudioCodecs audio_send_codecs_;
292 AudioCodecs audio_recv_codecs_;
zhihuang1c378ed2017-08-17 14:10:50 -0700293 // Intersection of send and recv.
ossu075af922016-06-14 03:29:38 -0700294 AudioCodecs audio_sendrecv_codecs_;
zhihuang1c378ed2017-08-17 14:10:50 -0700295 // Union of send and recv.
296 AudioCodecs all_audio_codecs_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000297 RtpHeaderExtensions audio_rtp_extensions_;
298 VideoCodecs video_codecs_;
299 RtpHeaderExtensions video_rtp_extensions_;
300 DataCodecs data_codecs_;
jbauch5869f502017-06-29 12:31:36 -0700301 bool enable_encrypted_rtp_header_extensions_ = false;
zhihuang1c378ed2017-08-17 14:10:50 -0700302 // TODO(zhihuang): Rename secure_ to sdec_policy_; rename the related getter
303 // and setter.
304 SecurePolicy secure_ = SEC_DISABLED;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000305 const TransportDescriptionFactory* transport_desc_factory_;
306};
307
308// Convenience functions.
309bool IsMediaContent(const ContentInfo* content);
310bool IsAudioContent(const ContentInfo* content);
311bool IsVideoContent(const ContentInfo* content);
312bool IsDataContent(const ContentInfo* content);
deadbeef0ed85b22016-02-23 17:24:52 -0800313const ContentInfo* GetFirstMediaContent(const ContentInfos& contents,
314 MediaType media_type);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000315const ContentInfo* GetFirstAudioContent(const ContentInfos& contents);
316const ContentInfo* GetFirstVideoContent(const ContentInfos& contents);
317const ContentInfo* GetFirstDataContent(const ContentInfos& contents);
Steve Antonad7bffc2018-01-22 10:21:56 -0800318const ContentInfo* GetFirstMediaContent(const SessionDescription* sdesc,
319 MediaType media_type);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc);
321const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc);
322const ContentInfo* GetFirstDataContent(const SessionDescription* sdesc);
323const AudioContentDescription* GetFirstAudioContentDescription(
324 const SessionDescription* sdesc);
325const VideoContentDescription* GetFirstVideoContentDescription(
326 const SessionDescription* sdesc);
327const DataContentDescription* GetFirstDataContentDescription(
328 const SessionDescription* sdesc);
Taylor Brandstetterdc4eb8c2016-05-12 08:14:50 -0700329// Non-const versions of the above functions.
330// Useful when modifying an existing description.
Steve Anton36b29d12017-10-30 09:57:42 -0700331ContentInfo* GetFirstMediaContent(ContentInfos* contents, MediaType media_type);
332ContentInfo* GetFirstAudioContent(ContentInfos* contents);
333ContentInfo* GetFirstVideoContent(ContentInfos* contents);
334ContentInfo* GetFirstDataContent(ContentInfos* contents);
Steve Antonad7bffc2018-01-22 10:21:56 -0800335ContentInfo* GetFirstMediaContent(SessionDescription* sdesc,
336 MediaType media_type);
Taylor Brandstetterdc4eb8c2016-05-12 08:14:50 -0700337ContentInfo* GetFirstAudioContent(SessionDescription* sdesc);
338ContentInfo* GetFirstVideoContent(SessionDescription* sdesc);
339ContentInfo* GetFirstDataContent(SessionDescription* sdesc);
340AudioContentDescription* GetFirstAudioContentDescription(
341 SessionDescription* sdesc);
342VideoContentDescription* GetFirstVideoContentDescription(
343 SessionDescription* sdesc);
344DataContentDescription* GetFirstDataContentDescription(
345 SessionDescription* sdesc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000346
deadbeef7914b8c2017-04-21 03:23:33 -0700347// Helper functions to return crypto suites used for SDES.
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700348void GetSupportedAudioSdesCryptoSuites(
349 const webrtc::CryptoOptions& crypto_options,
350 std::vector<int>* crypto_suites);
351void GetSupportedVideoSdesCryptoSuites(
352 const webrtc::CryptoOptions& crypto_options,
353 std::vector<int>* crypto_suites);
354void GetSupportedDataSdesCryptoSuites(
355 const webrtc::CryptoOptions& crypto_options,
356 std::vector<int>* crypto_suites);
deadbeef7914b8c2017-04-21 03:23:33 -0700357void GetSupportedAudioSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700358 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800359 std::vector<std::string>* crypto_suite_names);
deadbeef7914b8c2017-04-21 03:23:33 -0700360void GetSupportedVideoSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700361 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800362 std::vector<std::string>* crypto_suite_names);
deadbeef7914b8c2017-04-21 03:23:33 -0700363void GetSupportedDataSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700364 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800365 std::vector<std::string>* crypto_suite_names);
366
Steve Antonfa2260d2017-12-28 16:38:23 -0800367// Returns true if the given media section protocol indicates use of RTP.
368bool IsRtpProtocol(const std::string& protocol);
369
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370} // namespace cricket
371
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200372#endif // PC_MEDIASESSION_H_