Add unit test for "locking in" PTs offered by remote in subsequent O/A

C++ version of
  https://jsfiddle.net/fippo/ypj6mshr/3/

BUG=webrtc:360058654

Change-Id: Ieb6a149601093cafae337213d3e2b3b0bfc77831
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/377322
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Philipp Hancke <phancke@meta.com>
Cr-Commit-Position: refs/heads/main@{#43904}
This commit is contained in:
Philipp Hancke 2025-02-14 19:31:49 -08:00 committed by WebRTC LUCI CQ
parent 0a70f47808
commit ff0256e8b6

View File

@ -8,6 +8,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <memory>
@ -50,12 +51,12 @@
#include "media/base/stream_params.h"
#include "p2p/base/transport_description.h"
#include "pc/peer_connection_wrapper.h"
#include "pc/rtp_parameters_conversion.h"
#include "pc/session_description.h"
#include "pc/test/fake_audio_capture_module.h"
#include "pc/test/fake_rtc_certificate_generator.h"
#include "pc/test/integration_test_helpers.h"
#include "pc/test/mock_peer_connection_observers.h"
#include "rtc_base/logging.h"
#include "rtc_base/string_encode.h"
#include "rtc_base/thread.h"
#include "system_wrappers/include/metrics.h"
@ -1669,6 +1670,79 @@ TEST_F(SdpOfferAnswerTest, ReducedSizeNotNegotiated) {
EXPECT_FALSE(video_send_param.rtcp.reduced_size);
}
TEST_F(SdpOfferAnswerTest, PayloadTypeMatchingWithSubsequentOfferAnswer) {
auto caller = CreatePeerConnection();
auto callee = CreatePeerConnection();
// 1. Restrict codecs and set a local description and remote description.
// with a different payload type.
auto video_transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_VIDEO);
std::vector<RtpCodecCapability> codec_caps =
pc_factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_VIDEO).codecs;
codec_caps.erase(std::remove_if(codec_caps.begin(), codec_caps.end(),
[](const RtpCodecCapability& codec) {
return !absl::EqualsIgnoreCase(codec.name,
"VP8");
}),
codec_caps.end());
EXPECT_TRUE(video_transceiver->SetCodecPreferences(codec_caps).ok());
auto offer1 = caller->CreateOfferAndSetAsLocal();
// 2. Add additional supported but not offered codec before SRD
auto& contents = offer1->description()->contents();
ASSERT_EQ(contents.size(), 1u);
auto* media_description = contents[0].media_description();
ASSERT_TRUE(media_description);
std::vector<cricket::Codec> codecs = media_description->codecs();
ASSERT_EQ(codecs.size(), 1u);
ASSERT_NE(codecs[0].id, 127);
auto av1 = cricket::CreateVideoCodec(SdpVideoFormat("AV1", {}));
av1.id = 127;
codecs.insert(codecs.begin(), av1);
media_description->set_codecs(codecs);
EXPECT_TRUE(callee->SetRemoteDescription(std::move(offer1)));
auto answer1 = callee->CreateAnswerAndSetAsLocal();
EXPECT_TRUE(caller->SetRemoteDescription(std::move(answer1)));
// 3. sCP to reenable that codec. Payload type is not matched at this point.
codec_caps =
pc_factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_VIDEO).codecs;
codec_caps.erase(
std::remove_if(codec_caps.begin(), codec_caps.end(),
[](const RtpCodecCapability& codec) {
return !(absl::EqualsIgnoreCase(codec.name, "VP8") ||
absl::EqualsIgnoreCase(codec.name, "AV1"));
}),
codec_caps.end());
EXPECT_TRUE(video_transceiver->SetCodecPreferences(codec_caps).ok());
auto offer2 = caller->CreateOffer();
auto& contents2 = offer2->description()->contents();
ASSERT_EQ(contents2.size(), 1u);
auto* media_description2 = contents2[0].media_description();
codecs = media_description2->codecs();
ASSERT_EQ(codecs.size(), 2u);
EXPECT_EQ(codecs[1].name, av1.name);
EXPECT_NE(codecs[1].id, av1.id);
// 4. O/A triggered by remote. This "locks in" the payload type.
auto offer3 = callee->CreateOfferAndSetAsLocal();
EXPECT_TRUE(caller->SetRemoteDescription(std::move(offer3)));
EXPECT_TRUE(caller->CreateAnswerAndSetAsLocal());
// 5. Subsequent offer has the payload type.
auto offer4 = caller->CreateOfferAndSetAsLocal();
auto& contents4 = offer4->description()->contents();
ASSERT_EQ(contents4.size(), 1u);
auto* media_description4 = contents4[0].media_description();
ASSERT_TRUE(media_description4);
codecs = media_description4->codecs();
ASSERT_EQ(codecs.size(), 2u);
EXPECT_EQ(codecs[1].name, av1.name);
EXPECT_EQ(codecs[1].id, av1.id);
}
class SdpOfferAnswerMungingTest : public SdpOfferAnswerTest {
public:
SdpOfferAnswerMungingTest() : SdpOfferAnswerTest() { metrics::Reset(); }