blob: 8ba6293b664ebf0d58e998525ad7a5f31d230fb1 [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
Steve Anton10542f22019-01-11 09:11:00 -080013#ifndef PC_MEDIA_SESSION_H_
14#define PC_MEDIA_SESSION_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015
deadbeef0ed85b22016-02-23 17:24:52 -080016#include <map>
Steve Anton1a9d3c32018-12-10 17:18:54 -080017#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018#include <string>
19#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000020
Steve Anton10542f22019-01-11 09:11:00 -080021#include "api/media_types.h"
22#include "media/base/media_constants.h"
23#include "media/base/media_engine.h" // For DataChannelType
24#include "p2p/base/ice_credentials_iterator.h"
25#include "p2p/base/transport_description_factory.h"
26#include "pc/jsep_transport.h"
Harald Alvestrand5fc28b12019-05-13 13:36:16 +020027#include "pc/media_protocol_names.h"
Steve Anton10542f22019-01-11 09:11:00 -080028#include "pc/session_description.h"
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080029#include "rtc_base/unique_id_generator.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030
31namespace cricket {
32
33class ChannelManager;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034
zhihuang8f65cdf2016-05-06 18:40:30 -070035// Default RTCP CNAME for unit tests.
36const char kDefaultRtcpCname[] = "DefaultRtcpCname";
37
zhihuang1c378ed2017-08-17 14:10:50 -070038// Options for an RtpSender contained with an media description/"m=" section.
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080039// Note: Spec-compliant Simulcast and legacy simulcast are mutually exclusive.
zhihuang1c378ed2017-08-17 14:10:50 -070040struct SenderOptions {
41 std::string track_id;
Steve Anton8ffb9c32017-08-31 15:45:38 -070042 std::vector<std::string> stream_ids;
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080043 // Use RIDs and Simulcast Layers to indicate spec-compliant Simulcast.
44 std::vector<RidDescription> rids;
45 SimulcastLayerList simulcast_layers;
46 // Use |num_sim_layers| to indicate legacy simulcast.
zhihuang1c378ed2017-08-17 14:10:50 -070047 int num_sim_layers;
48};
jiayl@webrtc.org742922b2014-10-07 21:32:43 +000049
zhihuang1c378ed2017-08-17 14:10:50 -070050// Options for an individual media description/"m=" section.
51struct MediaDescriptionOptions {
52 MediaDescriptionOptions(MediaType type,
53 const std::string& mid,
Steve Anton1d03a752017-11-27 14:30:09 -080054 webrtc::RtpTransceiverDirection direction,
zhihuang1c378ed2017-08-17 14:10:50 -070055 bool stopped)
56 : type(type), mid(mid), direction(direction), stopped(stopped) {}
zhihuanga77e6bb2017-08-14 18:17:48 -070057
zhihuang1c378ed2017-08-17 14:10:50 -070058 // TODO(deadbeef): When we don't support Plan B, there will only be one
59 // sender per media description and this can be simplified.
60 void AddAudioSender(const std::string& track_id,
Steve Anton8ffb9c32017-08-31 15:45:38 -070061 const std::vector<std::string>& stream_ids);
zhihuang1c378ed2017-08-17 14:10:50 -070062 void AddVideoSender(const std::string& track_id,
Steve Anton8ffb9c32017-08-31 15:45:38 -070063 const std::vector<std::string>& stream_ids,
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080064 const std::vector<RidDescription>& rids,
65 const SimulcastLayerList& simulcast_layers,
olka3c747662017-08-17 06:50:32 -070066 int num_sim_layers);
zhihuanga77e6bb2017-08-14 18:17:48 -070067
zhihuang1c378ed2017-08-17 14:10:50 -070068 // Internally just uses sender_options.
69 void AddRtpDataChannel(const std::string& track_id,
70 const std::string& stream_id);
olka3c747662017-08-17 06:50:32 -070071
zhihuang1c378ed2017-08-17 14:10:50 -070072 MediaType type;
73 std::string mid;
Steve Anton1d03a752017-11-27 14:30:09 -080074 webrtc::RtpTransceiverDirection direction;
zhihuang1c378ed2017-08-17 14:10:50 -070075 bool stopped;
76 TransportOptions transport_options;
77 // Note: There's no equivalent "RtpReceiverOptions" because only send
78 // stream information goes in the local descriptions.
79 std::vector<SenderOptions> sender_options;
Florent Castelli2d9d82e2019-04-23 19:25:51 +020080 std::vector<webrtc::RtpCodecCapability> codec_preferences;
zhihuang1c378ed2017-08-17 14:10:50 -070081
82 private:
83 // Doesn't DCHECK on |type|.
84 void AddSenderInternal(const std::string& track_id,
Steve Anton8ffb9c32017-08-31 15:45:38 -070085 const std::vector<std::string>& stream_ids,
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080086 const std::vector<RidDescription>& rids,
87 const SimulcastLayerList& simulcast_layers,
olka3c747662017-08-17 06:50:32 -070088 int num_sim_layers);
zhihuang1c378ed2017-08-17 14:10:50 -070089};
olka3c747662017-08-17 06:50:32 -070090
zhihuang1c378ed2017-08-17 14:10:50 -070091// Provides a mechanism for describing how m= sections should be generated.
92// The m= section with index X will use media_description_options[X]. There
93// must be an option for each existing section if creating an answer, or a
94// subsequent offer.
95struct MediaSessionOptions {
96 MediaSessionOptions() {}
olka3c747662017-08-17 06:50:32 -070097
zhihuang1c378ed2017-08-17 14:10:50 -070098 bool has_audio() const { return HasMediaDescription(MEDIA_TYPE_AUDIO); }
99 bool has_video() const { return HasMediaDescription(MEDIA_TYPE_VIDEO); }
100 bool has_data() const { return HasMediaDescription(MEDIA_TYPE_DATA); }
101
102 bool HasMediaDescription(MediaType type) const;
103
104 DataChannelType data_channel_type = DCT_NONE;
zhihuang1c378ed2017-08-17 14:10:50 -0700105 bool vad_enabled = true; // When disabled, removes all CN codecs from SDP.
106 bool rtcp_mux_enabled = true;
107 bool bundle_enabled = false;
Johannes Kron89f874e2018-11-12 10:25:48 +0100108 bool offer_extmap_allow_mixed = false;
zhihuang1c378ed2017-08-17 14:10:50 -0700109 std::string rtcp_cname = kDefaultRtcpCname;
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700110 webrtc::CryptoOptions crypto_options;
zhihuang1c378ed2017-08-17 14:10:50 -0700111 // List of media description options in the same order that the media
112 // descriptions will be generated.
113 std::vector<MediaDescriptionOptions> media_description_options;
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200114 std::vector<IceParameters> pooled_ice_credentials;
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800115
116 // An optional media transport settings.
117 // In the future we may consider using a vector here, to indicate multiple
118 // supported transports.
119 absl::optional<cricket::SessionDescription::MediaTransportSetting>
120 media_transport_settings;
Harald Alvestrand4aa11922019-05-14 22:00:01 +0200121 // Use the draft-ietf-mmusic-sctp-sdp-03 obsolete syntax for SCTP
122 // datachannels.
123 // Default is true for backwards compatibility with clients that use
124 // this internal interface.
125 bool use_obsolete_sctp_sdp = true;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000126};
127
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128// Creates media session descriptions according to the supplied codecs and
129// other fields, as well as the supplied per-call options.
130// When creating answers, performs the appropriate negotiation
131// of the various fields to determine the proper result.
132class MediaSessionDescriptionFactory {
133 public:
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800134 // Simple constructor that does not set any configuration for the factory.
135 // When using this constructor, the methods below can be used to set the
136 // configuration.
137 // The TransportDescriptionFactory and the UniqueRandomIdGenerator are not
138 // owned by MediaSessionDescriptionFactory, so they must be kept alive by the
139 // user of this class.
140 MediaSessionDescriptionFactory(const TransportDescriptionFactory* factory,
141 rtc::UniqueRandomIdGenerator* ssrc_generator);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 // This helper automatically sets up the factory to get its configuration
143 // from the specified ChannelManager.
144 MediaSessionDescriptionFactory(ChannelManager* cmanager,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800145 const TransportDescriptionFactory* factory,
146 rtc::UniqueRandomIdGenerator* ssrc_generator);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000147
ossudedfd282016-06-14 07:12:39 -0700148 const AudioCodecs& audio_sendrecv_codecs() const;
ossu075af922016-06-14 03:29:38 -0700149 const AudioCodecs& audio_send_codecs() const;
150 const AudioCodecs& audio_recv_codecs() const;
151 void set_audio_codecs(const AudioCodecs& send_codecs,
152 const AudioCodecs& recv_codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 void set_audio_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
154 audio_rtp_extensions_ = extensions;
155 }
Amit Hilbuch77938e62018-12-21 09:23:38 -0800156 RtpHeaderExtensions audio_rtp_header_extensions() const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157 const VideoCodecs& video_codecs() const { return video_codecs_; }
158 void set_video_codecs(const VideoCodecs& codecs) { video_codecs_ = codecs; }
159 void set_video_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
160 video_rtp_extensions_ = extensions;
161 }
Amit Hilbuch77938e62018-12-21 09:23:38 -0800162 RtpHeaderExtensions video_rtp_header_extensions() const;
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200163 const RtpDataCodecs& rtp_data_codecs() const { return rtp_data_codecs_; }
164 void set_rtp_data_codecs(const RtpDataCodecs& codecs) {
165 rtp_data_codecs_ = codecs;
166 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 SecurePolicy secure() const { return secure_; }
168 void set_secure(SecurePolicy s) { secure_ = s; }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169
jbauch5869f502017-06-29 12:31:36 -0700170 void set_enable_encrypted_rtp_header_extensions(bool enable) {
171 enable_encrypted_rtp_header_extensions_ = enable;
172 }
173
Steve Anton8f66ddb2018-12-10 16:08:05 -0800174 void set_is_unified_plan(bool is_unified_plan) {
175 is_unified_plan_ = is_unified_plan;
176 }
177
Steve Anton6fe1fba2018-12-11 10:15:23 -0800178 std::unique_ptr<SessionDescription> CreateOffer(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000179 const MediaSessionOptions& options,
180 const SessionDescription* current_description) const;
Steve Anton6fe1fba2018-12-11 10:15:23 -0800181 std::unique_ptr<SessionDescription> CreateAnswer(
zstein4b2e0822017-02-17 19:48:38 -0800182 const SessionDescription* offer,
183 const MediaSessionOptions& options,
184 const SessionDescription* current_description) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185
186 private:
ossu075af922016-06-14 03:29:38 -0700187 const AudioCodecs& GetAudioCodecsForOffer(
Steve Anton1d03a752017-11-27 14:30:09 -0800188 const webrtc::RtpTransceiverDirection& direction) const;
ossu075af922016-06-14 03:29:38 -0700189 const AudioCodecs& GetAudioCodecsForAnswer(
Steve Anton1d03a752017-11-27 14:30:09 -0800190 const webrtc::RtpTransceiverDirection& offer,
191 const webrtc::RtpTransceiverDirection& answer) const;
Steve Anton5c72e712018-12-10 14:25:30 -0800192 void GetCodecsForOffer(
193 const std::vector<const ContentInfo*>& current_active_contents,
194 AudioCodecs* audio_codecs,
195 VideoCodecs* video_codecs,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200196 RtpDataCodecs* rtp_data_codecs) const;
Steve Anton5c72e712018-12-10 14:25:30 -0800197 void GetCodecsForAnswer(
198 const std::vector<const ContentInfo*>& current_active_contents,
199 const SessionDescription& remote_offer,
200 AudioCodecs* audio_codecs,
201 VideoCodecs* video_codecs,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200202 RtpDataCodecs* rtp_data_codecs) const;
Steve Anton5c72e712018-12-10 14:25:30 -0800203 void GetRtpHdrExtsToOffer(
204 const std::vector<const ContentInfo*>& current_active_contents,
Steve Anton5c72e712018-12-10 14:25:30 -0800205 RtpHeaderExtensions* audio_extensions,
206 RtpHeaderExtensions* video_extensions) const;
Yves Gerey665174f2018-06-19 15:03:05 +0200207 bool AddTransportOffer(const std::string& content_name,
208 const TransportOptions& transport_options,
209 const SessionDescription* current_desc,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200210 SessionDescription* offer,
211 IceCredentialsIterator* ice_credentials) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000212
Steve Anton1a9d3c32018-12-10 17:18:54 -0800213 std::unique_ptr<TransportDescription> CreateTransportAnswer(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000214 const std::string& content_name,
215 const SessionDescription* offer_desc,
216 const TransportOptions& transport_options,
deadbeefb7892532017-02-22 19:35:18 -0800217 const SessionDescription* current_desc,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200218 bool require_transport_attributes,
219 IceCredentialsIterator* ice_credentials) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000220
Yves Gerey665174f2018-06-19 15:03:05 +0200221 bool AddTransportAnswer(const std::string& content_name,
222 const TransportDescription& transport_desc,
223 SessionDescription* answer_desc) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000224
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000225 // Helpers for adding media contents to the SessionDescription. Returns true
226 // it succeeds or the media content is not needed, or false if there is any
227 // error.
228
229 bool AddAudioContentForOffer(
zhihuang1c378ed2017-08-17 14:10:50 -0700230 const MediaDescriptionOptions& media_description_options,
231 const MediaSessionOptions& session_options,
232 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000233 const SessionDescription* current_description,
234 const RtpHeaderExtensions& audio_rtp_extensions,
235 const AudioCodecs& audio_codecs,
236 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200237 SessionDescription* desc,
238 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000239
240 bool AddVideoContentForOffer(
zhihuang1c378ed2017-08-17 14:10:50 -0700241 const MediaDescriptionOptions& media_description_options,
242 const MediaSessionOptions& session_options,
243 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000244 const SessionDescription* current_description,
245 const RtpHeaderExtensions& video_rtp_extensions,
246 const VideoCodecs& video_codecs,
247 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200248 SessionDescription* desc,
249 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000250
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200251 bool AddSctpDataContentForOffer(
252 const MediaDescriptionOptions& media_description_options,
253 const MediaSessionOptions& session_options,
254 const ContentInfo* current_content,
255 const SessionDescription* current_description,
256 StreamParamsVec* current_streams,
257 SessionDescription* desc,
258 IceCredentialsIterator* ice_credentials) const;
259 bool AddRtpDataContentForOffer(
260 const MediaDescriptionOptions& media_description_options,
261 const MediaSessionOptions& session_options,
262 const ContentInfo* current_content,
263 const SessionDescription* current_description,
264 const RtpDataCodecs& rtp_data_codecs,
265 StreamParamsVec* current_streams,
266 SessionDescription* desc,
267 IceCredentialsIterator* ice_credentials) const;
268 // This function calls either AddRtpDataContentForOffer or
269 // AddSctpDataContentForOffer depending on protocol.
270 // The codecs argument is ignored for SCTP.
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000271 bool AddDataContentForOffer(
zhihuang1c378ed2017-08-17 14:10:50 -0700272 const MediaDescriptionOptions& media_description_options,
273 const MediaSessionOptions& session_options,
274 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000275 const SessionDescription* current_description,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200276 const RtpDataCodecs& rtp_data_codecs,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000277 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200278 SessionDescription* desc,
279 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000280
zhihuang1c378ed2017-08-17 14:10:50 -0700281 bool AddAudioContentForAnswer(
282 const MediaDescriptionOptions& media_description_options,
283 const MediaSessionOptions& session_options,
284 const ContentInfo* offer_content,
285 const SessionDescription* offer_description,
286 const ContentInfo* current_content,
287 const SessionDescription* current_description,
288 const TransportInfo* bundle_transport,
289 const AudioCodecs& audio_codecs,
290 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200291 SessionDescription* answer,
292 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000293
zhihuang1c378ed2017-08-17 14:10:50 -0700294 bool AddVideoContentForAnswer(
295 const MediaDescriptionOptions& media_description_options,
296 const MediaSessionOptions& session_options,
297 const ContentInfo* offer_content,
298 const SessionDescription* offer_description,
299 const ContentInfo* current_content,
300 const SessionDescription* current_description,
301 const TransportInfo* bundle_transport,
302 const VideoCodecs& video_codecs,
303 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200304 SessionDescription* answer,
305 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000306
zhihuang1c378ed2017-08-17 14:10:50 -0700307 bool AddDataContentForAnswer(
308 const MediaDescriptionOptions& media_description_options,
309 const MediaSessionOptions& session_options,
310 const ContentInfo* offer_content,
311 const SessionDescription* offer_description,
312 const ContentInfo* current_content,
313 const SessionDescription* current_description,
314 const TransportInfo* bundle_transport,
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200315 const RtpDataCodecs& rtp_data_codecs,
zhihuang1c378ed2017-08-17 14:10:50 -0700316 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 07:47:12 +0200317 SessionDescription* answer,
318 IceCredentialsIterator* ice_credentials) const;
zhihuang1c378ed2017-08-17 14:10:50 -0700319
320 void ComputeAudioCodecsIntersectionAndUnion();
jiayl@webrtc.orge7d47a12014-08-05 19:19:05 +0000321
Steve Anton8f66ddb2018-12-10 16:08:05 -0800322 bool is_unified_plan_ = false;
ossu075af922016-06-14 03:29:38 -0700323 AudioCodecs audio_send_codecs_;
324 AudioCodecs audio_recv_codecs_;
zhihuang1c378ed2017-08-17 14:10:50 -0700325 // Intersection of send and recv.
ossu075af922016-06-14 03:29:38 -0700326 AudioCodecs audio_sendrecv_codecs_;
zhihuang1c378ed2017-08-17 14:10:50 -0700327 // Union of send and recv.
328 AudioCodecs all_audio_codecs_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000329 RtpHeaderExtensions audio_rtp_extensions_;
330 VideoCodecs video_codecs_;
331 RtpHeaderExtensions video_rtp_extensions_;
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200332 RtpDataCodecs rtp_data_codecs_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800333 // This object is not owned by the channel so it must outlive it.
334 rtc::UniqueRandomIdGenerator* const ssrc_generator_;
jbauch5869f502017-06-29 12:31:36 -0700335 bool enable_encrypted_rtp_header_extensions_ = false;
zhihuang1c378ed2017-08-17 14:10:50 -0700336 // TODO(zhihuang): Rename secure_ to sdec_policy_; rename the related getter
337 // and setter.
338 SecurePolicy secure_ = SEC_DISABLED;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 const TransportDescriptionFactory* transport_desc_factory_;
340};
341
342// Convenience functions.
343bool IsMediaContent(const ContentInfo* content);
344bool IsAudioContent(const ContentInfo* content);
345bool IsVideoContent(const ContentInfo* content);
346bool IsDataContent(const ContentInfo* content);
deadbeef0ed85b22016-02-23 17:24:52 -0800347const ContentInfo* GetFirstMediaContent(const ContentInfos& contents,
348 MediaType media_type);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000349const ContentInfo* GetFirstAudioContent(const ContentInfos& contents);
350const ContentInfo* GetFirstVideoContent(const ContentInfos& contents);
351const ContentInfo* GetFirstDataContent(const ContentInfos& contents);
Steve Antonad7bffc2018-01-22 10:21:56 -0800352const ContentInfo* GetFirstMediaContent(const SessionDescription* sdesc,
353 MediaType media_type);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000354const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc);
355const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc);
356const ContentInfo* GetFirstDataContent(const SessionDescription* sdesc);
357const AudioContentDescription* GetFirstAudioContentDescription(
358 const SessionDescription* sdesc);
359const VideoContentDescription* GetFirstVideoContentDescription(
360 const SessionDescription* sdesc);
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200361const RtpDataContentDescription* GetFirstRtpDataContentDescription(
362 const SessionDescription* sdesc);
363const SctpDataContentDescription* GetFirstSctpDataContentDescription(
364 const SessionDescription* sdesc);
365// Returns shim. Deprecated - ask for the right protocol instead.
Harald Alvestranda33a8602019-05-28 11:33:50 +0200366RTC_DEPRECATED const DataContentDescription* GetFirstDataContentDescription(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 const SessionDescription* sdesc);
Taylor Brandstetterdc4eb8c2016-05-12 08:14:50 -0700368// Non-const versions of the above functions.
369// Useful when modifying an existing description.
Steve Anton36b29d12017-10-30 09:57:42 -0700370ContentInfo* GetFirstMediaContent(ContentInfos* contents, MediaType media_type);
371ContentInfo* GetFirstAudioContent(ContentInfos* contents);
372ContentInfo* GetFirstVideoContent(ContentInfos* contents);
373ContentInfo* GetFirstDataContent(ContentInfos* contents);
Steve Antonad7bffc2018-01-22 10:21:56 -0800374ContentInfo* GetFirstMediaContent(SessionDescription* sdesc,
375 MediaType media_type);
Taylor Brandstetterdc4eb8c2016-05-12 08:14:50 -0700376ContentInfo* GetFirstAudioContent(SessionDescription* sdesc);
377ContentInfo* GetFirstVideoContent(SessionDescription* sdesc);
378ContentInfo* GetFirstDataContent(SessionDescription* sdesc);
379AudioContentDescription* GetFirstAudioContentDescription(
380 SessionDescription* sdesc);
381VideoContentDescription* GetFirstVideoContentDescription(
382 SessionDescription* sdesc);
Harald Alvestrand5fc28b12019-05-13 13:36:16 +0200383RtpDataContentDescription* GetFirstRtpDataContentDescription(
384 SessionDescription* sdesc);
385SctpDataContentDescription* GetFirstSctpDataContentDescription(
386 SessionDescription* sdesc);
Harald Alvestranda33a8602019-05-28 11:33:50 +0200387RTC_DEPRECATED DataContentDescription* GetFirstDataContentDescription(
Taylor Brandstetterdc4eb8c2016-05-12 08:14:50 -0700388 SessionDescription* sdesc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389
deadbeef7914b8c2017-04-21 03:23:33 -0700390// Helper functions to return crypto suites used for SDES.
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700391void GetSupportedAudioSdesCryptoSuites(
392 const webrtc::CryptoOptions& crypto_options,
393 std::vector<int>* crypto_suites);
394void GetSupportedVideoSdesCryptoSuites(
395 const webrtc::CryptoOptions& crypto_options,
396 std::vector<int>* crypto_suites);
397void GetSupportedDataSdesCryptoSuites(
398 const webrtc::CryptoOptions& crypto_options,
399 std::vector<int>* crypto_suites);
deadbeef7914b8c2017-04-21 03:23:33 -0700400void GetSupportedAudioSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700401 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800402 std::vector<std::string>* crypto_suite_names);
deadbeef7914b8c2017-04-21 03:23:33 -0700403void GetSupportedVideoSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700404 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800405 std::vector<std::string>* crypto_suite_names);
deadbeef7914b8c2017-04-21 03:23:33 -0700406void GetSupportedDataSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700407 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800408 std::vector<std::string>* crypto_suite_names);
409
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410} // namespace cricket
411
Steve Anton10542f22019-01-11 09:11:00 -0800412#endif // PC_MEDIA_SESSION_H_