From afd8e8c3049955e91d102efa71cc9a109658a6b7 Mon Sep 17 00:00:00 2001 From: Steve Anton Date: Tue, 19 Dec 2017 16:35:35 -0800 Subject: [PATCH] Move MediaContentDescription into sessiondescription.h Bug: webrtc:8620 Change-Id: I9b0b6d8dc9bda366e925dda9a5b92fc4e3fd9f43 Reviewed-on: https://webrtc-review.googlesource.com/35003 Commit-Queue: Steve Anton Reviewed-by: Taylor Brandstetter Reviewed-by: Peter Thatcher Cr-Commit-Position: refs/heads/master@{#21378} --- pc/mediasession.h | 249 ---------------------------------------- pc/sessiondescription.h | 231 +++++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+), 249 deletions(-) diff --git a/pc/mediasession.h b/pc/mediasession.h index 7f4e9cf051..d3a9b3c1ec 100644 --- a/pc/mediasession.h +++ b/pc/mediasession.h @@ -18,14 +18,9 @@ #include #include -#include "api/cryptoparams.h" #include "api/mediatypes.h" -#include "api/rtptransceiverinterface.h" -#include "media/base/codec.h" -#include "media/base/mediachannel.h" #include "media/base/mediaconstants.h" #include "media/base/mediaengine.h" // For DataChannelType -#include "media/base/streamparams.h" #include "p2p/base/transportdescriptionfactory.h" #include "pc/jseptransport.h" #include "pc/sessiondescription.h" @@ -33,34 +28,6 @@ namespace cricket { class ChannelManager; -typedef std::vector AudioCodecs; -typedef std::vector VideoCodecs; -typedef std::vector DataCodecs; -typedef std::vector CryptoParamsVec; -typedef std::vector RtpHeaderExtensions; - -enum CryptoType { - CT_NONE, - CT_SDES, - CT_DTLS -}; - -// RTC4585 RTP/AVPF -extern const char kMediaProtocolAvpf[]; -// RFC5124 RTP/SAVPF -extern const char kMediaProtocolSavpf[]; - -extern const char kMediaProtocolDtlsSavpf[]; - -extern const char kMediaProtocolRtpPrefix[]; - -extern const char kMediaProtocolSctp[]; -extern const char kMediaProtocolDtlsSctp[]; -extern const char kMediaProtocolUdpDtlsSctp[]; -extern const char kMediaProtocolTcpDtlsSctp[]; - -// Options to control how session descriptions are generated. -const int kAutoBandwidth = -1; // Default RTCP CNAME for unit tests. const char kDefaultRtcpCname[] = "DefaultRtcpCname"; @@ -134,222 +101,6 @@ struct MediaSessionOptions { std::vector media_description_options; }; -// "content" (as used in XEP-0166) descriptions for voice and video. -class MediaContentDescription : public ContentDescription { - public: - MediaContentDescription() {} - - virtual MediaType type() const = 0; - virtual bool has_codecs() const = 0; - - // |protocol| is the expected media transport protocol, such as RTP/AVPF, - // RTP/SAVPF or SCTP/DTLS. - std::string protocol() const { return protocol_; } - void set_protocol(const std::string& protocol) { protocol_ = protocol; } - - webrtc::RtpTransceiverDirection direction() const { - return direction_; - } - void set_direction(webrtc::RtpTransceiverDirection direction) { - direction_ = direction; - } - - bool rtcp_mux() const { return rtcp_mux_; } - void set_rtcp_mux(bool mux) { rtcp_mux_ = mux; } - - bool rtcp_reduced_size() const { return rtcp_reduced_size_; } - void set_rtcp_reduced_size(bool reduced_size) { - rtcp_reduced_size_ = reduced_size; - } - - int bandwidth() const { return bandwidth_; } - void set_bandwidth(int bandwidth) { bandwidth_ = bandwidth; } - - const std::vector& cryptos() const { return cryptos_; } - void AddCrypto(const CryptoParams& params) { - cryptos_.push_back(params); - } - void set_cryptos(const std::vector& cryptos) { - cryptos_ = cryptos; - } - - const RtpHeaderExtensions& rtp_header_extensions() const { - return rtp_header_extensions_; - } - void set_rtp_header_extensions(const RtpHeaderExtensions& extensions) { - rtp_header_extensions_ = extensions; - rtp_header_extensions_set_ = true; - } - void AddRtpHeaderExtension(const webrtc::RtpExtension& ext) { - rtp_header_extensions_.push_back(ext); - rtp_header_extensions_set_ = true; - } - void AddRtpHeaderExtension(const cricket::RtpHeaderExtension& ext) { - webrtc::RtpExtension webrtc_extension; - webrtc_extension.uri = ext.uri; - webrtc_extension.id = ext.id; - rtp_header_extensions_.push_back(webrtc_extension); - rtp_header_extensions_set_ = true; - } - void ClearRtpHeaderExtensions() { - rtp_header_extensions_.clear(); - rtp_header_extensions_set_ = true; - } - // We can't always tell if an empty list of header extensions is - // because the other side doesn't support them, or just isn't hooked up to - // signal them. For now we assume an empty list means no signaling, but - // provide the ClearRtpHeaderExtensions method to allow "no support" to be - // clearly indicated (i.e. when derived from other information). - bool rtp_header_extensions_set() const { - return rtp_header_extensions_set_; - } - const StreamParamsVec& streams() const { - return streams_; - } - // TODO(pthatcher): Remove this by giving mediamessage.cc access - // to MediaContentDescription - StreamParamsVec& mutable_streams() { - return streams_; - } - void AddStream(const StreamParams& stream) { - streams_.push_back(stream); - } - // Legacy streams have an ssrc, but nothing else. - void AddLegacyStream(uint32_t ssrc) { - streams_.push_back(StreamParams::CreateLegacy(ssrc)); - } - void AddLegacyStream(uint32_t ssrc, uint32_t fid_ssrc) { - StreamParams sp = StreamParams::CreateLegacy(ssrc); - sp.AddFidSsrc(ssrc, fid_ssrc); - streams_.push_back(sp); - } - // Sets the CNAME of all StreamParams if it have not been set. - void SetCnameIfEmpty(const std::string& cname) { - for (cricket::StreamParamsVec::iterator it = streams_.begin(); - it != streams_.end(); ++it) { - if (it->cname.empty()) - it->cname = cname; - } - } - uint32_t first_ssrc() const { - if (streams_.empty()) { - return 0; - } - return streams_[0].first_ssrc(); - } - bool has_ssrcs() const { - if (streams_.empty()) { - return false; - } - return streams_[0].has_ssrcs(); - } - - void set_conference_mode(bool enable) { conference_mode_ = enable; } - bool conference_mode() const { return conference_mode_; } - - // https://tools.ietf.org/html/rfc4566#section-5.7 - // May be present at the media or session level of SDP. If present at both - // levels, the media-level attribute overwrites the session-level one. - void set_connection_address(const rtc::SocketAddress& address) { - connection_address_ = address; - } - const rtc::SocketAddress& connection_address() const { - return connection_address_; - } - - protected: - bool rtcp_mux_ = false; - bool rtcp_reduced_size_ = false; - int bandwidth_ = kAutoBandwidth; - std::string protocol_; - std::vector cryptos_; - std::vector rtp_header_extensions_; - bool rtp_header_extensions_set_ = false; - StreamParamsVec streams_; - bool conference_mode_ = false; - webrtc::RtpTransceiverDirection direction_ = - webrtc::RtpTransceiverDirection::kSendRecv; - rtc::SocketAddress connection_address_; -}; - -template -class MediaContentDescriptionImpl : public MediaContentDescription { - public: - typedef C CodecType; - - // Codecs should be in preference order (most preferred codec first). - const std::vector& codecs() const { return codecs_; } - void set_codecs(const std::vector& codecs) { codecs_ = codecs; } - virtual bool has_codecs() const { return !codecs_.empty(); } - bool HasCodec(int id) { - bool found = false; - for (typename std::vector::iterator iter = codecs_.begin(); - iter != codecs_.end(); ++iter) { - if (iter->id == id) { - found = true; - break; - } - } - return found; - } - void AddCodec(const C& codec) { - codecs_.push_back(codec); - } - void AddOrReplaceCodec(const C& codec) { - for (typename std::vector::iterator iter = codecs_.begin(); - iter != codecs_.end(); ++iter) { - if (iter->id == codec.id) { - *iter = codec; - return; - } - } - AddCodec(codec); - } - void AddCodecs(const std::vector& codecs) { - typename std::vector::const_iterator codec; - for (codec = codecs.begin(); codec != codecs.end(); ++codec) { - AddCodec(*codec); - } - } - - private: - std::vector codecs_; -}; - -class AudioContentDescription : public MediaContentDescriptionImpl { - public: - AudioContentDescription() {} - - virtual ContentDescription* Copy() const { - return new AudioContentDescription(*this); - } - virtual MediaType type() const { return MEDIA_TYPE_AUDIO; } -}; - -class VideoContentDescription : public MediaContentDescriptionImpl { - public: - virtual ContentDescription* Copy() const { - return new VideoContentDescription(*this); - } - virtual MediaType type() const { return MEDIA_TYPE_VIDEO; } -}; - -class DataContentDescription : public MediaContentDescriptionImpl { - public: - DataContentDescription() {} - - virtual ContentDescription* Copy() const { - return new DataContentDescription(*this); - } - virtual MediaType type() const { return MEDIA_TYPE_DATA; } - - bool use_sctpmap() const { return use_sctpmap_; } - void set_use_sctpmap(bool enable) { use_sctpmap_ = enable; } - - private: - bool use_sctpmap_ = true; -}; - // Creates media session descriptions according to the supplied codecs and // other fields, as well as the supplied per-call options. // When creating answers, performs the appropriate negotiation diff --git a/pc/sessiondescription.h b/pc/sessiondescription.h index c959f2a362..648b27dc1c 100644 --- a/pc/sessiondescription.h +++ b/pc/sessiondescription.h @@ -14,11 +14,40 @@ #include #include +#include "api/cryptoparams.h" +#include "api/rtpparameters.h" +#include "api/rtptransceiverinterface.h" +#include "media/base/codec.h" +#include "media/base/mediachannel.h" +#include "media/base/streamparams.h" #include "p2p/base/transportinfo.h" #include "rtc_base/constructormagic.h" namespace cricket { +typedef std::vector AudioCodecs; +typedef std::vector VideoCodecs; +typedef std::vector DataCodecs; +typedef std::vector CryptoParamsVec; +typedef std::vector RtpHeaderExtensions; + +// RTC4585 RTP/AVPF +extern const char kMediaProtocolAvpf[]; +// RFC5124 RTP/SAVPF +extern const char kMediaProtocolSavpf[]; + +extern const char kMediaProtocolDtlsSavpf[]; + +extern const char kMediaProtocolRtpPrefix[]; + +extern const char kMediaProtocolSctp[]; +extern const char kMediaProtocolDtlsSctp[]; +extern const char kMediaProtocolUdpDtlsSctp[]; +extern const char kMediaProtocolTcpDtlsSctp[]; + +// Options to control how session descriptions are generated. +const int kAutoBandwidth = -1; + // Describes a session content. Individual content types inherit from // this class. Analagous to a or // . @@ -28,6 +57,208 @@ class ContentDescription { virtual ContentDescription* Copy() const = 0; }; +// "content" (as used in XEP-0166) descriptions for voice and video. +class MediaContentDescription : public ContentDescription { + public: + MediaContentDescription() {} + + virtual MediaType type() const = 0; + virtual bool has_codecs() const = 0; + + // |protocol| is the expected media transport protocol, such as RTP/AVPF, + // RTP/SAVPF or SCTP/DTLS. + std::string protocol() const { return protocol_; } + void set_protocol(const std::string& protocol) { protocol_ = protocol; } + + webrtc::RtpTransceiverDirection direction() const { return direction_; } + void set_direction(webrtc::RtpTransceiverDirection direction) { + direction_ = direction; + } + + bool rtcp_mux() const { return rtcp_mux_; } + void set_rtcp_mux(bool mux) { rtcp_mux_ = mux; } + + bool rtcp_reduced_size() const { return rtcp_reduced_size_; } + void set_rtcp_reduced_size(bool reduced_size) { + rtcp_reduced_size_ = reduced_size; + } + + int bandwidth() const { return bandwidth_; } + void set_bandwidth(int bandwidth) { bandwidth_ = bandwidth; } + + const std::vector& cryptos() const { return cryptos_; } + void AddCrypto(const CryptoParams& params) { cryptos_.push_back(params); } + void set_cryptos(const std::vector& cryptos) { + cryptos_ = cryptos; + } + + const RtpHeaderExtensions& rtp_header_extensions() const { + return rtp_header_extensions_; + } + void set_rtp_header_extensions(const RtpHeaderExtensions& extensions) { + rtp_header_extensions_ = extensions; + rtp_header_extensions_set_ = true; + } + void AddRtpHeaderExtension(const webrtc::RtpExtension& ext) { + rtp_header_extensions_.push_back(ext); + rtp_header_extensions_set_ = true; + } + void AddRtpHeaderExtension(const cricket::RtpHeaderExtension& ext) { + webrtc::RtpExtension webrtc_extension; + webrtc_extension.uri = ext.uri; + webrtc_extension.id = ext.id; + rtp_header_extensions_.push_back(webrtc_extension); + rtp_header_extensions_set_ = true; + } + void ClearRtpHeaderExtensions() { + rtp_header_extensions_.clear(); + rtp_header_extensions_set_ = true; + } + // We can't always tell if an empty list of header extensions is + // because the other side doesn't support them, or just isn't hooked up to + // signal them. For now we assume an empty list means no signaling, but + // provide the ClearRtpHeaderExtensions method to allow "no support" to be + // clearly indicated (i.e. when derived from other information). + bool rtp_header_extensions_set() const { return rtp_header_extensions_set_; } + const StreamParamsVec& streams() const { return streams_; } + // TODO(pthatcher): Remove this by giving mediamessage.cc access + // to MediaContentDescription + StreamParamsVec& mutable_streams() { return streams_; } + void AddStream(const StreamParams& stream) { streams_.push_back(stream); } + // Legacy streams have an ssrc, but nothing else. + void AddLegacyStream(uint32_t ssrc) { + streams_.push_back(StreamParams::CreateLegacy(ssrc)); + } + void AddLegacyStream(uint32_t ssrc, uint32_t fid_ssrc) { + StreamParams sp = StreamParams::CreateLegacy(ssrc); + sp.AddFidSsrc(ssrc, fid_ssrc); + streams_.push_back(sp); + } + // Sets the CNAME of all StreamParams if it have not been set. + void SetCnameIfEmpty(const std::string& cname) { + for (cricket::StreamParamsVec::iterator it = streams_.begin(); + it != streams_.end(); ++it) { + if (it->cname.empty()) + it->cname = cname; + } + } + uint32_t first_ssrc() const { + if (streams_.empty()) { + return 0; + } + return streams_[0].first_ssrc(); + } + bool has_ssrcs() const { + if (streams_.empty()) { + return false; + } + return streams_[0].has_ssrcs(); + } + + void set_conference_mode(bool enable) { conference_mode_ = enable; } + bool conference_mode() const { return conference_mode_; } + + // https://tools.ietf.org/html/rfc4566#section-5.7 + // May be present at the media or session level of SDP. If present at both + // levels, the media-level attribute overwrites the session-level one. + void set_connection_address(const rtc::SocketAddress& address) { + connection_address_ = address; + } + const rtc::SocketAddress& connection_address() const { + return connection_address_; + } + + protected: + bool rtcp_mux_ = false; + bool rtcp_reduced_size_ = false; + int bandwidth_ = kAutoBandwidth; + std::string protocol_; + std::vector cryptos_; + std::vector rtp_header_extensions_; + bool rtp_header_extensions_set_ = false; + StreamParamsVec streams_; + bool conference_mode_ = false; + webrtc::RtpTransceiverDirection direction_ = + webrtc::RtpTransceiverDirection::kSendRecv; + rtc::SocketAddress connection_address_; +}; + +template +class MediaContentDescriptionImpl : public MediaContentDescription { + public: + typedef C CodecType; + + // Codecs should be in preference order (most preferred codec first). + const std::vector& codecs() const { return codecs_; } + void set_codecs(const std::vector& codecs) { codecs_ = codecs; } + virtual bool has_codecs() const { return !codecs_.empty(); } + bool HasCodec(int id) { + bool found = false; + for (typename std::vector::iterator iter = codecs_.begin(); + iter != codecs_.end(); ++iter) { + if (iter->id == id) { + found = true; + break; + } + } + return found; + } + void AddCodec(const C& codec) { codecs_.push_back(codec); } + void AddOrReplaceCodec(const C& codec) { + for (typename std::vector::iterator iter = codecs_.begin(); + iter != codecs_.end(); ++iter) { + if (iter->id == codec.id) { + *iter = codec; + return; + } + } + AddCodec(codec); + } + void AddCodecs(const std::vector& codecs) { + typename std::vector::const_iterator codec; + for (codec = codecs.begin(); codec != codecs.end(); ++codec) { + AddCodec(*codec); + } + } + + private: + std::vector codecs_; +}; + +class AudioContentDescription : public MediaContentDescriptionImpl { + public: + AudioContentDescription() {} + + virtual ContentDescription* Copy() const { + return new AudioContentDescription(*this); + } + virtual MediaType type() const { return MEDIA_TYPE_AUDIO; } +}; + +class VideoContentDescription : public MediaContentDescriptionImpl { + public: + virtual ContentDescription* Copy() const { + return new VideoContentDescription(*this); + } + virtual MediaType type() const { return MEDIA_TYPE_VIDEO; } +}; + +class DataContentDescription : public MediaContentDescriptionImpl { + public: + DataContentDescription() {} + + virtual ContentDescription* Copy() const { + return new DataContentDescription(*this); + } + virtual MediaType type() const { return MEDIA_TYPE_DATA; } + + bool use_sctpmap() const { return use_sctpmap_; } + void set_use_sctpmap(bool enable) { use_sctpmap_ = enable; } + + private: + bool use_sctpmap_ = true; +}; + // Analagous to a or . // name = name of // type = xmlns of