diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /third_party/libwebrtc/pc/session_description.cc | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/pc/session_description.cc')
-rw-r--r-- | third_party/libwebrtc/pc/session_description.cc | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/third_party/libwebrtc/pc/session_description.cc b/third_party/libwebrtc/pc/session_description.cc new file mode 100644 index 0000000000..0346f8c149 --- /dev/null +++ b/third_party/libwebrtc/pc/session_description.cc @@ -0,0 +1,312 @@ +/* + * Copyright 2010 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "pc/session_description.h" + +#include "absl/algorithm/container.h" +#include "absl/memory/memory.h" +#include "rtc_base/checks.h" +#include "rtc_base/strings/string_builder.h" + +namespace cricket { +namespace { + +ContentInfo* FindContentInfoByName(ContentInfos* contents, + const std::string& name) { + RTC_DCHECK(contents); + for (ContentInfo& content : *contents) { + if (content.name == name) { + return &content; + } + } + return nullptr; +} + +} // namespace + +const ContentInfo* FindContentInfoByName(const ContentInfos& contents, + const std::string& name) { + for (ContentInfos::const_iterator content = contents.begin(); + content != contents.end(); ++content) { + if (content->name == name) { + return &(*content); + } + } + return NULL; +} + +const ContentInfo* FindContentInfoByType(const ContentInfos& contents, + MediaProtocolType type) { + for (const auto& content : contents) { + if (content.type == type) { + return &content; + } + } + return nullptr; +} + +ContentGroup::ContentGroup(const std::string& semantics) + : semantics_(semantics) {} + +ContentGroup::ContentGroup(const ContentGroup&) = default; +ContentGroup::ContentGroup(ContentGroup&&) = default; +ContentGroup& ContentGroup::operator=(const ContentGroup&) = default; +ContentGroup& ContentGroup::operator=(ContentGroup&&) = default; +ContentGroup::~ContentGroup() = default; + +const std::string* ContentGroup::FirstContentName() const { + return (!content_names_.empty()) ? &(*content_names_.begin()) : NULL; +} + +bool ContentGroup::HasContentName(absl::string_view content_name) const { + return absl::c_linear_search(content_names_, content_name); +} + +void ContentGroup::AddContentName(absl::string_view content_name) { + if (!HasContentName(content_name)) { + content_names_.emplace_back(content_name); + } +} + +bool ContentGroup::RemoveContentName(absl::string_view content_name) { + ContentNames::iterator iter = absl::c_find(content_names_, content_name); + if (iter == content_names_.end()) { + return false; + } + content_names_.erase(iter); + return true; +} + +std::string ContentGroup::ToString() const { + rtc::StringBuilder acc; + acc << semantics_ << "("; + if (!content_names_.empty()) { + for (const auto& name : content_names_) { + acc << name << " "; + } + } + acc << ")"; + return acc.Release(); +} + +SessionDescription::SessionDescription() = default; +SessionDescription::SessionDescription(const SessionDescription&) = default; + +SessionDescription::~SessionDescription() {} + +std::unique_ptr<SessionDescription> SessionDescription::Clone() const { + // Copy using the private copy constructor. + // This will clone the descriptions using ContentInfo's copy constructor. + return absl::WrapUnique(new SessionDescription(*this)); +} + +const ContentInfo* SessionDescription::GetContentByName( + const std::string& name) const { + return FindContentInfoByName(contents_, name); +} + +ContentInfo* SessionDescription::GetContentByName(const std::string& name) { + return FindContentInfoByName(&contents_, name); +} + +const MediaContentDescription* SessionDescription::GetContentDescriptionByName( + const std::string& name) const { + const ContentInfo* cinfo = FindContentInfoByName(contents_, name); + if (cinfo == NULL) { + return NULL; + } + + return cinfo->media_description(); +} + +MediaContentDescription* SessionDescription::GetContentDescriptionByName( + const std::string& name) { + ContentInfo* cinfo = FindContentInfoByName(&contents_, name); + if (cinfo == NULL) { + return NULL; + } + + return cinfo->media_description(); +} + +const ContentInfo* SessionDescription::FirstContentByType( + MediaProtocolType type) const { + return FindContentInfoByType(contents_, type); +} + +const ContentInfo* SessionDescription::FirstContent() const { + return (contents_.empty()) ? NULL : &(*contents_.begin()); +} + +void SessionDescription::AddContent( + const std::string& name, + MediaProtocolType type, + std::unique_ptr<MediaContentDescription> description) { + ContentInfo content(type); + content.name = name; + content.set_media_description(std::move(description)); + AddContent(std::move(content)); +} + +void SessionDescription::AddContent( + const std::string& name, + MediaProtocolType type, + bool rejected, + std::unique_ptr<MediaContentDescription> description) { + ContentInfo content(type); + content.name = name; + content.rejected = rejected; + content.set_media_description(std::move(description)); + AddContent(std::move(content)); +} + +void SessionDescription::AddContent( + const std::string& name, + MediaProtocolType type, + bool rejected, + bool bundle_only, + std::unique_ptr<MediaContentDescription> description) { + ContentInfo content(type); + content.name = name; + content.rejected = rejected; + content.bundle_only = bundle_only; + content.set_media_description(std::move(description)); + AddContent(std::move(content)); +} + +void SessionDescription::AddContent(ContentInfo&& content) { + if (extmap_allow_mixed()) { + // Mixed support on session level overrides setting on media level. + content.media_description()->set_extmap_allow_mixed_enum( + MediaContentDescription::kSession); + } + contents_.push_back(std::move(content)); +} + +bool SessionDescription::RemoveContentByName(const std::string& name) { + for (ContentInfos::iterator content = contents_.begin(); + content != contents_.end(); ++content) { + if (content->name == name) { + contents_.erase(content); + return true; + } + } + + return false; +} + +void SessionDescription::AddTransportInfo(const TransportInfo& transport_info) { + transport_infos_.push_back(transport_info); +} + +bool SessionDescription::RemoveTransportInfoByName(const std::string& name) { + for (TransportInfos::iterator transport_info = transport_infos_.begin(); + transport_info != transport_infos_.end(); ++transport_info) { + if (transport_info->content_name == name) { + transport_infos_.erase(transport_info); + return true; + } + } + return false; +} + +const TransportInfo* SessionDescription::GetTransportInfoByName( + const std::string& name) const { + for (TransportInfos::const_iterator iter = transport_infos_.begin(); + iter != transport_infos_.end(); ++iter) { + if (iter->content_name == name) { + return &(*iter); + } + } + return NULL; +} + +TransportInfo* SessionDescription::GetTransportInfoByName( + const std::string& name) { + for (TransportInfos::iterator iter = transport_infos_.begin(); + iter != transport_infos_.end(); ++iter) { + if (iter->content_name == name) { + return &(*iter); + } + } + return NULL; +} + +void SessionDescription::RemoveGroupByName(const std::string& name) { + for (ContentGroups::iterator iter = content_groups_.begin(); + iter != content_groups_.end(); ++iter) { + if (iter->semantics() == name) { + content_groups_.erase(iter); + break; + } + } +} + +bool SessionDescription::HasGroup(const std::string& name) const { + for (ContentGroups::const_iterator iter = content_groups_.begin(); + iter != content_groups_.end(); ++iter) { + if (iter->semantics() == name) { + return true; + } + } + return false; +} + +const ContentGroup* SessionDescription::GetGroupByName( + const std::string& name) const { + for (ContentGroups::const_iterator iter = content_groups_.begin(); + iter != content_groups_.end(); ++iter) { + if (iter->semantics() == name) { + return &(*iter); + } + } + return NULL; +} + +std::vector<const ContentGroup*> SessionDescription::GetGroupsByName( + const std::string& name) const { + std::vector<const ContentGroup*> content_groups; + for (const ContentGroup& content_group : content_groups_) { + if (content_group.semantics() == name) { + content_groups.push_back(&content_group); + } + } + return content_groups; +} + +ContentInfo::~ContentInfo() { +} + +// Copy operator. +ContentInfo::ContentInfo(const ContentInfo& o) + : name(o.name), + type(o.type), + rejected(o.rejected), + bundle_only(o.bundle_only), + description_(o.description_->Clone()) {} + +ContentInfo& ContentInfo::operator=(const ContentInfo& o) { + name = o.name; + type = o.type; + rejected = o.rejected; + bundle_only = o.bundle_only; + description_ = o.description_->Clone(); + return *this; +} + +const MediaContentDescription* ContentInfo::media_description() const { + return description_.get(); +} + +MediaContentDescription* ContentInfo::media_description() { + return description_.get(); +} + +} // namespace cricket |