Slight restriction of access to ContentInfo and prefer mid to name.

As a first step, use .mid() instead of .name in JsepTransportController

Bug: webrtc:42233761
Change-Id: I23ab97609175f8dbfdf59ee41c4db42f21a9e9ad
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/374660
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43756}
This commit is contained in:
Tommi 2025-01-17 12:31:07 +01:00 committed by WebRTC LUCI CQ
parent 88833e6d22
commit 762753d0a2
4 changed files with 69 additions and 75 deletions

View File

@ -53,19 +53,24 @@ TEST_F(PeerConnectionCongestionControlTest, ReceiveOfferSetsCcfbFlag) {
caller()->CreateAndSetAndSignalOffer();
ASSERT_THAT(WaitUntil([&] { return SignalingStateStable(); }, IsTrue()),
IsRtcOk());
// Check that the callee parsed it.
auto parsed_contents =
callee()->pc()->remote_description()->description()->contents();
EXPECT_FALSE(parsed_contents.empty());
for (const auto& content : parsed_contents) {
EXPECT_TRUE(content.media_description()->rtcp_fb_ack_ccfb());
{
// Check that the callee parsed it.
auto parsed_contents =
callee()->pc()->remote_description()->description()->contents();
EXPECT_FALSE(parsed_contents.empty());
for (const auto& content : parsed_contents) {
EXPECT_TRUE(content.media_description()->rtcp_fb_ack_ccfb());
}
}
// Check that the caller also parsed it.
parsed_contents =
caller()->pc()->remote_description()->description()->contents();
EXPECT_FALSE(parsed_contents.empty());
for (const auto& content : parsed_contents) {
EXPECT_TRUE(content.media_description()->rtcp_fb_ack_ccfb());
{
// Check that the caller also parsed it.
auto parsed_contents =
caller()->pc()->remote_description()->description()->contents();
EXPECT_FALSE(parsed_contents.empty());
for (const auto& content : parsed_contents) {
EXPECT_TRUE(content.media_description()->rtcp_fb_ack_ccfb());
}
}
// Check that the answer does not contain transport-cc
std::string answer_str = absl::StrCat(*caller()->pc()->remote_description());

View File

@ -687,7 +687,7 @@ RTCError JsepTransportController::ApplyDescription_n(
for (const cricket::ContentInfo& content_info : description->contents()) {
// Don't create transports for rejected m-lines and bundled m-lines.
if (content_info.rejected ||
!bundles_.IsFirstMidInGroup(content_info.name)) {
!bundles_.IsFirstMidInGroup(content_info.mid())) {
continue;
}
error = MaybeCreateJsepTransport(local, content_info, *description);
@ -710,17 +710,17 @@ RTCError JsepTransportController::ApplyDescription_n(
}
const cricket::ContentGroup* established_bundle_group =
bundles_.LookupGroupByMid(content_info.name);
bundles_.LookupGroupByMid(content_info.mid());
// For bundle members that are not BUNDLE-tagged (not first in the group),
// configure their transport to be the same as the BUNDLE-tagged transport.
if (established_bundle_group &&
content_info.name != *established_bundle_group->FirstContentName()) {
content_info.mid() != *established_bundle_group->FirstContentName()) {
if (!HandleBundledContent(content_info, *established_bundle_group)) {
return RTCError(RTCErrorType::INVALID_PARAMETER,
"Failed to process the bundled m= section with "
"mid='" +
content_info.name + "'.");
content_info.mid() + "'.");
}
continue;
}
@ -733,7 +733,7 @@ RTCError JsepTransportController::ApplyDescription_n(
std::vector<int> extension_ids;
// Is BUNDLE-tagged (first in the group)?
if (established_bundle_group &&
content_info.name == *established_bundle_group->FirstContentName()) {
content_info.mid() == *established_bundle_group->FirstContentName()) {
auto it = merged_encrypted_extension_ids_by_bundle.find(
established_bundle_group);
RTC_DCHECK(it != merged_encrypted_extension_ids_by_bundle.end());
@ -746,12 +746,12 @@ RTCError JsepTransportController::ApplyDescription_n(
GetRtpAbsSendTimeHeaderExtensionId(content_info);
cricket::JsepTransport* transport =
GetJsepTransportForMid(content_info.name);
GetJsepTransportForMid(content_info.mid());
if (!transport) {
LOG_AND_RETURN_ERROR(
RTCErrorType::INVALID_PARAMETER,
"Could not find transport for m= section with mid='" +
content_info.name + "'");
content_info.mid() + "'");
}
SetIceRole_n(DetermineIceRole(transport, transport_info, type, local));
@ -771,7 +771,7 @@ RTCError JsepTransportController::ApplyDescription_n(
LOG_AND_RETURN_ERROR(
RTCErrorType::INVALID_PARAMETER,
"Failed to apply the description for m= section with mid='" +
content_info.name + "': " + error.message());
content_info.mid() + "': " + error.message());
}
error = transport->RecordPayloadTypes(local, type, content_info);
if (!error.ok()) {
@ -981,7 +981,7 @@ RTCError JsepTransportController::ValidateContent(
!content_info.bundle_only &&
!content_info.media_description()->rtcp_mux()) {
return RTCError(RTCErrorType::INVALID_PARAMETER,
"The m= section with mid='" + content_info.name +
"The m= section with mid='" + content_info.mid() +
"' is invalid. RTCP-MUX is not "
"enabled when it is required.");
}
@ -994,9 +994,9 @@ void JsepTransportController::HandleRejectedContent(
// BaseChannel/SctpTransport change the RtpTransport/DtlsTransport first,
// then destroy the cricket::JsepTransport.
cricket::ContentGroup* bundle_group =
bundles_.LookupGroupByMid(content_info.name);
bundles_.LookupGroupByMid(content_info.mid());
if (bundle_group && !bundle_group->content_names().empty() &&
content_info.name == *bundle_group->FirstContentName()) {
content_info.mid() == *bundle_group->FirstContentName()) {
// Rejecting a BUNDLE group's first mid means we are rejecting the entire
// group.
for (const auto& content_name : bundle_group->content_names()) {
@ -1005,10 +1005,10 @@ void JsepTransportController::HandleRejectedContent(
// Delete the BUNDLE group.
bundles_.DeleteGroup(bundle_group);
} else {
transports_.RemoveTransportForMid(content_info.name);
transports_.RemoveTransportForMid(content_info.mid());
if (bundle_group) {
// Remove the rejected content from the `bundle_group`.
bundles_.DeleteMid(bundle_group, content_info.name);
bundles_.DeleteMid(bundle_group, content_info.mid());
}
}
}
@ -1028,7 +1028,7 @@ bool JsepTransportController::HandleBundledContent(
// because it means that we first create media transport and start
// connecting it, and then we destroy it. We will need to address it before
// video path is enabled.
return transports_.SetTransportForMid(content_info.name, jsep_transport);
return transports_.SetTransportForMid(content_info.mid(), jsep_transport);
}
cricket::JsepTransportDescription
@ -1081,7 +1081,7 @@ JsepTransportController::MergeEncryptedHeaderExtensionIdsForBundles(
merged_encrypted_extension_ids_by_bundle;
// Union the encrypted header IDs in the group when bundle is enabled.
for (const cricket::ContentInfo& content_info : description->contents()) {
auto group = bundles_.LookupGroupByMid(content_info.name);
auto group = bundles_.LookupGroupByMid(content_info.mid());
if (!group)
continue;
// Get or create list of IDs for the BUNDLE group.
@ -1150,13 +1150,14 @@ RTCError JsepTransportController::MaybeCreateJsepTransport(
bool local,
const cricket::ContentInfo& content_info,
const cricket::SessionDescription& description) {
cricket::JsepTransport* transport = GetJsepTransportByName(content_info.name);
cricket::JsepTransport* transport =
GetJsepTransportByName(content_info.mid());
if (transport) {
return RTCError::OK();
}
rtc::scoped_refptr<IceTransportInterface> ice =
CreateIceTransport(content_info.name, /*rtcp=*/false);
CreateIceTransport(content_info.mid(), /*rtcp=*/false);
std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport =
CreateDtlsTransport(content_info, ice->internal());
@ -1170,7 +1171,7 @@ RTCError JsepTransportController::MaybeCreateJsepTransport(
if (config_.rtcp_mux_policy !=
PeerConnectionInterface::kRtcpMuxPolicyRequire &&
content_info.type == cricket::MediaProtocolType::kRtp) {
rtcp_ice = CreateIceTransport(content_info.name, /*rtcp=*/true);
rtcp_ice = CreateIceTransport(content_info.mid(), /*rtcp=*/true);
rtcp_dtls_transport =
CreateDtlsTransport(content_info, rtcp_ice->internal());
}
@ -1179,11 +1180,13 @@ RTCError JsepTransportController::MaybeCreateJsepTransport(
RTC_LOG(LS_INFO)
<< "Creating UnencryptedRtpTransport, becayse encryption is disabled.";
unencrypted_rtp_transport = CreateUnencryptedRtpTransport(
content_info.name, rtp_dtls_transport.get(), rtcp_dtls_transport.get());
content_info.mid(), rtp_dtls_transport.get(),
rtcp_dtls_transport.get());
} else {
RTC_LOG(LS_INFO) << "Creating DtlsSrtpTransport.";
dtls_srtp_transport = CreateDtlsSrtpTransport(
content_info.name, rtp_dtls_transport.get(), rtcp_dtls_transport.get());
dtls_srtp_transport =
CreateDtlsSrtpTransport(content_info.mid(), rtp_dtls_transport.get(),
rtcp_dtls_transport.get());
}
std::unique_ptr<cricket::SctpTransportInternal> sctp_transport;
@ -1194,7 +1197,7 @@ RTCError JsepTransportController::MaybeCreateJsepTransport(
std::unique_ptr<cricket::JsepTransport> jsep_transport =
std::make_unique<cricket::JsepTransport>(
content_info.name, certificate_, std::move(ice), std::move(rtcp_ice),
content_info.mid(), certificate_, std::move(ice), std::move(rtcp_ice),
std::move(unencrypted_rtp_transport), std::move(sdes_transport),
std::move(dtls_srtp_transport), std::move(rtp_dtls_transport),
std::move(rtcp_dtls_transport), std::move(sctp_transport),
@ -1215,7 +1218,7 @@ RTCError JsepTransportController::MaybeCreateJsepTransport(
OnUnDemuxableRtpPacketReceived_n(packet);
});
transports_.RegisterTransport(content_info.name, std::move(jsep_transport));
transports_.RegisterTransport(content_info.mid(), std::move(jsep_transport));
UpdateAggregateStates_n();
return RTCError::OK();
}

View File

@ -19,23 +19,21 @@ namespace cricket {
namespace {
ContentInfo* FindContentInfoByName(ContentInfos* contents,
const std::string& name) {
absl::string_view name) {
RTC_DCHECK(contents);
for (ContentInfo& content : *contents) {
if (content.name == name) {
if (content.mid() == name) {
return &content;
}
}
return nullptr;
}
} // namespace
const ContentInfo* FindContentInfoByName(const ContentInfos& contents,
const std::string& name) {
absl::string_view name) {
for (ContentInfos::const_iterator content = contents.begin();
content != contents.end(); ++content) {
if (content->name == name) {
if (content->mid() == name) {
return &(*content);
}
}
@ -52,6 +50,8 @@ const ContentInfo* FindContentInfoByType(const ContentInfos& contents,
return nullptr;
}
} // namespace
ContentGroup::ContentGroup(const std::string& semantics)
: semantics_(semantics) {}
@ -117,7 +117,7 @@ ContentInfo* SessionDescription::GetContentByName(const std::string& name) {
}
const MediaContentDescription* SessionDescription::GetContentDescriptionByName(
const std::string& name) const {
absl::string_view name) const {
const ContentInfo* cinfo = FindContentInfoByName(contents_, name);
if (cinfo == NULL) {
return NULL;
@ -127,7 +127,7 @@ const MediaContentDescription* SessionDescription::GetContentDescriptionByName(
}
MediaContentDescription* SessionDescription::GetContentDescriptionByName(
const std::string& name) {
absl::string_view name) {
ContentInfo* cinfo = FindContentInfoByName(&contents_, name);
if (cinfo == NULL) {
return NULL;
@ -149,9 +149,8 @@ void SessionDescription::AddContent(
const std::string& name,
MediaProtocolType type,
std::unique_ptr<MediaContentDescription> description) {
ContentInfo content(type);
ContentInfo content(type, std::move(description));
content.name = name;
content.set_media_description(std::move(description));
AddContent(std::move(content));
}
@ -160,10 +159,9 @@ void SessionDescription::AddContent(
MediaProtocolType type,
bool rejected,
std::unique_ptr<MediaContentDescription> description) {
ContentInfo content(type);
ContentInfo content(type, std::move(description));
content.name = name;
content.rejected = rejected;
content.set_media_description(std::move(description));
AddContent(std::move(content));
}
@ -173,11 +171,10 @@ void SessionDescription::AddContent(
bool rejected,
bool bundle_only,
std::unique_ptr<MediaContentDescription> description) {
ContentInfo content(type);
ContentInfo content(type, std::move(description));
content.name = name;
content.rejected = rejected;
content.bundle_only = bundle_only;
content.set_media_description(std::move(description));
AddContent(std::move(content));
}
@ -193,7 +190,7 @@ void SessionDescription::AddContent(ContentInfo&& content) {
bool SessionDescription::RemoveContentByName(const std::string& name) {
for (ContentInfos::iterator content = contents_.begin();
content != contents_.end(); ++content) {
if (content->name == name) {
if (content->mid() == name) {
contents_.erase(content);
return true;
}
@ -291,15 +288,6 @@ ContentInfo::ContentInfo(const ContentInfo& o)
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();
}

View File

@ -399,26 +399,29 @@ enum class MediaProtocolType {
class RTC_EXPORT ContentInfo {
public:
explicit ContentInfo(MediaProtocolType type) : type(type) {}
ContentInfo(MediaProtocolType type,
std::unique_ptr<MediaContentDescription> description)
: type(type), description_(std::move(description)) {}
~ContentInfo();
// Copy
// Copy ctor and assignment will clone `description_`.
ContentInfo(const ContentInfo& o);
ContentInfo& operator=(const ContentInfo& o);
// Const ref assignment operator removed. Instead, use the explicit ctor.
ContentInfo& operator=(const ContentInfo& o) = delete;
ContentInfo(ContentInfo&& o) = default;
ContentInfo& operator=(ContentInfo&& o) = default;
// Alias for `name`.
std::string mid() const { return name; }
void set_mid(const std::string& mid) { this->name = mid; }
// TODO(tommi): change return type to string_view.
const std::string& mid() const { return name; }
void set_mid(absl::string_view mid) { name = std::string(mid); }
// Alias for `description`.
MediaContentDescription* media_description();
const MediaContentDescription* media_description() const;
void set_media_description(std::unique_ptr<MediaContentDescription> desc) {
description_ = std::move(desc);
}
// TODO(bugs.webrtc.org/8620): Rename this to mid.
// TODO(bugs.webrtc.org/8620): Rename this to mid and make private.
std::string name;
MediaProtocolType type;
bool rejected = false;
@ -462,11 +465,6 @@ class ContentGroup {
typedef std::vector<ContentInfo> ContentInfos;
typedef std::vector<ContentGroup> ContentGroups;
const ContentInfo* FindContentInfoByName(const ContentInfos& contents,
const std::string& name);
const ContentInfo* FindContentInfoByType(const ContentInfos& contents,
const std::string& type);
// Determines how the MSID will be signaled in the SDP.
// These can be used as bit flags to indicate both or the special value none.
enum MsidSignaling {
@ -502,8 +500,8 @@ class SessionDescription {
const ContentInfo* GetContentByName(const std::string& name) const;
ContentInfo* GetContentByName(const std::string& name);
const MediaContentDescription* GetContentDescriptionByName(
const std::string& name) const;
MediaContentDescription* GetContentDescriptionByName(const std::string& name);
absl::string_view name) const;
MediaContentDescription* GetContentDescriptionByName(absl::string_view name);
const ContentInfo* FirstContentByType(MediaProtocolType type) const;
const ContentInfo* FirstContent() const;