blob: ef83834318f19dbc3139168cc553140d0ca42b9d [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:361/*
kjellander65c7f672016-02-12 08:05:012 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:363 *
kjellander65c7f672016-02-12 08:05:014 * 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:369 */
10
11// Types and classes used in media session descriptions.
12
Steve Anton10542f22019-01-11 17:11:0013#ifndef PC_MEDIA_SESSION_H_
14#define PC_MEDIA_SESSION_H_
henrike@webrtc.org28e20752013-07-10 00:45:3615
deadbeef0ed85b22016-02-24 01:24:5216#include <map>
Steve Anton1a9d3c32018-12-11 01:18:5417#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:3618#include <string>
19#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:3620
Steve Anton10542f22019-01-11 17:11:0021#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 11:36:1627#include "pc/media_protocol_names.h"
Steve Anton10542f22019-01-11 17:11:0028#include "pc/session_description.h"
Amit Hilbuchbcd39d42019-01-26 01:13:5629#include "rtc_base/unique_id_generator.h"
henrike@webrtc.org28e20752013-07-10 00:45:3630
31namespace cricket {
32
33class ChannelManager;
henrike@webrtc.org28e20752013-07-10 00:45:3634
zhihuang8f65cdf2016-05-07 01:40:3035// Default RTCP CNAME for unit tests.
36const char kDefaultRtcpCname[] = "DefaultRtcpCname";
37
zhihuang1c378ed2017-08-17 21:10:5038// Options for an RtpSender contained with an media description/"m=" section.
Amit Hilbuchc63ddb22019-01-02 18:13:5839// Note: Spec-compliant Simulcast and legacy simulcast are mutually exclusive.
zhihuang1c378ed2017-08-17 21:10:5040struct SenderOptions {
41 std::string track_id;
Steve Anton8ffb9c32017-08-31 22:45:3842 std::vector<std::string> stream_ids;
Amit Hilbuchc63ddb22019-01-02 18:13:5843 // 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 21:10:5047 int num_sim_layers;
48};
jiayl@webrtc.org742922b2014-10-07 21:32:4349
zhihuang1c378ed2017-08-17 21:10:5050// Options for an individual media description/"m=" section.
51struct MediaDescriptionOptions {
52 MediaDescriptionOptions(MediaType type,
53 const std::string& mid,
Steve Anton1d03a752017-11-27 22:30:0954 webrtc::RtpTransceiverDirection direction,
zhihuang1c378ed2017-08-17 21:10:5055 bool stopped)
56 : type(type), mid(mid), direction(direction), stopped(stopped) {}
zhihuanga77e6bb2017-08-15 01:17:4857
zhihuang1c378ed2017-08-17 21:10:5058 // 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 22:45:3861 const std::vector<std::string>& stream_ids);
zhihuang1c378ed2017-08-17 21:10:5062 void AddVideoSender(const std::string& track_id,
Steve Anton8ffb9c32017-08-31 22:45:3863 const std::vector<std::string>& stream_ids,
Amit Hilbuchc63ddb22019-01-02 18:13:5864 const std::vector<RidDescription>& rids,
65 const SimulcastLayerList& simulcast_layers,
olka3c747662017-08-17 13:50:3266 int num_sim_layers);
zhihuanga77e6bb2017-08-15 01:17:4867
zhihuang1c378ed2017-08-17 21:10:5068 // Internally just uses sender_options.
69 void AddRtpDataChannel(const std::string& track_id,
70 const std::string& stream_id);
olka3c747662017-08-17 13:50:3271
zhihuang1c378ed2017-08-17 21:10:5072 MediaType type;
73 std::string mid;
Steve Anton1d03a752017-11-27 22:30:0974 webrtc::RtpTransceiverDirection direction;
zhihuang1c378ed2017-08-17 21:10:5075 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 17:25:5180 std::vector<webrtc::RtpCodecCapability> codec_preferences;
Bjorn A Mellem8e1343a2019-09-30 22:12:4781 absl::optional<std::string> alt_protocol;
zhihuang1c378ed2017-08-17 21:10:5082
83 private:
84 // Doesn't DCHECK on |type|.
85 void AddSenderInternal(const std::string& track_id,
Steve Anton8ffb9c32017-08-31 22:45:3886 const std::vector<std::string>& stream_ids,
Amit Hilbuchc63ddb22019-01-02 18:13:5887 const std::vector<RidDescription>& rids,
88 const SimulcastLayerList& simulcast_layers,
olka3c747662017-08-17 13:50:3289 int num_sim_layers);
zhihuang1c378ed2017-08-17 21:10:5090};
olka3c747662017-08-17 13:50:3291
zhihuang1c378ed2017-08-17 21:10:5092// Provides a mechanism for describing how m= sections should be generated.
93// The m= section with index X will use media_description_options[X]. There
94// must be an option for each existing section if creating an answer, or a
95// subsequent offer.
96struct MediaSessionOptions {
97 MediaSessionOptions() {}
olka3c747662017-08-17 13:50:3298
zhihuang1c378ed2017-08-17 21:10:5099 bool has_audio() const { return HasMediaDescription(MEDIA_TYPE_AUDIO); }
100 bool has_video() const { return HasMediaDescription(MEDIA_TYPE_VIDEO); }
101 bool has_data() const { return HasMediaDescription(MEDIA_TYPE_DATA); }
102
103 bool HasMediaDescription(MediaType type) const;
104
105 DataChannelType data_channel_type = DCT_NONE;
zhihuang1c378ed2017-08-17 21:10:50106 bool vad_enabled = true; // When disabled, removes all CN codecs from SDP.
107 bool rtcp_mux_enabled = true;
108 bool bundle_enabled = false;
Johannes Kron89f874e2018-11-12 09:25:48109 bool offer_extmap_allow_mixed = false;
Mirta Dvornicic479a3c02019-06-04 13:38:50110 bool raw_packetization_for_video = false;
zhihuang1c378ed2017-08-17 21:10:50111 std::string rtcp_cname = kDefaultRtcpCname;
Benjamin Wrighta54daf12018-10-11 22:33:17112 webrtc::CryptoOptions crypto_options;
zhihuang1c378ed2017-08-17 21:10:50113 // List of media description options in the same order that the media
114 // descriptions will be generated.
115 std::vector<MediaDescriptionOptions> media_description_options;
Jonas Oreland1cd39fa2018-10-11 05:47:12116 std::vector<IceParameters> pooled_ice_credentials;
Piotr (Peter) Slatalab1ae10b2019-03-01 19:14:05117
Harald Alvestrand4aa11922019-05-14 20:00:01118 // Use the draft-ietf-mmusic-sctp-sdp-03 obsolete syntax for SCTP
119 // datachannels.
120 // Default is true for backwards compatibility with clients that use
121 // this internal interface.
122 bool use_obsolete_sctp_sdp = true;
henrike@webrtc.org28e20752013-07-10 00:45:36123};
124
henrike@webrtc.org28e20752013-07-10 00:45:36125// Creates media session descriptions according to the supplied codecs and
126// other fields, as well as the supplied per-call options.
127// When creating answers, performs the appropriate negotiation
128// of the various fields to determine the proper result.
129class MediaSessionDescriptionFactory {
130 public:
Amit Hilbuchbcd39d42019-01-26 01:13:56131 // Simple constructor that does not set any configuration for the factory.
132 // When using this constructor, the methods below can be used to set the
133 // configuration.
134 // The TransportDescriptionFactory and the UniqueRandomIdGenerator are not
135 // owned by MediaSessionDescriptionFactory, so they must be kept alive by the
136 // user of this class.
137 MediaSessionDescriptionFactory(const TransportDescriptionFactory* factory,
138 rtc::UniqueRandomIdGenerator* ssrc_generator);
henrike@webrtc.org28e20752013-07-10 00:45:36139 // This helper automatically sets up the factory to get its configuration
140 // from the specified ChannelManager.
141 MediaSessionDescriptionFactory(ChannelManager* cmanager,
Amit Hilbuchbcd39d42019-01-26 01:13:56142 const TransportDescriptionFactory* factory,
143 rtc::UniqueRandomIdGenerator* ssrc_generator);
henrike@webrtc.org28e20752013-07-10 00:45:36144
ossudedfd282016-06-14 14:12:39145 const AudioCodecs& audio_sendrecv_codecs() const;
ossu075af922016-06-14 10:29:38146 const AudioCodecs& audio_send_codecs() const;
147 const AudioCodecs& audio_recv_codecs() const;
148 void set_audio_codecs(const AudioCodecs& send_codecs,
149 const AudioCodecs& recv_codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36150 void set_audio_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
151 audio_rtp_extensions_ = extensions;
152 }
Amit Hilbuch77938e62018-12-21 17:23:38153 RtpHeaderExtensions audio_rtp_header_extensions() const;
Johannes Kron3e983682020-03-29 20:17:00154 const VideoCodecs& video_sendrecv_codecs() const;
155 const VideoCodecs& video_send_codecs() const;
156 const VideoCodecs& video_recv_codecs() const;
157 void set_video_codecs(const VideoCodecs& send_codecs,
158 const VideoCodecs& recv_codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36159 void set_video_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
160 video_rtp_extensions_ = extensions;
161 }
Amit Hilbuch77938e62018-12-21 17:23:38162 RtpHeaderExtensions video_rtp_header_extensions() const;
Harald Alvestrand5fc28b12019-05-13 11:36:16163 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:36167 SecurePolicy secure() const { return secure_; }
168 void set_secure(SecurePolicy s) { secure_ = s; }
henrike@webrtc.org28e20752013-07-10 00:45:36169
jbauch5869f502017-06-29 19:31:36170 void set_enable_encrypted_rtp_header_extensions(bool enable) {
171 enable_encrypted_rtp_header_extensions_ = enable;
172 }
173
Steve Anton8f66ddb2018-12-11 00:08:05174 void set_is_unified_plan(bool is_unified_plan) {
175 is_unified_plan_ = is_unified_plan;
176 }
177
Steve Anton6fe1fba2018-12-11 18:15:23178 std::unique_ptr<SessionDescription> CreateOffer(
henrike@webrtc.org28e20752013-07-10 00:45:36179 const MediaSessionOptions& options,
180 const SessionDescription* current_description) const;
Steve Anton6fe1fba2018-12-11 18:15:23181 std::unique_ptr<SessionDescription> CreateAnswer(
zstein4b2e0822017-02-18 03:48:38182 const SessionDescription* offer,
183 const MediaSessionOptions& options,
184 const SessionDescription* current_description) const;
henrike@webrtc.org28e20752013-07-10 00:45:36185
186 private:
ossu075af922016-06-14 10:29:38187 const AudioCodecs& GetAudioCodecsForOffer(
Steve Anton1d03a752017-11-27 22:30:09188 const webrtc::RtpTransceiverDirection& direction) const;
ossu075af922016-06-14 10:29:38189 const AudioCodecs& GetAudioCodecsForAnswer(
Steve Anton1d03a752017-11-27 22:30:09190 const webrtc::RtpTransceiverDirection& offer,
191 const webrtc::RtpTransceiverDirection& answer) const;
Johannes Kron3e983682020-03-29 20:17:00192 const VideoCodecs& GetVideoCodecsForOffer(
193 const webrtc::RtpTransceiverDirection& direction) const;
194 const VideoCodecs& GetVideoCodecsForAnswer(
195 const webrtc::RtpTransceiverDirection& offer,
196 const webrtc::RtpTransceiverDirection& answer) const;
Steve Anton5c72e712018-12-10 22:25:30197 void GetCodecsForOffer(
198 const std::vector<const ContentInfo*>& current_active_contents,
199 AudioCodecs* audio_codecs,
200 VideoCodecs* video_codecs,
Harald Alvestrand5fc28b12019-05-13 11:36:16201 RtpDataCodecs* rtp_data_codecs) const;
Steve Anton5c72e712018-12-10 22:25:30202 void GetCodecsForAnswer(
203 const std::vector<const ContentInfo*>& current_active_contents,
204 const SessionDescription& remote_offer,
205 AudioCodecs* audio_codecs,
206 VideoCodecs* video_codecs,
Harald Alvestrand5fc28b12019-05-13 11:36:16207 RtpDataCodecs* rtp_data_codecs) const;
Steve Anton5c72e712018-12-10 22:25:30208 void GetRtpHdrExtsToOffer(
209 const std::vector<const ContentInfo*>& current_active_contents,
Johannes Kron746dd0d2019-06-20 13:37:52210 bool extmap_allow_mixed,
Steve Anton5c72e712018-12-10 22:25:30211 RtpHeaderExtensions* audio_extensions,
212 RtpHeaderExtensions* video_extensions) const;
Yves Gerey665174f2018-06-19 13:03:05213 bool AddTransportOffer(const std::string& content_name,
214 const TransportOptions& transport_options,
215 const SessionDescription* current_desc,
Jonas Oreland1cd39fa2018-10-11 05:47:12216 SessionDescription* offer,
217 IceCredentialsIterator* ice_credentials) const;
henrike@webrtc.org28e20752013-07-10 00:45:36218
Steve Anton1a9d3c32018-12-11 01:18:54219 std::unique_ptr<TransportDescription> CreateTransportAnswer(
henrike@webrtc.org28e20752013-07-10 00:45:36220 const std::string& content_name,
221 const SessionDescription* offer_desc,
222 const TransportOptions& transport_options,
deadbeefb7892532017-02-23 03:35:18223 const SessionDescription* current_desc,
Jonas Oreland1cd39fa2018-10-11 05:47:12224 bool require_transport_attributes,
225 IceCredentialsIterator* ice_credentials) const;
henrike@webrtc.org28e20752013-07-10 00:45:36226
Yves Gerey665174f2018-06-19 13:03:05227 bool AddTransportAnswer(const std::string& content_name,
228 const TransportDescription& transport_desc,
229 SessionDescription* answer_desc) const;
henrike@webrtc.org28e20752013-07-10 00:45:36230
jiayl@webrtc.orge7d47a12014-08-05 19:19:05231 // Helpers for adding media contents to the SessionDescription. Returns true
232 // it succeeds or the media content is not needed, or false if there is any
233 // error.
234
235 bool AddAudioContentForOffer(
zhihuang1c378ed2017-08-17 21:10:50236 const MediaDescriptionOptions& media_description_options,
237 const MediaSessionOptions& session_options,
238 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05239 const SessionDescription* current_description,
240 const RtpHeaderExtensions& audio_rtp_extensions,
241 const AudioCodecs& audio_codecs,
242 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 05:47:12243 SessionDescription* desc,
244 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05245
246 bool AddVideoContentForOffer(
zhihuang1c378ed2017-08-17 21:10:50247 const MediaDescriptionOptions& media_description_options,
248 const MediaSessionOptions& session_options,
249 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05250 const SessionDescription* current_description,
251 const RtpHeaderExtensions& video_rtp_extensions,
252 const VideoCodecs& video_codecs,
253 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 05:47:12254 SessionDescription* desc,
255 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05256
Harald Alvestrand5fc28b12019-05-13 11:36:16257 bool AddSctpDataContentForOffer(
258 const MediaDescriptionOptions& media_description_options,
259 const MediaSessionOptions& session_options,
260 const ContentInfo* current_content,
261 const SessionDescription* current_description,
262 StreamParamsVec* current_streams,
263 SessionDescription* desc,
264 IceCredentialsIterator* ice_credentials) const;
265 bool AddRtpDataContentForOffer(
266 const MediaDescriptionOptions& media_description_options,
267 const MediaSessionOptions& session_options,
268 const ContentInfo* current_content,
269 const SessionDescription* current_description,
270 const RtpDataCodecs& rtp_data_codecs,
271 StreamParamsVec* current_streams,
272 SessionDescription* desc,
273 IceCredentialsIterator* ice_credentials) const;
274 // This function calls either AddRtpDataContentForOffer or
275 // AddSctpDataContentForOffer depending on protocol.
276 // The codecs argument is ignored for SCTP.
jiayl@webrtc.orge7d47a12014-08-05 19:19:05277 bool AddDataContentForOffer(
zhihuang1c378ed2017-08-17 21:10:50278 const MediaDescriptionOptions& media_description_options,
279 const MediaSessionOptions& session_options,
280 const ContentInfo* current_content,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05281 const SessionDescription* current_description,
Harald Alvestrand5fc28b12019-05-13 11:36:16282 const RtpDataCodecs& rtp_data_codecs,
jiayl@webrtc.orge7d47a12014-08-05 19:19:05283 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 05:47:12284 SessionDescription* desc,
285 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05286
zhihuang1c378ed2017-08-17 21:10:50287 bool AddAudioContentForAnswer(
288 const MediaDescriptionOptions& media_description_options,
289 const MediaSessionOptions& session_options,
290 const ContentInfo* offer_content,
291 const SessionDescription* offer_description,
292 const ContentInfo* current_content,
293 const SessionDescription* current_description,
294 const TransportInfo* bundle_transport,
295 const AudioCodecs& audio_codecs,
296 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 05:47:12297 SessionDescription* answer,
298 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05299
zhihuang1c378ed2017-08-17 21:10:50300 bool AddVideoContentForAnswer(
301 const MediaDescriptionOptions& media_description_options,
302 const MediaSessionOptions& session_options,
303 const ContentInfo* offer_content,
304 const SessionDescription* offer_description,
305 const ContentInfo* current_content,
306 const SessionDescription* current_description,
307 const TransportInfo* bundle_transport,
308 const VideoCodecs& video_codecs,
309 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 05:47:12310 SessionDescription* answer,
311 IceCredentialsIterator* ice_credentials) const;
jiayl@webrtc.orge7d47a12014-08-05 19:19:05312
zhihuang1c378ed2017-08-17 21:10:50313 bool AddDataContentForAnswer(
314 const MediaDescriptionOptions& media_description_options,
315 const MediaSessionOptions& session_options,
316 const ContentInfo* offer_content,
317 const SessionDescription* offer_description,
318 const ContentInfo* current_content,
319 const SessionDescription* current_description,
320 const TransportInfo* bundle_transport,
Harald Alvestrand5fc28b12019-05-13 11:36:16321 const RtpDataCodecs& rtp_data_codecs,
zhihuang1c378ed2017-08-17 21:10:50322 StreamParamsVec* current_streams,
Jonas Oreland1cd39fa2018-10-11 05:47:12323 SessionDescription* answer,
324 IceCredentialsIterator* ice_credentials) const;
zhihuang1c378ed2017-08-17 21:10:50325
326 void ComputeAudioCodecsIntersectionAndUnion();
jiayl@webrtc.orge7d47a12014-08-05 19:19:05327
Johannes Kron3e983682020-03-29 20:17:00328 void ComputeVideoCodecsIntersectionAndUnion();
329
Steve Anton8f66ddb2018-12-11 00:08:05330 bool is_unified_plan_ = false;
ossu075af922016-06-14 10:29:38331 AudioCodecs audio_send_codecs_;
332 AudioCodecs audio_recv_codecs_;
zhihuang1c378ed2017-08-17 21:10:50333 // Intersection of send and recv.
ossu075af922016-06-14 10:29:38334 AudioCodecs audio_sendrecv_codecs_;
zhihuang1c378ed2017-08-17 21:10:50335 // Union of send and recv.
336 AudioCodecs all_audio_codecs_;
henrike@webrtc.org28e20752013-07-10 00:45:36337 RtpHeaderExtensions audio_rtp_extensions_;
Johannes Kron3e983682020-03-29 20:17:00338 VideoCodecs video_send_codecs_;
339 VideoCodecs video_recv_codecs_;
340 // Intersection of send and recv.
341 VideoCodecs video_sendrecv_codecs_;
342 // Union of send and recv.
343 VideoCodecs all_video_codecs_;
henrike@webrtc.org28e20752013-07-10 00:45:36344 RtpHeaderExtensions video_rtp_extensions_;
Harald Alvestrand5fc28b12019-05-13 11:36:16345 RtpDataCodecs rtp_data_codecs_;
Amit Hilbuchbcd39d42019-01-26 01:13:56346 // This object is not owned by the channel so it must outlive it.
347 rtc::UniqueRandomIdGenerator* const ssrc_generator_;
jbauch5869f502017-06-29 19:31:36348 bool enable_encrypted_rtp_header_extensions_ = false;
zhihuang1c378ed2017-08-17 21:10:50349 // TODO(zhihuang): Rename secure_ to sdec_policy_; rename the related getter
350 // and setter.
351 SecurePolicy secure_ = SEC_DISABLED;
henrike@webrtc.org28e20752013-07-10 00:45:36352 const TransportDescriptionFactory* transport_desc_factory_;
353};
354
355// Convenience functions.
356bool IsMediaContent(const ContentInfo* content);
357bool IsAudioContent(const ContentInfo* content);
358bool IsVideoContent(const ContentInfo* content);
359bool IsDataContent(const ContentInfo* content);
deadbeef0ed85b22016-02-24 01:24:52360const ContentInfo* GetFirstMediaContent(const ContentInfos& contents,
361 MediaType media_type);
henrike@webrtc.org28e20752013-07-10 00:45:36362const ContentInfo* GetFirstAudioContent(const ContentInfos& contents);
363const ContentInfo* GetFirstVideoContent(const ContentInfos& contents);
364const ContentInfo* GetFirstDataContent(const ContentInfos& contents);
Steve Antonad7bffc2018-01-22 18:21:56365const ContentInfo* GetFirstMediaContent(const SessionDescription* sdesc,
366 MediaType media_type);
henrike@webrtc.org28e20752013-07-10 00:45:36367const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc);
368const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc);
369const ContentInfo* GetFirstDataContent(const SessionDescription* sdesc);
370const AudioContentDescription* GetFirstAudioContentDescription(
371 const SessionDescription* sdesc);
372const VideoContentDescription* GetFirstVideoContentDescription(
373 const SessionDescription* sdesc);
Harald Alvestrand5fc28b12019-05-13 11:36:16374const RtpDataContentDescription* GetFirstRtpDataContentDescription(
375 const SessionDescription* sdesc);
376const SctpDataContentDescription* GetFirstSctpDataContentDescription(
377 const SessionDescription* sdesc);
Taylor Brandstetterdc4eb8c2016-05-12 15:14:50378// Non-const versions of the above functions.
379// Useful when modifying an existing description.
Steve Anton36b29d12017-10-30 16:57:42380ContentInfo* GetFirstMediaContent(ContentInfos* contents, MediaType media_type);
381ContentInfo* GetFirstAudioContent(ContentInfos* contents);
382ContentInfo* GetFirstVideoContent(ContentInfos* contents);
383ContentInfo* GetFirstDataContent(ContentInfos* contents);
Steve Antonad7bffc2018-01-22 18:21:56384ContentInfo* GetFirstMediaContent(SessionDescription* sdesc,
385 MediaType media_type);
Taylor Brandstetterdc4eb8c2016-05-12 15:14:50386ContentInfo* GetFirstAudioContent(SessionDescription* sdesc);
387ContentInfo* GetFirstVideoContent(SessionDescription* sdesc);
388ContentInfo* GetFirstDataContent(SessionDescription* sdesc);
389AudioContentDescription* GetFirstAudioContentDescription(
390 SessionDescription* sdesc);
391VideoContentDescription* GetFirstVideoContentDescription(
392 SessionDescription* sdesc);
Harald Alvestrand5fc28b12019-05-13 11:36:16393RtpDataContentDescription* GetFirstRtpDataContentDescription(
394 SessionDescription* sdesc);
395SctpDataContentDescription* GetFirstSctpDataContentDescription(
396 SessionDescription* sdesc);
henrike@webrtc.org28e20752013-07-10 00:45:36397
deadbeef7914b8c2017-04-21 10:23:33398// Helper functions to return crypto suites used for SDES.
Benjamin Wrighta54daf12018-10-11 22:33:17399void GetSupportedAudioSdesCryptoSuites(
400 const webrtc::CryptoOptions& crypto_options,
401 std::vector<int>* crypto_suites);
402void GetSupportedVideoSdesCryptoSuites(
403 const webrtc::CryptoOptions& crypto_options,
404 std::vector<int>* crypto_suites);
405void GetSupportedDataSdesCryptoSuites(
406 const webrtc::CryptoOptions& crypto_options,
407 std::vector<int>* crypto_suites);
deadbeef7914b8c2017-04-21 10:23:33408void GetSupportedAudioSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 22:33:17409 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-19 03:41:53410 std::vector<std::string>* crypto_suite_names);
deadbeef7914b8c2017-04-21 10:23:33411void GetSupportedVideoSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 22:33:17412 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-19 03:41:53413 std::vector<std::string>* crypto_suite_names);
deadbeef7914b8c2017-04-21 10:23:33414void GetSupportedDataSdesCryptoSuiteNames(
Benjamin Wrighta54daf12018-10-11 22:33:17415 const webrtc::CryptoOptions& crypto_options,
Guo-wei Shieh521ed7b2015-11-19 03:41:53416 std::vector<std::string>* crypto_suite_names);
417
henrike@webrtc.org28e20752013-07-10 00:45:36418} // namespace cricket
419
Steve Anton10542f22019-01-11 17:11:00420#endif // PC_MEDIA_SESSION_H_