Fix fake media engine to return header extensions when queried
Not a fix for the referenced bug, but discovered while working on it.
Bug: webrtc:383078466
Change-Id: I4b4933faa4f6bbf755d400f74a37834c976594e6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/396001
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44871}
diff --git a/media/base/fake_media_engine.h b/media/base/fake_media_engine.h
index 9cb3dd4..5336846 100644
--- a/media/base/fake_media_engine.h
+++ b/media/base/fake_media_engine.h
@@ -331,7 +331,10 @@
RtpParameters GetRtpSendParameters(uint32_t ssrc) const override {
auto parameters_iterator = rtp_send_parameters_.find(ssrc);
if (parameters_iterator != rtp_send_parameters_.end()) {
- return parameters_iterator->second;
+ // Take header extensions from channel global, not iterated.
+ auto parameters = parameters_iterator->second;
+ parameters.header_extensions = send_extensions_;
+ return parameters;
}
return RtpParameters();
}
diff --git a/pc/peer_connection_header_extension_unittest.cc b/pc/peer_connection_header_extension_unittest.cc
index def77de..5342b3b 100644
--- a/pc/peer_connection_header_extension_unittest.cc
+++ b/pc/peer_connection_header_extension_unittest.cc
@@ -44,12 +44,12 @@
using ::testing::Combine;
using ::testing::ElementsAre;
using ::testing::Field;
+using ::testing::IsEmpty;
using ::testing::Return;
using ::testing::Values;
class PeerConnectionHeaderExtensionTest
- : public ::testing::TestWithParam<
- std::tuple<webrtc::MediaType, SdpSemantics>> {
+ : public ::testing::TestWithParam<std::tuple<MediaType, SdpSemantics>> {
protected:
PeerConnectionHeaderExtensionTest()
: socket_server_(CreateDefaultSocketServer()),
@@ -70,10 +70,10 @@
RtpTransceiverDirection::kSendRecv)}) {}
std::unique_ptr<PeerConnectionWrapper> CreatePeerConnection(
- webrtc::MediaType media_type,
+ MediaType media_type,
std::optional<SdpSemantics> semantics) {
auto media_engine = std::make_unique<FakeMediaEngine>();
- if (media_type == webrtc::MediaType::AUDIO)
+ if (media_type == MediaType::AUDIO)
media_engine->fake_voice_engine()->SetRtpHeaderExtensions(extensions_);
else
media_engine->fake_video_engine()->SetRtpHeaderExtensions(extensions_);
@@ -111,7 +111,7 @@
};
TEST_P(PeerConnectionHeaderExtensionTest, TransceiverOffersHeaderExtensions) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -124,7 +124,7 @@
TEST_P(PeerConnectionHeaderExtensionTest,
SenderReceiverCapabilitiesReturnNotStoppedExtensions) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
std::unique_ptr<PeerConnectionWrapper> wrapper =
@@ -144,7 +144,7 @@
}
TEST_P(PeerConnectionHeaderExtensionTest, OffersUnstoppedDefaultExtensions) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -163,7 +163,7 @@
}
TEST_P(PeerConnectionHeaderExtensionTest, OffersUnstoppedModifiedExtensions) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -187,7 +187,7 @@
}
TEST_P(PeerConnectionHeaderExtensionTest, AnswersUnstoppedModifiedExtensions) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -220,7 +220,7 @@
}
TEST_P(PeerConnectionHeaderExtensionTest, NegotiatedExtensionsAreAccessible) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -256,7 +256,7 @@
}
TEST_P(PeerConnectionHeaderExtensionTest, OfferedExtensionsArePerTransceiver) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -286,7 +286,7 @@
}
TEST_P(PeerConnectionHeaderExtensionTest, RemovalAfterRenegotiation) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -318,7 +318,7 @@
TEST_P(PeerConnectionHeaderExtensionTest,
StoppedByDefaultExtensionCanBeActivatedByRemoteSdp) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -353,7 +353,7 @@
TEST_P(PeerConnectionHeaderExtensionTest,
UnknownExtensionInRemoteOfferDoesNotShowUp) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -370,7 +370,7 @@
"AD:7E:77:43:2A:29:EC:93\r\n"
"a=ice-ufrag:6HHHdzzeIhkE0CKj\r\n"
"a=ice-pwd:XYDGVpfvklQIEnZ6YnyLsAew\r\n";
- if (media_type == webrtc::MediaType::AUDIO) {
+ if (media_type == MediaType::AUDIO) {
sdp +=
"m=audio 9 RTP/AVPF 111\r\n"
"a=rtpmap:111 fake_audio_codec/8000\r\n";
@@ -407,7 +407,7 @@
// of the API to only offer non-stopped extensions.
TEST_P(PeerConnectionHeaderExtensionTest,
SdpMungingAnswerWithoutApiUsageEnablesExtensions) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -424,7 +424,7 @@
"AD:7E:77:43:2A:29:EC:93\r\n"
"a=ice-ufrag:6HHHdzzeIhkE0CKj\r\n"
"a=ice-pwd:XYDGVpfvklQIEnZ6YnyLsAew\r\n";
- if (media_type == webrtc::MediaType::AUDIO) {
+ if (media_type == MediaType::AUDIO) {
sdp +=
"m=audio 9 RTP/AVPF 111\r\n"
"a=rtpmap:111 fake_audio_codec/8000\r\n";
@@ -464,7 +464,7 @@
TEST_P(PeerConnectionHeaderExtensionTest,
SdpMungingOfferWithoutApiUsageEnablesExtensions) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -494,7 +494,7 @@
}
TEST_P(PeerConnectionHeaderExtensionTest, EnablingExtensionsAfterRemoteOffer) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = GetParam();
if (semantics != SdpSemantics::kUnifiedPlan)
@@ -511,7 +511,7 @@
"AD:7E:77:43:2A:29:EC:93\r\n"
"a=ice-ufrag:6HHHdzzeIhkE0CKj\r\n"
"a=ice-pwd:XYDGVpfvklQIEnZ6YnyLsAew\r\n";
- if (media_type == webrtc::MediaType::AUDIO) {
+ if (media_type == MediaType::AUDIO) {
sdp +=
"m=audio 9 RTP/AVPF 111\r\n"
"a=rtpmap:111 fake_audio_codec/8000\r\n";
@@ -552,21 +552,54 @@
EXPECT_EQ(extensions[0].id, 5);
}
+TEST_P(PeerConnectionHeaderExtensionTest, SenderParametersReflectNegotiation) {
+ SdpSemantics semantics;
+ MediaType media_type;
+ std::tie(media_type, semantics) = GetParam();
+ if (semantics != SdpSemantics::kUnifiedPlan) {
+ GTEST_SKIP() << "This test only works with Unified Plan";
+ }
+ std::unique_ptr<PeerConnectionWrapper> pc1 =
+ CreatePeerConnection(media_type, semantics);
+ std::unique_ptr<PeerConnectionWrapper> pc2 =
+ CreatePeerConnection(media_type, semantics);
+ auto transceiver1 = pc1->AddTransceiver(media_type);
+ // Before connection, sender sender_parameters should be empty.
+ {
+ auto sender_parameters = pc1->pc()->GetSenders()[0]->GetParameters();
+ EXPECT_THAT(sender_parameters.header_extensions, IsEmpty());
+ }
+
+ auto offer = pc1->CreateOfferAndSetAsLocal(
+ PeerConnectionInterface::RTCOfferAnswerOptions());
+ pc2->SetRemoteDescription(std::move(offer));
+ auto answer = pc2->CreateAnswerAndSetAsLocal(
+ PeerConnectionInterface::RTCOfferAnswerOptions());
+ pc1->SetRemoteDescription(std::move(answer));
+ {
+ auto sender_parameters = pc1->pc()->GetSenders()[0]->GetParameters();
+ // We expect to see all send or sendrecv extensions from the answer.
+ EXPECT_THAT(sender_parameters.header_extensions,
+ UnorderedElementsAre(Field(&RtpExtension::uri, "uri4"),
+ Field(&RtpExtension::uri, "uri2"),
+ Field(&RtpExtension::uri, "uri3")));
+ }
+}
+
INSTANTIATE_TEST_SUITE_P(
,
PeerConnectionHeaderExtensionTest,
Combine(Values(SdpSemantics::kPlanB_DEPRECATED, SdpSemantics::kUnifiedPlan),
- Values(webrtc::MediaType::AUDIO, webrtc::MediaType::VIDEO)),
+ Values(MediaType::AUDIO, MediaType::VIDEO)),
[](const testing::TestParamInfo<
PeerConnectionHeaderExtensionTest::ParamType>& info) {
- webrtc::MediaType media_type;
+ MediaType media_type;
SdpSemantics semantics;
std::tie(media_type, semantics) = info.param;
return (StringBuilder("With")
<< (semantics == SdpSemantics::kPlanB_DEPRECATED ? "PlanB"
: "UnifiedPlan")
- << "And"
- << (media_type == webrtc::MediaType::AUDIO ? "Voice" : "Video")
+ << "And" << (media_type == MediaType::AUDIO ? "Voice" : "Video")
<< "Engine")
.str();
});