зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1790097 - Vendor libwebrtc from 2f3168ff38
Upstream commit: https://webrtc.googlesource.com/src/+/2f3168ff383c393c1af635b872570aabf3f6d7c8 peerconnection: reject content if there are no common media codecs for video dealing with both the case where there is no common media codec as well as only a red/ulpfec/flexfec codec in common for video and only RED/CN in common for audio BUG=webrtc:4957,webrtc:14069 Change-Id: I1c888b4f77199aade8122051c31b690dc2fd5925 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/262642 Commit-Queue: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36920}
This commit is contained in:
Родитель
2bc2c7a638
Коммит
f26c042eee
|
@ -14298,3 +14298,6 @@ f92a0846c3
|
||||||
# MOZ_LIBWEBRTC_SRC=/home/mfroman/git-checkouts/moz-libwebrtc MOZ_LIBWEBRTC_COMMIT=mozpatches bash dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh
|
# MOZ_LIBWEBRTC_SRC=/home/mfroman/git-checkouts/moz-libwebrtc MOZ_LIBWEBRTC_COMMIT=mozpatches bash dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh
|
||||||
# base of lastest vendoring
|
# base of lastest vendoring
|
||||||
cde992ddad
|
cde992ddad
|
||||||
|
# MOZ_LIBWEBRTC_SRC=/home/mfroman/git-checkouts/moz-libwebrtc MOZ_LIBWEBRTC_COMMIT=mozpatches bash dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh
|
||||||
|
# base of lastest vendoring
|
||||||
|
2f3168ff38
|
||||||
|
|
|
@ -9552,3 +9552,5 @@ libwebrtc updated from /home/mfroman/git-checkouts/moz-libwebrtc commit mozpatch
|
||||||
libwebrtc updated from /home/mfroman/git-checkouts/moz-libwebrtc commit mozpatches on 2022-09-21T16:20:52.540207.
|
libwebrtc updated from /home/mfroman/git-checkouts/moz-libwebrtc commit mozpatches on 2022-09-21T16:20:52.540207.
|
||||||
# python3 vendor-libwebrtc.py --from-local /home/mfroman/git-checkouts/moz-libwebrtc --commit mozpatches libwebrtc
|
# python3 vendor-libwebrtc.py --from-local /home/mfroman/git-checkouts/moz-libwebrtc --commit mozpatches libwebrtc
|
||||||
libwebrtc updated from /home/mfroman/git-checkouts/moz-libwebrtc commit mozpatches on 2022-09-21T16:36:11.195361.
|
libwebrtc updated from /home/mfroman/git-checkouts/moz-libwebrtc commit mozpatches on 2022-09-21T16:36:11.195361.
|
||||||
|
# python3 vendor-libwebrtc.py --from-local /home/mfroman/git-checkouts/moz-libwebrtc --commit mozpatches libwebrtc
|
||||||
|
libwebrtc updated from /home/mfroman/git-checkouts/moz-libwebrtc commit mozpatches on 2022-09-21T16:40:05.479553.
|
||||||
|
|
|
@ -645,6 +645,16 @@ static bool IsFlexfecCodec(const C& codec) {
|
||||||
return absl::EqualsIgnoreCase(codec.name, kFlexfecCodecName);
|
return absl::EqualsIgnoreCase(codec.name, kFlexfecCodecName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
static bool IsUlpfecCodec(const C& codec) {
|
||||||
|
return absl::EqualsIgnoreCase(codec.name, kUlpfecCodecName);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
static bool IsComfortNoiseCodec(const C& codec) {
|
||||||
|
return absl::EqualsIgnoreCase(codec.name, kComfortNoiseCodecName);
|
||||||
|
}
|
||||||
|
|
||||||
// Create a media content to be offered for the given `sender_options`,
|
// Create a media content to be offered for the given `sender_options`,
|
||||||
// according to the given options.rtcp_mux, session_options.is_muc, codecs,
|
// according to the given options.rtcp_mux, session_options.is_muc, codecs,
|
||||||
// secure_transport, crypto, and current_streams. If we don't currently have
|
// secure_transport, crypto, and current_streams. If we don't currently have
|
||||||
|
@ -1347,8 +1357,7 @@ static void NegotiateRtpHeaderExtensions(
|
||||||
static void StripCNCodecs(AudioCodecs* audio_codecs) {
|
static void StripCNCodecs(AudioCodecs* audio_codecs) {
|
||||||
audio_codecs->erase(std::remove_if(audio_codecs->begin(), audio_codecs->end(),
|
audio_codecs->erase(std::remove_if(audio_codecs->begin(), audio_codecs->end(),
|
||||||
[](const AudioCodec& codec) {
|
[](const AudioCodec& codec) {
|
||||||
return absl::EqualsIgnoreCase(
|
return IsComfortNoiseCodec(codec);
|
||||||
codec.name, kComfortNoiseCodecName);
|
|
||||||
}),
|
}),
|
||||||
audio_codecs->end());
|
audio_codecs->end());
|
||||||
}
|
}
|
||||||
|
@ -2646,6 +2655,13 @@ bool MediaSessionDescriptionFactory::AddAudioContentForAnswer(
|
||||||
StripCNCodecs(&filtered_codecs);
|
StripCNCodecs(&filtered_codecs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Determine if we have media codecs in common.
|
||||||
|
bool has_common_media_codecs =
|
||||||
|
std::find_if(filtered_codecs.begin(), filtered_codecs.end(),
|
||||||
|
[](const AudioCodec& c) {
|
||||||
|
return !(IsRedCodec(c) || IsComfortNoiseCodec(c));
|
||||||
|
}) != filtered_codecs.end();
|
||||||
|
|
||||||
bool bundle_enabled = offer_description->HasGroup(GROUP_TYPE_BUNDLE) &&
|
bool bundle_enabled = offer_description->HasGroup(GROUP_TYPE_BUNDLE) &&
|
||||||
session_options.bundle_enabled;
|
session_options.bundle_enabled;
|
||||||
auto audio_answer = std::make_unique<AudioContentDescription>();
|
auto audio_answer = std::make_unique<AudioContentDescription>();
|
||||||
|
@ -2670,7 +2686,7 @@ bool MediaSessionDescriptionFactory::AddAudioContentForAnswer(
|
||||||
bool secure = bundle_transport ? bundle_transport->description.secure()
|
bool secure = bundle_transport ? bundle_transport->description.secure()
|
||||||
: audio_transport->secure();
|
: audio_transport->secure();
|
||||||
bool rejected = media_description_options.stopped ||
|
bool rejected = media_description_options.stopped ||
|
||||||
offer_content->rejected ||
|
offer_content->rejected || !has_common_media_codecs ||
|
||||||
!IsMediaProtocolSupported(MEDIA_TYPE_AUDIO,
|
!IsMediaProtocolSupported(MEDIA_TYPE_AUDIO,
|
||||||
audio_answer->protocol(), secure);
|
audio_answer->protocol(), secure);
|
||||||
if (!AddTransportAnswer(media_description_options.mid,
|
if (!AddTransportAnswer(media_description_options.mid,
|
||||||
|
@ -2766,6 +2782,13 @@ bool MediaSessionDescriptionFactory::AddVideoContentForAnswer(
|
||||||
filtered_codecs = ComputeCodecsUnion<VideoCodec>(
|
filtered_codecs = ComputeCodecsUnion<VideoCodec>(
|
||||||
filtered_codecs, other_video_codecs, field_trials);
|
filtered_codecs, other_video_codecs, field_trials);
|
||||||
}
|
}
|
||||||
|
// Determine if we have media codecs in common.
|
||||||
|
bool has_common_media_codecs =
|
||||||
|
std::find_if(
|
||||||
|
filtered_codecs.begin(), filtered_codecs.end(),
|
||||||
|
[](const VideoCodec& c) {
|
||||||
|
return !(IsRedCodec(c) || IsUlpfecCodec(c) || IsFlexfecCodec(c));
|
||||||
|
}) != filtered_codecs.end();
|
||||||
|
|
||||||
if (session_options.raw_packetization_for_video) {
|
if (session_options.raw_packetization_for_video) {
|
||||||
for (VideoCodec& codec : filtered_codecs) {
|
for (VideoCodec& codec : filtered_codecs) {
|
||||||
|
@ -2793,12 +2816,12 @@ bool MediaSessionDescriptionFactory::AddVideoContentForAnswer(
|
||||||
filtered_rtp_header_extensions(default_video_rtp_header_extensions),
|
filtered_rtp_header_extensions(default_video_rtp_header_extensions),
|
||||||
ssrc_generator_, enable_encrypted_rtp_header_extensions_,
|
ssrc_generator_, enable_encrypted_rtp_header_extensions_,
|
||||||
current_streams, bundle_enabled, video_answer.get())) {
|
current_streams, bundle_enabled, video_answer.get())) {
|
||||||
return false; // Failed the sessin setup.
|
return false; // Failed the session setup.
|
||||||
}
|
}
|
||||||
bool secure = bundle_transport ? bundle_transport->description.secure()
|
bool secure = bundle_transport ? bundle_transport->description.secure()
|
||||||
: video_transport->secure();
|
: video_transport->secure();
|
||||||
bool rejected = media_description_options.stopped ||
|
bool rejected = media_description_options.stopped ||
|
||||||
offer_content->rejected ||
|
offer_content->rejected || !has_common_media_codecs ||
|
||||||
!IsMediaProtocolSupported(MEDIA_TYPE_VIDEO,
|
!IsMediaProtocolSupported(MEDIA_TYPE_VIDEO,
|
||||||
video_answer->protocol(), secure);
|
video_answer->protocol(), secure);
|
||||||
if (!AddTransportAnswer(media_description_options.mid,
|
if (!AddTransportAnswer(media_description_options.mid,
|
||||||
|
|
|
@ -1305,6 +1305,27 @@ TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioAnswerGcm) {
|
||||||
EXPECT_EQ(cricket::kMediaProtocolSavpf, acd->protocol());
|
EXPECT_EQ(cricket::kMediaProtocolSavpf, acd->protocol());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create an audio answer with no common codecs, and ensure it is rejected.
|
||||||
|
TEST_F(MediaSessionDescriptionFactoryTest,
|
||||||
|
TestCreateAudioAnswerWithNoCommonCodecs) {
|
||||||
|
MediaSessionOptions opts;
|
||||||
|
AddMediaDescriptionOptions(MEDIA_TYPE_AUDIO, "audio",
|
||||||
|
RtpTransceiverDirection::kSendRecv, kActive,
|
||||||
|
&opts);
|
||||||
|
std::vector f1_codecs = {AudioCodec(96, "opus", 48000, -1, 1)};
|
||||||
|
f1_.set_audio_codecs(f1_codecs, f1_codecs);
|
||||||
|
|
||||||
|
std::vector f2_codecs = {AudioCodec(0, "PCMU", 8000, -1, 1)};
|
||||||
|
f2_.set_audio_codecs(f2_codecs, f2_codecs);
|
||||||
|
|
||||||
|
std::unique_ptr<SessionDescription> offer = f1_.CreateOffer(opts, nullptr);
|
||||||
|
std::unique_ptr<SessionDescription> answer =
|
||||||
|
f2_.CreateAnswer(offer.get(), opts, NULL);
|
||||||
|
const ContentInfo* ac = answer->GetContentByName("audio");
|
||||||
|
ASSERT_TRUE(ac != NULL);
|
||||||
|
EXPECT_TRUE(ac->rejected);
|
||||||
|
}
|
||||||
|
|
||||||
// Create a typical video answer, and ensure it matches what we expect.
|
// Create a typical video answer, and ensure it matches what we expect.
|
||||||
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswer) {
|
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswer) {
|
||||||
MediaSessionOptions opts;
|
MediaSessionOptions opts;
|
||||||
|
@ -1355,6 +1376,51 @@ TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerGcmAnswer) {
|
||||||
TestVideoGcmCipher(false, true);
|
TestVideoGcmCipher(false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a video answer with no common codecs, and ensure it is rejected.
|
||||||
|
TEST_F(MediaSessionDescriptionFactoryTest,
|
||||||
|
TestCreateVideoAnswerWithNoCommonCodecs) {
|
||||||
|
MediaSessionOptions opts;
|
||||||
|
AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
|
||||||
|
RtpTransceiverDirection::kSendRecv, kActive,
|
||||||
|
&opts);
|
||||||
|
std::vector f1_codecs = {VideoCodec(96, "H264")};
|
||||||
|
f1_.set_video_codecs(f1_codecs, f1_codecs);
|
||||||
|
|
||||||
|
std::vector f2_codecs = {VideoCodec(97, "VP8")};
|
||||||
|
f2_.set_video_codecs(f2_codecs, f2_codecs);
|
||||||
|
|
||||||
|
std::unique_ptr<SessionDescription> offer = f1_.CreateOffer(opts, nullptr);
|
||||||
|
std::unique_ptr<SessionDescription> answer =
|
||||||
|
f2_.CreateAnswer(offer.get(), opts, NULL);
|
||||||
|
const ContentInfo* vc = answer->GetContentByName("video");
|
||||||
|
ASSERT_TRUE(vc != NULL);
|
||||||
|
EXPECT_TRUE(vc->rejected);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a video answer with no common codecs (but a common FEC codec), and
|
||||||
|
// ensure it is rejected.
|
||||||
|
TEST_F(MediaSessionDescriptionFactoryTest,
|
||||||
|
TestCreateVideoAnswerWithOnlyFecCodecsCommon) {
|
||||||
|
MediaSessionOptions opts;
|
||||||
|
AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
|
||||||
|
RtpTransceiverDirection::kSendRecv, kActive,
|
||||||
|
&opts);
|
||||||
|
std::vector f1_codecs = {VideoCodec(96, "H264"),
|
||||||
|
VideoCodec(118, "flexfec-03")};
|
||||||
|
f1_.set_video_codecs(f1_codecs, f1_codecs);
|
||||||
|
|
||||||
|
std::vector f2_codecs = {VideoCodec(97, "VP8"),
|
||||||
|
VideoCodec(118, "flexfec-03")};
|
||||||
|
f2_.set_video_codecs(f2_codecs, f2_codecs);
|
||||||
|
|
||||||
|
std::unique_ptr<SessionDescription> offer = f1_.CreateOffer(opts, nullptr);
|
||||||
|
std::unique_ptr<SessionDescription> answer =
|
||||||
|
f2_.CreateAnswer(offer.get(), opts, NULL);
|
||||||
|
const ContentInfo* vc = answer->GetContentByName("video");
|
||||||
|
ASSERT_TRUE(vc != NULL);
|
||||||
|
EXPECT_TRUE(vc->rejected);
|
||||||
|
}
|
||||||
|
|
||||||
// The use_sctpmap flag should be set in an Sctp DataContentDescription by
|
// The use_sctpmap flag should be set in an Sctp DataContentDescription by
|
||||||
// default. The answer's use_sctpmap flag should match the offer's.
|
// default. The answer's use_sctpmap flag should match the offer's.
|
||||||
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerUsesSctpmap) {
|
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerUsesSctpmap) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче