Index: webrtc/pc/mediasession_unittest.cc |
diff --git a/webrtc/pc/mediasession_unittest.cc b/webrtc/pc/mediasession_unittest.cc |
index f87dda1bf377d89e5f79638e1744a8a4de6dd1b7..ae8d13940b6f91bbf9f3636cb12be75ec1db1b9d 100644 |
--- a/webrtc/pc/mediasession_unittest.cc |
+++ b/webrtc/pc/mediasession_unittest.cc |
@@ -34,7 +34,6 @@ |
using cricket::MediaContentDescription; |
using cricket::MediaSessionDescriptionFactory; |
using cricket::MediaContentDirection; |
-using cricket::MediaDescriptionOptions; |
using cricket::MediaSessionOptions; |
using cricket::MediaType; |
using cricket::SessionDescription; |
@@ -66,7 +65,6 @@ |
using cricket::SEC_DISABLED; |
using cricket::SEC_ENABLED; |
using cricket::SEC_REQUIRED; |
-using cricket::RtpTransceiverDirection; |
using rtc::CS_AES_CM_128_HMAC_SHA1_32; |
using rtc::CS_AES_CM_128_HMAC_SHA1_80; |
using rtc::CS_AEAD_AES_128_GCM; |
@@ -94,9 +92,6 @@ |
static const VideoCodec kVideoCodecs1[] = {VideoCodec(96, "H264-SVC"), |
VideoCodec(97, "H264")}; |
- |
-static const VideoCodec kVideoCodecs1Reverse[] = {VideoCodec(97, "H264"), |
- VideoCodec(96, "H264-SVC")}; |
static const VideoCodec kVideoCodecs2[] = {VideoCodec(126, "H264"), |
VideoCodec(127, "H263")}; |
@@ -213,11 +208,6 @@ |
"TCP/TLS/RTP/SAVPF", "TCP/TLS/RTP/SAVP", "UDP/TLS/RTP/SAVPF", |
"UDP/TLS/RTP/SAVP"}; |
-// These constants are used to make the code using "AddMediaSection" more |
-// readable. |
-static constexpr bool kStopped = true; |
-static constexpr bool kActive = false; |
- |
static bool IsMediaContentOfType(const ContentInfo* content, |
MediaType media_type) { |
const MediaContentDescription* mdesc = |
@@ -247,95 +237,11 @@ |
return codec_names; |
} |
-// This is used for test only. MIDs are not the identification of the |
-// MediaDescriptionOptions since some end points may not support MID and the SDP |
-// may not contain 'mid'. |
-std::vector<MediaDescriptionOptions>::iterator FindFirstMediaDescriptionByMid( |
- const std::string& mid, |
- MediaSessionOptions* opts) { |
- return std::find_if( |
- opts->media_description_options.begin(), |
- opts->media_description_options.end(), |
- [mid](const MediaDescriptionOptions& t) { return t.mid == mid; }); |
-} |
- |
-// Add a media section to the |session_options|. |
-static void AddMediaSection(MediaType type, |
- const std::string& mid, |
- MediaContentDirection direction, |
- bool stopped, |
- MediaSessionOptions* opts) { |
- opts->media_description_options.push_back(MediaDescriptionOptions( |
- type, mid, |
- cricket::RtpTransceiverDirection::FromMediaContentDirection(direction), |
- stopped)); |
-} |
- |
-static void AddAudioVideoSections(MediaContentDirection direction, |
- MediaSessionOptions* opts) { |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", direction, kActive, opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", direction, kActive, opts); |
-} |
- |
-static void AddDataSection(cricket::DataChannelType dct, |
- MediaContentDirection direction, |
- MediaSessionOptions* opts) { |
- opts->data_channel_type = dct; |
- AddMediaSection(MEDIA_TYPE_DATA, "data", direction, kActive, opts); |
-} |
- |
-static void AttachSenderToMediaSection(const std::string& mid, |
- MediaType type, |
- const std::string& track_id, |
- const std::string& stream_id, |
- int num_sim_layer, |
- MediaSessionOptions* session_options) { |
- auto it = FindFirstMediaDescriptionByMid(mid, session_options); |
- switch (type) { |
- case MEDIA_TYPE_AUDIO: |
- it->AddAudioSender(track_id, stream_id); |
- break; |
- case MEDIA_TYPE_VIDEO: |
- it->AddVideoSender(track_id, stream_id, num_sim_layer); |
- break; |
- case MEDIA_TYPE_DATA: |
- it->AddRtpDataChannel(track_id, stream_id); |
- break; |
- default: |
- RTC_NOTREACHED(); |
- } |
-} |
- |
-static void DetachSenderFromMediaSection(const std::string& mid, |
- const std::string& track_id, |
- MediaSessionOptions* session_options) { |
- auto it = FindFirstMediaDescriptionByMid(mid, session_options); |
- auto sender_it = it->sender_options.begin(); |
- for (; sender_it != it->sender_options.end(); ++sender_it) { |
- if (sender_it->track_id == track_id) { |
- it->sender_options.erase(sender_it); |
- return; |
- } |
- } |
- RTC_NOTREACHED(); |
-} |
- |
-// Helper function used to create a default MediaSessionOptions for Plan B SDP. |
-// (https://tools.ietf.org/html/draft-uberti-rtcweb-plan-00). |
-static MediaSessionOptions CreatePlanBMediaSessionOptions() { |
- MediaSessionOptions session_options; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &session_options); |
- return session_options; |
-} |
- |
-// TODO(zhihuang): Most of these tests were written while MediaSessionOptions |
-// was designed for Plan B SDP, where only one audio "m=" section and one video |
-// "m=" section could be generated, and ordering couldn't be controlled. Many of |
-// these tests may be obsolete as a result, and should be refactored or removed. |
class MediaSessionDescriptionFactoryTest : public testing::Test { |
public: |
- MediaSessionDescriptionFactoryTest() : f1_(&tdf1_), f2_(&tdf2_) { |
+ MediaSessionDescriptionFactoryTest() |
+ : f1_(&tdf1_), |
+ f2_(&tdf2_) { |
f1_.set_audio_codecs(MAKE_VECTOR(kAudioCodecs1), |
MAKE_VECTOR(kAudioCodecs1)); |
f1_.set_video_codecs(MAKE_VECTOR(kVideoCodecs1)); |
@@ -399,8 +305,7 @@ |
return iter != ice_options.end(); |
} |
- void TestTransportInfo(bool offer, |
- MediaSessionOptions& options, |
+ void TestTransportInfo(bool offer, const MediaSessionOptions& options, |
bool has_current_desc) { |
const std::string current_audio_ufrag = "current_audio_ufrag"; |
const std::string current_audio_pwd = "current_audio_pwd"; |
@@ -445,11 +350,7 @@ |
EXPECT_EQ(static_cast<size_t>(cricket::ICE_PWD_LENGTH), |
ti_audio->description.ice_pwd.size()); |
} |
- auto media_desc_options_it = |
- FindFirstMediaDescriptionByMid("audio", &options); |
- EXPECT_EQ( |
- media_desc_options_it->transport_options.enable_ice_renomination, |
- GetIceRenomination(ti_audio)); |
+ EXPECT_EQ(options.enable_ice_renomination, GetIceRenomination(ti_audio)); |
} else { |
EXPECT_TRUE(ti_audio == NULL); |
@@ -473,11 +374,7 @@ |
ti_video->description.ice_pwd.size()); |
} |
} |
- auto media_desc_options_it = |
- FindFirstMediaDescriptionByMid("video", &options); |
- EXPECT_EQ( |
- media_desc_options_it->transport_options.enable_ice_renomination, |
- GetIceRenomination(ti_video)); |
+ EXPECT_EQ(options.enable_ice_renomination, GetIceRenomination(ti_video)); |
} else { |
EXPECT_TRUE(ti_video == NULL); |
} |
@@ -500,11 +397,7 @@ |
ti_data->description.ice_pwd.size()); |
} |
} |
- auto media_desc_options_it = |
- FindFirstMediaDescriptionByMid("data", &options); |
- EXPECT_EQ( |
- media_desc_options_it->transport_options.enable_ice_renomination, |
- GetIceRenomination(ti_data)); |
+ EXPECT_EQ(options.enable_ice_renomination, GetIceRenomination(ti_data)); |
} else { |
EXPECT_TRUE(ti_video == NULL); |
@@ -514,8 +407,9 @@ |
void TestCryptoWithBundle(bool offer) { |
f1_.set_secure(SEC_ENABLED); |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
std::unique_ptr<SessionDescription> ref_desc; |
std::unique_ptr<SessionDescription> desc; |
if (offer) { |
@@ -561,25 +455,27 @@ |
// This test that the audio and video media direction is set to |
// |expected_direction_in_answer| in an answer if the offer direction is set |
- // to |direction_in_offer| and the answer is willing to both send and receive. |
+ // to |direction_in_offer|. |
void TestMediaDirectionInAnswer( |
cricket::MediaContentDirection direction_in_offer, |
cricket::MediaContentDirection expected_direction_in_answer) { |
- MediaSessionOptions offer_opts; |
- AddAudioVideoSections(direction_in_offer, &offer_opts); |
- |
- std::unique_ptr<SessionDescription> offer( |
- f1_.CreateOffer(offer_opts, NULL)); |
+ MediaSessionOptions opts; |
+ opts.recv_video = true; |
+ std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
ContentInfo* ac_offer = offer->GetContentByName("audio"); |
ASSERT_TRUE(ac_offer != NULL); |
+ AudioContentDescription* acd_offer = |
+ static_cast<AudioContentDescription*>(ac_offer->description); |
+ acd_offer->set_direction(direction_in_offer); |
ContentInfo* vc_offer = offer->GetContentByName("video"); |
ASSERT_TRUE(vc_offer != NULL); |
- |
- MediaSessionOptions answer_opts; |
- AddAudioVideoSections(cricket::MD_SENDRECV, &answer_opts); |
+ VideoContentDescription* vcd_offer = |
+ static_cast<VideoContentDescription*>(vc_offer->description); |
+ vcd_offer->set_direction(direction_in_offer); |
+ |
std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), answer_opts, NULL)); |
+ f2_.CreateAnswer(offer.get(), opts, NULL)); |
const AudioContentDescription* acd_answer = |
GetFirstAudioContentDescription(answer.get()); |
EXPECT_EQ(expected_direction_in_answer, acd_answer->direction()); |
@@ -603,13 +499,11 @@ |
void TestVideoGcmCipher(bool gcm_offer, bool gcm_answer) { |
MediaSessionOptions offer_opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &offer_opts); |
+ offer_opts.recv_video = true; |
offer_opts.crypto_options.enable_gcm_crypto_suites = gcm_offer; |
- |
MediaSessionOptions answer_opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &answer_opts); |
+ answer_opts.recv_video = true; |
answer_opts.crypto_options.enable_gcm_crypto_suites = gcm_answer; |
- |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer( |
@@ -630,7 +524,7 @@ |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs()); |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux |
if (gcm_offer && gcm_answer) { |
ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM); |
@@ -639,7 +533,7 @@ |
} |
EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type()); |
EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs()); |
- EXPECT_EQ(0U, vcd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc |
EXPECT_TRUE(vcd->rtcp_mux()); // negotiated rtcp-mux |
if (gcm_offer && gcm_answer) { |
ASSERT_CRYPTO(vcd, 1U, CS_AEAD_AES_256_GCM); |
@@ -660,7 +554,7 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioOffer) { |
f1_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer( |
- f1_.CreateOffer(CreatePlanBMediaSessionOptions(), NULL)); |
+ f1_.CreateOffer(MediaSessionOptions(), NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
const ContentInfo* ac = offer->GetContentByName("audio"); |
const ContentInfo* vc = offer->GetContentByName("video"); |
@@ -671,7 +565,7 @@ |
static_cast<const AudioContentDescription*>(ac->description); |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs()); |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attached. |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // default bandwidth (auto) |
EXPECT_TRUE(acd->rtcp_mux()); // rtcp-mux defaults on |
ASSERT_CRYPTO(acd, 2U, CS_AES_CM_128_HMAC_SHA1_32); |
@@ -681,7 +575,7 @@ |
// Create a typical video offer, and ensure it matches what we expect. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoOffer) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
f1_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
@@ -697,14 +591,14 @@ |
static_cast<const VideoContentDescription*>(vc->description); |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs()); |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // default bandwidth (auto) |
EXPECT_TRUE(acd->rtcp_mux()); // rtcp-mux defaults on |
ASSERT_CRYPTO(acd, 2U, CS_AES_CM_128_HMAC_SHA1_32); |
EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol()); |
EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type()); |
EXPECT_EQ(f1_.video_codecs(), vcd->codecs()); |
- EXPECT_EQ(0U, vcd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc |
EXPECT_EQ(kAutoBandwidth, vcd->bandwidth()); // default bandwidth (auto) |
EXPECT_TRUE(vcd->rtcp_mux()); // rtcp-mux defaults on |
ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80); |
@@ -722,8 +616,9 @@ |
ASSERT_EQ(offered_video_codec.id, offered_data_codec.id); |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts); |
+ opts.recv_audio = true; |
+ opts.recv_video = true; |
+ opts.data_channel_type = cricket::DCT_RTP; |
opts.bundle_enabled = true; |
std::unique_ptr<SessionDescription> offer(f2_.CreateOffer(opts, NULL)); |
const VideoContentDescription* vcd = |
@@ -743,17 +638,15 @@ |
EXPECT_EQ(dcd->codecs()[0].name, offered_data_codec.name); |
} |
-// Test creating an updated offer with bundle, audio, video and data |
+// Test creating an updated offer with with bundle, audio, video and data |
// after an audio only session has been negotiated. |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestCreateUpdatedVideoOfferWithBundle) { |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_INACTIVE, kStopped, |
- &opts); |
+ opts.recv_audio = true; |
+ opts.recv_video = false; |
opts.data_channel_type = cricket::DCT_NONE; |
opts.bundle_enabled = true; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
@@ -761,8 +654,9 @@ |
f2_.CreateAnswer(offer.get(), opts, NULL)); |
MediaSessionOptions updated_opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &updated_opts); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &updated_opts); |
+ updated_opts.recv_audio = true; |
+ updated_opts.recv_video = true; |
+ updated_opts.data_channel_type = cricket::DCT_RTP; |
updated_opts.bundle_enabled = true; |
std::unique_ptr<SessionDescription> updated_offer( |
f1_.CreateOffer(updated_opts, answer.get())); |
@@ -788,8 +682,7 @@ |
// Create a RTP data offer, and ensure it matches what we expect. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateRtpDataOffer) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts); |
+ opts.data_channel_type = cricket::DCT_RTP; |
f1_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
@@ -805,14 +698,14 @@ |
static_cast<const DataContentDescription*>(dc->description); |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs()); |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attched. |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // default bandwidth (auto) |
EXPECT_TRUE(acd->rtcp_mux()); // rtcp-mux defaults on |
ASSERT_CRYPTO(acd, 2U, CS_AES_CM_128_HMAC_SHA1_32); |
EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol()); |
EXPECT_EQ(MEDIA_TYPE_DATA, dcd->type()); |
EXPECT_EQ(f1_.data_codecs(), dcd->codecs()); |
- EXPECT_EQ(0U, dcd->first_ssrc()); // no sender is attached. |
+ EXPECT_NE(0U, dcd->first_ssrc()); // a random nonzero ssrc |
EXPECT_EQ(cricket::kDataMaxBandwidth, |
dcd->bandwidth()); // default bandwidth (auto) |
EXPECT_TRUE(dcd->rtcp_mux()); // rtcp-mux defaults on |
@@ -823,8 +716,9 @@ |
// Create an SCTP data offer with bundle without error. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateSctpDataOffer) { |
MediaSessionOptions opts; |
+ opts.recv_audio = false; |
opts.bundle_enabled = true; |
- AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts); |
+ opts.data_channel_type = cricket::DCT_SCTP; |
f1_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
EXPECT_TRUE(offer.get() != NULL); |
@@ -834,8 +728,9 @@ |
// Test creating an sctp data channel from an already generated offer. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateImplicitSctpDataOffer) { |
MediaSessionOptions opts; |
+ opts.recv_audio = false; |
opts.bundle_enabled = true; |
- AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts); |
+ opts.data_channel_type = cricket::DCT_SCTP; |
f1_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer1(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer1.get() != NULL); |
@@ -861,7 +756,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestCreateOfferWithoutLegacyStreams) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
+ f1_.set_add_legacy_streams(false); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
const ContentInfo* ac = offer->GetContentByName("audio"); |
@@ -879,14 +775,13 @@ |
// Creates an audio+video sendonly offer. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateSendOnlyOffer) { |
- MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_SENDONLY, &opts); |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack1, |
- kMediaStream1, 1, &opts); |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1, |
- kMediaStream1, 1, &opts); |
- |
- std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
+ MediaSessionOptions options; |
+ options.recv_audio = false; |
+ options.recv_video = false; |
+ options.AddSendStream(MEDIA_TYPE_VIDEO, kVideoTrack1, kMediaStream1); |
+ options.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack1, kMediaStream1); |
+ |
+ std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(options, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
EXPECT_EQ(2u, offer->contents().size()); |
EXPECT_TRUE(IsMediaContentOfType(&offer->contents()[0], MEDIA_TYPE_AUDIO)); |
@@ -900,15 +795,16 @@ |
// SessionDescription is preserved in the new SessionDescription. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateOfferContentOrder) { |
MediaSessionOptions opts; |
- AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts); |
+ opts.recv_audio = false; |
+ opts.recv_video = false; |
+ opts.data_channel_type = cricket::DCT_SCTP; |
std::unique_ptr<SessionDescription> offer1(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer1.get() != NULL); |
EXPECT_EQ(1u, offer1->contents().size()); |
EXPECT_TRUE(IsMediaContentOfType(&offer1->contents()[0], MEDIA_TYPE_DATA)); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_video = true; |
std::unique_ptr<SessionDescription> offer2( |
f1_.CreateOffer(opts, offer1.get())); |
ASSERT_TRUE(offer2.get() != NULL); |
@@ -916,8 +812,7 @@ |
EXPECT_TRUE(IsMediaContentOfType(&offer2->contents()[0], MEDIA_TYPE_DATA)); |
EXPECT_TRUE(IsMediaContentOfType(&offer2->contents()[1], MEDIA_TYPE_VIDEO)); |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_audio = true; |
std::unique_ptr<SessionDescription> offer3( |
f1_.CreateOffer(opts, offer2.get())); |
ASSERT_TRUE(offer3.get() != NULL); |
@@ -925,6 +820,15 @@ |
EXPECT_TRUE(IsMediaContentOfType(&offer3->contents()[0], MEDIA_TYPE_DATA)); |
EXPECT_TRUE(IsMediaContentOfType(&offer3->contents()[1], MEDIA_TYPE_VIDEO)); |
EXPECT_TRUE(IsMediaContentOfType(&offer3->contents()[2], MEDIA_TYPE_AUDIO)); |
+ |
+ // Verifies the default order is audio-video-data, so that the previous checks |
+ // didn't pass by accident. |
+ std::unique_ptr<SessionDescription> offer4(f1_.CreateOffer(opts, NULL)); |
+ ASSERT_TRUE(offer4.get() != NULL); |
+ EXPECT_EQ(3u, offer4->contents().size()); |
+ EXPECT_TRUE(IsMediaContentOfType(&offer4->contents()[0], MEDIA_TYPE_AUDIO)); |
+ EXPECT_TRUE(IsMediaContentOfType(&offer4->contents()[1], MEDIA_TYPE_VIDEO)); |
+ EXPECT_TRUE(IsMediaContentOfType(&offer4->contents()[2], MEDIA_TYPE_DATA)); |
} |
// Create a typical audio answer, and ensure it matches what we expect. |
@@ -932,10 +836,10 @@ |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer( |
- f1_.CreateOffer(CreatePlanBMediaSessionOptions(), NULL)); |
- ASSERT_TRUE(offer.get() != NULL); |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), CreatePlanBMediaSessionOptions(), NULL)); |
+ f1_.CreateOffer(MediaSessionOptions(), NULL)); |
+ ASSERT_TRUE(offer.get() != NULL); |
+ std::unique_ptr<SessionDescription> answer( |
+ f2_.CreateAnswer(offer.get(), MediaSessionOptions(), NULL)); |
const ContentInfo* ac = answer->GetContentByName("audio"); |
const ContentInfo* vc = answer->GetContentByName("video"); |
ASSERT_TRUE(ac != NULL); |
@@ -945,7 +849,7 @@ |
static_cast<const AudioContentDescription*>(ac->description); |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs()); |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw |
EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux |
ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32); |
@@ -957,12 +861,13 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioAnswerGcm) { |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
- MediaSessionOptions opts = CreatePlanBMediaSessionOptions(); |
- opts.crypto_options.enable_gcm_crypto_suites = true; |
- std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
- ASSERT_TRUE(offer.get() != NULL); |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), opts, NULL)); |
+ MediaSessionOptions options; |
+ options.crypto_options.enable_gcm_crypto_suites = true; |
+ std::unique_ptr<SessionDescription> offer( |
+ f1_.CreateOffer(options, NULL)); |
+ ASSERT_TRUE(offer.get() != NULL); |
+ std::unique_ptr<SessionDescription> answer( |
+ f2_.CreateAnswer(offer.get(), options, NULL)); |
const ContentInfo* ac = answer->GetContentByName("audio"); |
const ContentInfo* vc = answer->GetContentByName("video"); |
ASSERT_TRUE(ac != NULL); |
@@ -972,7 +877,7 @@ |
static_cast<const AudioContentDescription*>(ac->description); |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs()); |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw |
EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux |
ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM); |
@@ -982,7 +887,7 @@ |
// Create a typical video answer, and ensure it matches what we expect. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswer) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
@@ -1002,12 +907,12 @@ |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs()); |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux |
ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32); |
EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type()); |
EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs()); |
- EXPECT_EQ(0U, vcd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc |
EXPECT_TRUE(vcd->rtcp_mux()); // negotiated rtcp-mux |
ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80); |
EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol()); |
@@ -1032,8 +937,8 @@ |
} |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswer) { |
- MediaSessionOptions opts = CreatePlanBMediaSessionOptions(); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts); |
+ MediaSessionOptions opts; |
+ opts.data_channel_type = cricket::DCT_RTP; |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
@@ -1053,20 +958,20 @@ |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs()); |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux |
ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32); |
EXPECT_EQ(MEDIA_TYPE_DATA, dcd->type()); |
EXPECT_EQ(MAKE_VECTOR(kDataCodecsAnswer), dcd->codecs()); |
- EXPECT_EQ(0U, dcd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, dcd->first_ssrc()); // a random nonzero ssrc |
EXPECT_TRUE(dcd->rtcp_mux()); // negotiated rtcp-mux |
ASSERT_CRYPTO(dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80); |
EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), dcd->protocol()); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerGcm) { |
- MediaSessionOptions opts = CreatePlanBMediaSessionOptions(); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts); |
+ MediaSessionOptions opts; |
+ opts.data_channel_type = cricket::DCT_RTP; |
opts.crypto_options.enable_gcm_crypto_suites = true; |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
@@ -1087,12 +992,12 @@ |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs()); |
EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw |
- EXPECT_EQ(0U, acd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc |
EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux |
ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM); |
EXPECT_EQ(MEDIA_TYPE_DATA, dcd->type()); |
EXPECT_EQ(MAKE_VECTOR(kDataCodecsAnswer), dcd->codecs()); |
- EXPECT_EQ(0U, dcd->first_ssrc()); // no sender is attached |
+ EXPECT_NE(0U, dcd->first_ssrc()); // a random nonzero ssrc |
EXPECT_TRUE(dcd->rtcp_mux()); // negotiated rtcp-mux |
ASSERT_CRYPTO(dcd, 1U, CS_AEAD_AES_256_GCM); |
EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), dcd->protocol()); |
@@ -1102,7 +1007,7 @@ |
// The answer's use_sctpmap flag should match the offer's. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerUsesSctpmap) { |
MediaSessionOptions opts; |
- AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts); |
+ opts.data_channel_type = cricket::DCT_SCTP; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
ContentInfo* dc_offer = offer->GetContentByName("data"); |
@@ -1123,7 +1028,7 @@ |
// The answer's use_sctpmap flag should match the offer's. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerWithoutSctpmap) { |
MediaSessionOptions opts; |
- AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts); |
+ opts.data_channel_type = cricket::DCT_SCTP; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
ContentInfo* dc_offer = offer->GetContentByName("data"); |
@@ -1153,7 +1058,7 @@ |
tdf2_.set_secure(SEC_ENABLED); |
MediaSessionOptions opts; |
- AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts); |
+ opts.data_channel_type = cricket::DCT_SCTP; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
ASSERT_TRUE(offer.get() != nullptr); |
ContentInfo* dc_offer = offer->GetContentByName("data"); |
@@ -1182,20 +1087,19 @@ |
MediaSessionOptions opts; |
// Creates a data only offer. |
- AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts); |
+ opts.recv_audio = false; |
+ opts.data_channel_type = cricket::DCT_SCTP; |
std::unique_ptr<SessionDescription> offer1(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer1.get() != NULL); |
// Appends audio to the offer. |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_audio = true; |
std::unique_ptr<SessionDescription> offer2( |
f1_.CreateOffer(opts, offer1.get())); |
ASSERT_TRUE(offer2.get() != NULL); |
// Appends video to the offer. |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_video = true; |
std::unique_ptr<SessionDescription> offer3( |
f1_.CreateOffer(opts, offer2.get())); |
ASSERT_TRUE(offer3.get() != NULL); |
@@ -1240,7 +1144,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
CreateDataAnswerToOfferWithUnknownProtocol) { |
MediaSessionOptions opts; |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts); |
+ opts.data_channel_type = cricket::DCT_RTP; |
+ opts.recv_audio = false; |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
@@ -1266,7 +1171,7 @@ |
// Test that the media protocol is RTP/AVPF if DTLS and SDES are disabled. |
TEST_F(MediaSessionDescriptionFactoryTest, AudioOfferAnswerWithCryptoDisabled) { |
- MediaSessionOptions opts = CreatePlanBMediaSessionOptions(); |
+ MediaSessionOptions opts; |
f1_.set_secure(SEC_DISABLED); |
f2_.set_secure(SEC_DISABLED); |
tdf1_.set_secure(SEC_DISABLED); |
@@ -1295,7 +1200,8 @@ |
// matches what we expect. |
TEST_F(MediaSessionDescriptionFactoryTest, TestOfferAnswerWithRtpExtensions) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
+ |
f1_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension1)); |
f1_.set_video_rtp_header_extensions(MAKE_VECTOR(kVideoRtpExtension1)); |
f2_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension2)); |
@@ -1323,7 +1229,7 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestOfferAnswerWithEncryptedRtpExtensionsBoth) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
f1_.set_enable_encrypted_rtp_header_extensions(true); |
f2_.set_enable_encrypted_rtp_header_extensions(true); |
@@ -1359,7 +1265,7 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestOfferAnswerWithEncryptedRtpExtensionsOffer) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
f1_.set_enable_encrypted_rtp_header_extensions(true); |
@@ -1394,7 +1300,7 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestOfferAnswerWithEncryptedRtpExtensionsAnswer) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
f2_.set_enable_encrypted_rtp_header_extensions(true); |
@@ -1430,8 +1336,10 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestCreateAnswerWithoutLegacyStreams) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
+ opts.data_channel_type = cricket::DCT_RTP; |
+ f1_.set_add_legacy_streams(false); |
+ f2_.set_add_legacy_streams(false); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
std::unique_ptr<SessionDescription> answer( |
@@ -1455,8 +1363,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, TestPartial) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
+ opts.data_channel_type = cricket::DCT_RTP; |
f1_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
@@ -1492,18 +1400,18 @@ |
// Create a typical video answer, and ensure it matches what we expect. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerRtcpMux) { |
MediaSessionOptions offer_opts; |
- AddAudioVideoSections(cricket::MD_SENDRECV, &offer_opts); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_SENDRECV, &offer_opts); |
- |
MediaSessionOptions answer_opts; |
- AddAudioVideoSections(cricket::MD_SENDRECV, &answer_opts); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_SENDRECV, &answer_opts); |
+ answer_opts.recv_video = true; |
+ offer_opts.recv_video = true; |
+ answer_opts.data_channel_type = cricket::DCT_RTP; |
+ offer_opts.data_channel_type = cricket::DCT_RTP; |
std::unique_ptr<SessionDescription> offer; |
std::unique_ptr<SessionDescription> answer; |
offer_opts.rtcp_mux_enabled = true; |
answer_opts.rtcp_mux_enabled = true; |
+ |
offer.reset(f1_.CreateOffer(offer_opts, NULL)); |
answer.reset(f2_.CreateAnswer(offer.get(), answer_opts, NULL)); |
ASSERT_TRUE(NULL != GetFirstAudioContentDescription(offer.get())); |
@@ -1521,6 +1429,7 @@ |
offer_opts.rtcp_mux_enabled = true; |
answer_opts.rtcp_mux_enabled = false; |
+ |
offer.reset(f1_.CreateOffer(offer_opts, NULL)); |
answer.reset(f2_.CreateAnswer(offer.get(), answer_opts, NULL)); |
ASSERT_TRUE(NULL != GetFirstAudioContentDescription(offer.get())); |
@@ -1538,6 +1447,7 @@ |
offer_opts.rtcp_mux_enabled = false; |
answer_opts.rtcp_mux_enabled = true; |
+ |
offer.reset(f1_.CreateOffer(offer_opts, NULL)); |
answer.reset(f2_.CreateAnswer(offer.get(), answer_opts, NULL)); |
ASSERT_TRUE(NULL != GetFirstAudioContentDescription(offer.get())); |
@@ -1555,6 +1465,7 @@ |
offer_opts.rtcp_mux_enabled = false; |
answer_opts.rtcp_mux_enabled = false; |
+ |
offer.reset(f1_.CreateOffer(offer_opts, NULL)); |
answer.reset(f2_.CreateAnswer(offer.get(), answer_opts, NULL)); |
ASSERT_TRUE(NULL != GetFirstAudioContentDescription(offer.get())); |
@@ -1574,16 +1485,11 @@ |
// Create an audio-only answer to a video offer. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioAnswerToVideo) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_video = true; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
- |
- opts.media_description_options[1].stopped = true; |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), opts, NULL)); |
+ std::unique_ptr<SessionDescription> answer( |
+ f2_.CreateAnswer(offer.get(), MediaSessionOptions(), NULL)); |
const ContentInfo* ac = answer->GetContentByName("audio"); |
const ContentInfo* vc = answer->GetContentByName("video"); |
ASSERT_TRUE(ac != NULL); |
@@ -1594,16 +1500,12 @@ |
// Create an audio-only answer to an offer with data. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateNoDataAnswerToDataOffer) { |
- MediaSessionOptions opts = CreatePlanBMediaSessionOptions(); |
+ MediaSessionOptions opts; |
opts.data_channel_type = cricket::DCT_RTP; |
- AddMediaSection(MEDIA_TYPE_DATA, "data", cricket::MD_RECVONLY, kActive, |
- &opts); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
- |
- opts.media_description_options[1].stopped = true; |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), opts, NULL)); |
+ std::unique_ptr<SessionDescription> answer( |
+ f2_.CreateAnswer(offer.get(), MediaSessionOptions(), NULL)); |
const ContentInfo* ac = answer->GetContentByName("audio"); |
const ContentInfo* dc = answer->GetContentByName("data"); |
ASSERT_TRUE(ac != NULL); |
@@ -1616,8 +1518,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
CreateAnswerToOfferWithRejectedMedia) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
+ opts.data_channel_type = cricket::DCT_RTP; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
ContentInfo* ac = offer->GetContentByName("audio"); |
@@ -1650,19 +1552,12 @@ |
// adding a new video track and replaces one of the audio tracks. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateMultiStreamVideoOffer) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_SENDRECV, &opts); |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack1, |
- kMediaStream1, 1, &opts); |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1, |
- kMediaStream1, 1, &opts); |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack2, |
- kMediaStream1, 1, &opts); |
- |
- AddDataSection(cricket::DCT_RTP, cricket::MD_SENDRECV, &opts); |
- AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack1, |
- kMediaStream1, 1, &opts); |
- AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack2, |
- kMediaStream1, 1, &opts); |
+ opts.AddSendStream(MEDIA_TYPE_VIDEO, kVideoTrack1, kMediaStream1); |
+ opts.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack1, kMediaStream1); |
+ opts.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack2, kMediaStream1); |
+ opts.data_channel_type = cricket::DCT_RTP; |
+ opts.AddSendStream(MEDIA_TYPE_DATA, kDataTrack1, kMediaStream1); |
+ opts.AddSendStream(MEDIA_TYPE_DATA, kDataTrack2, kMediaStream1); |
f1_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
@@ -1727,16 +1622,14 @@ |
EXPECT_TRUE(dcd->rtcp_mux()); // rtcp-mux defaults on |
ASSERT_CRYPTO(dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80); |
+ |
// Update the offer. Add a new video track that is not synched to the |
// other tracks and replace audio track 2 with audio track 3. |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack2, |
- kMediaStream2, 1, &opts); |
- DetachSenderFromMediaSection("audio", kAudioTrack2, &opts); |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack3, |
- kMediaStream1, 1, &opts); |
- DetachSenderFromMediaSection("data", kDataTrack2, &opts); |
- AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack3, |
- kMediaStream1, 1, &opts); |
+ opts.AddSendStream(MEDIA_TYPE_VIDEO, kVideoTrack2, kMediaStream2); |
+ opts.RemoveSendStream(MEDIA_TYPE_AUDIO, kAudioTrack2); |
+ opts.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack3, kMediaStream1); |
+ opts.RemoveSendStream(MEDIA_TYPE_DATA, kDataTrack2); |
+ opts.AddSendStream(MEDIA_TYPE_DATA, kDataTrack3, kMediaStream1); |
std::unique_ptr<SessionDescription> updated_offer( |
f1_.CreateOffer(opts, offer.get())); |
@@ -1798,13 +1691,8 @@ |
// Create an offer with simulcast video stream. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateSimulcastVideoOffer) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive, |
- &opts); |
const int num_sim_layers = 3; |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack1, |
- kMediaStream1, num_sim_layers, &opts); |
+ opts.AddSendVideoStream(kVideoTrack1, kMediaStream1, num_sim_layers); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
@@ -1830,39 +1718,22 @@ |
// adding a new video track and removes one of the audio tracks. |
TEST_F(MediaSessionDescriptionFactoryTest, TestCreateMultiStreamVideoAnswer) { |
MediaSessionOptions offer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &offer_opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &offer_opts); |
+ offer_opts.recv_video = true; |
offer_opts.data_channel_type = cricket::DCT_RTP; |
- AddMediaSection(MEDIA_TYPE_DATA, "data", cricket::MD_RECVONLY, kActive, |
- &offer_opts); |
f1_.set_secure(SEC_ENABLED); |
f2_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(offer_opts, NULL)); |
- MediaSessionOptions answer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_SENDRECV, kActive, |
- &answer_opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive, |
- &answer_opts); |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack1, |
- kMediaStream1, 1, &answer_opts); |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1, |
- kMediaStream1, 1, &answer_opts); |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack2, |
- kMediaStream1, 1, &answer_opts); |
- |
- AddMediaSection(MEDIA_TYPE_DATA, "data", cricket::MD_SENDRECV, kActive, |
- &answer_opts); |
- AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack1, |
- kMediaStream1, 1, &answer_opts); |
- AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack2, |
- kMediaStream1, 1, &answer_opts); |
- answer_opts.data_channel_type = cricket::DCT_RTP; |
- |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), answer_opts, NULL)); |
+ MediaSessionOptions opts; |
+ opts.AddSendStream(MEDIA_TYPE_VIDEO, kVideoTrack1, kMediaStream1); |
+ opts.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack1, kMediaStream1); |
+ opts.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack2, kMediaStream1); |
+ opts.data_channel_type = cricket::DCT_RTP; |
+ opts.AddSendStream(MEDIA_TYPE_DATA, kDataTrack1, kMediaStream1); |
+ opts.AddSendStream(MEDIA_TYPE_DATA, kDataTrack2, kMediaStream1); |
+ |
+ std::unique_ptr<SessionDescription> answer( |
+ f2_.CreateAnswer(offer.get(), opts, NULL)); |
ASSERT_TRUE(answer.get() != NULL); |
const ContentInfo* ac = answer->GetContentByName("audio"); |
@@ -1926,12 +1797,11 @@ |
// Update the answer. Add a new video track that is not synched to the |
// other tracks and remove 1 audio track. |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack2, |
- kMediaStream2, 1, &answer_opts); |
- DetachSenderFromMediaSection("audio", kAudioTrack2, &answer_opts); |
- DetachSenderFromMediaSection("data", kDataTrack2, &answer_opts); |
+ opts.AddSendStream(MEDIA_TYPE_VIDEO, kVideoTrack2, kMediaStream2); |
+ opts.RemoveSendStream(MEDIA_TYPE_AUDIO, kAudioTrack2); |
+ opts.RemoveSendStream(MEDIA_TYPE_DATA, kDataTrack2); |
std::unique_ptr<SessionDescription> updated_answer( |
- f2_.CreateAnswer(offer.get(), answer_opts, answer.get())); |
+ f2_.CreateAnswer(offer.get(), opts, answer.get())); |
ASSERT_TRUE(updated_answer.get() != NULL); |
ac = updated_answer->GetContentByName("audio"); |
@@ -1983,7 +1853,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
RespondentCreatesOfferAfterCreatingAnswer) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_audio = true; |
+ opts.recv_video = true; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
std::unique_ptr<SessionDescription> answer( |
@@ -2034,8 +1905,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
RespondentCreatesOfferAfterCreatingAnswerWithRtx) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = false; |
std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); |
// This creates rtx for H264 with the payload type |f1_| uses. |
AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); |
@@ -2087,8 +1958,8 @@ |
f1_.set_video_codecs(f1_codecs); |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_audio = true; |
+ opts.recv_video = false; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); |
std::unique_ptr<SessionDescription> answer( |
@@ -2101,8 +1972,8 @@ |
// Now - let |f2_| add video with RTX and let the payload type the RTX codec |
// reference be the same as an audio codec that was negotiated in the |
// first offer/answer exchange. |
- opts.media_description_options.clear(); |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_audio = true; |
+ opts.recv_video = true; |
std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); |
int used_pl_type = acd->codecs()[0].id; |
@@ -2139,7 +2010,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
RespondentCreatesOfferWithRtxAfterCreatingAnswerWithoutRtx) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = true; |
std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2); |
// This creates rtx for H264 with the payload type |f2_| uses. |
@@ -2177,8 +2049,8 @@ |
// Test that RTX is ignored when there is no associated payload type parameter. |
TEST_F(MediaSessionDescriptionFactoryTest, RtxWithoutApt) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = false; |
std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); |
// This creates RTX without associated payload type parameter. |
AddRtxCodec(VideoCodec(126, cricket::kRtxCodecName), &f1_codecs); |
@@ -2221,8 +2093,8 @@ |
// type doesn't match the local value. |
TEST_F(MediaSessionDescriptionFactoryTest, FilterOutRtxIfAptDoesntMatch) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = false; |
std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); |
// This creates RTX for H264 in sender. |
AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); |
@@ -2251,8 +2123,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
FilterOutUnsupportedRtxWhenCreatingAnswer) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = false; |
std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); |
// This creates RTX for H264-SVC in sender. |
AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id), &f1_codecs); |
@@ -2286,8 +2158,8 @@ |
// to add another. |
TEST_F(MediaSessionDescriptionFactoryTest, AddSecondRtxInNewOffer) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive, |
- &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = false; |
std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1); |
// This creates RTX for H264 for the offerer. |
AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs); |
@@ -2321,11 +2193,11 @@ |
// generated for each simulcast ssrc and correctly grouped. |
TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateMultipleRtxSsrcs) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive, |
- &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = false; |
+ |
// Add simulcast streams. |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, "stream1", |
- "stream1label", 3, &opts); |
+ opts.AddSendVideoStream("stream1", "stream1label", 3); |
// Use a single real codec, and then add RTX for it. |
std::vector<VideoCodec> f1_codecs; |
@@ -2362,11 +2234,11 @@ |
// together with a FEC-FR grouping. |
TEST_F(MediaSessionDescriptionFactoryTest, GenerateFlexfecSsrc) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive, |
- &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = false; |
+ |
// Add single stream. |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, "stream1", |
- "stream1label", 1, &opts); |
+ opts.AddSendVideoStream("stream1", "stream1label", 1); |
// Use a single real codec, and then add FlexFEC for it. |
std::vector<VideoCodec> f1_codecs; |
@@ -2402,11 +2274,11 @@ |
// multiple FlexfecSenders, or through multistream protection. |
TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateNoFlexfecSsrcs) { |
MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive, |
- &opts); |
+ opts.recv_video = true; |
+ opts.recv_audio = false; |
+ |
// Add simulcast streams. |
- AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, "stream1", |
- "stream1label", 3, &opts); |
+ opts.AddSendVideoStream("stream1", "stream1label", 3); |
// Use a single real codec, and then add FlexFEC for it. |
std::vector<VideoCodec> f1_codecs; |
@@ -2446,7 +2318,8 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
RespondentCreatesOfferAfterCreatingAnswerWithRtpExtensions) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_audio = true; |
+ opts.recv_video = true; |
f1_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension1)); |
f1_.set_video_rtp_header_extensions(MAKE_VECTOR(kVideoRtpExtension1)); |
@@ -2500,7 +2373,8 @@ |
// updated offer (this was previously a bug). |
TEST_F(MediaSessionDescriptionFactoryTest, RtpExtensionIdReused) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_audio = true; |
+ opts.recv_video = true; |
f1_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension3)); |
f1_.set_video_rtp_header_extensions(MAKE_VECTOR(kVideoRtpExtension3)); |
@@ -2535,7 +2409,8 @@ |
// Same as "RtpExtensionIdReused" above for encrypted RTP extensions. |
TEST_F(MediaSessionDescriptionFactoryTest, RtpExtensionIdReusedEncrypted) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_audio = true; |
+ opts.recv_video = true; |
f1_.set_enable_encrypted_rtp_header_extensions(true); |
f2_.set_enable_encrypted_rtp_header_extensions(true); |
@@ -2611,47 +2486,45 @@ |
// ensure the TransportInfo in the SessionDescription matches what we expect. |
TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoOfferAudio) { |
MediaSessionOptions options; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &options); |
+ options.recv_audio = true; |
TestTransportInfo(true, options, false); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestTransportInfoOfferIceRenomination) { |
MediaSessionOptions options; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &options); |
- options.media_description_options[0] |
- .transport_options.enable_ice_renomination = true; |
+ options.enable_ice_renomination = true; |
TestTransportInfo(true, options, false); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoOfferAudioCurrent) { |
MediaSessionOptions options; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &options); |
+ options.recv_audio = true; |
TestTransportInfo(true, options, true); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoOfferMultimedia) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
TestTransportInfo(true, options, false); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestTransportInfoOfferMultimediaCurrent) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
TestTransportInfo(true, options, true); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoOfferBundle) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
options.bundle_enabled = true; |
TestTransportInfo(true, options, false); |
} |
@@ -2659,56 +2532,55 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestTransportInfoOfferBundleCurrent) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
options.bundle_enabled = true; |
TestTransportInfo(true, options, true); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoAnswerAudio) { |
MediaSessionOptions options; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &options); |
+ options.recv_audio = true; |
TestTransportInfo(false, options, false); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestTransportInfoAnswerIceRenomination) { |
MediaSessionOptions options; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &options); |
- options.media_description_options[0] |
- .transport_options.enable_ice_renomination = true; |
+ options.enable_ice_renomination = true; |
TestTransportInfo(false, options, false); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestTransportInfoAnswerAudioCurrent) { |
MediaSessionOptions options; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive, |
- &options); |
+ options.recv_audio = true; |
TestTransportInfo(false, options, true); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoAnswerMultimedia) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
TestTransportInfo(false, options, false); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestTransportInfoAnswerMultimediaCurrent) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
TestTransportInfo(false, options, true); |
} |
TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoAnswerBundle) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
options.bundle_enabled = true; |
TestTransportInfo(false, options, false); |
} |
@@ -2716,8 +2588,9 @@ |
TEST_F(MediaSessionDescriptionFactoryTest, |
TestTransportInfoAnswerBundleCurrent) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
options.bundle_enabled = true; |
TestTransportInfo(false, options, true); |
} |
@@ -2744,7 +2617,7 @@ |
tdf2_.set_secure(SEC_DISABLED); |
std::unique_ptr<SessionDescription> offer( |
- f1_.CreateOffer(CreatePlanBMediaSessionOptions(), NULL)); |
+ f1_.CreateOffer(MediaSessionOptions(), NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
ContentInfo* offer_content = offer->GetContentByName("audio"); |
ASSERT_TRUE(offer_content != NULL); |
@@ -2753,7 +2626,7 @@ |
offer_audio_desc->set_protocol(cricket::kMediaProtocolDtlsSavpf); |
std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), CreatePlanBMediaSessionOptions(), NULL)); |
+ f2_.CreateAnswer(offer.get(), MediaSessionOptions(), NULL)); |
ASSERT_TRUE(answer != NULL); |
ContentInfo* answer_content = answer->GetContentByName("audio"); |
ASSERT_TRUE(answer_content != NULL); |
@@ -2770,7 +2643,7 @@ |
tdf2_.set_secure(SEC_ENABLED); |
std::unique_ptr<SessionDescription> offer( |
- f1_.CreateOffer(CreatePlanBMediaSessionOptions(), NULL)); |
+ f1_.CreateOffer(MediaSessionOptions(), NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
ContentInfo* offer_content = offer->GetContentByName("audio"); |
ASSERT_TRUE(offer_content != NULL); |
@@ -2779,7 +2652,7 @@ |
offer_audio_desc->set_protocol(cricket::kMediaProtocolDtlsSavpf); |
std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), CreatePlanBMediaSessionOptions(), NULL)); |
+ f2_.CreateAnswer(offer.get(), MediaSessionOptions(), NULL)); |
ASSERT_TRUE(answer != NULL); |
const ContentInfo* answer_content = answer->GetContentByName("audio"); |
@@ -2800,7 +2673,8 @@ |
tdf1_.set_secure(SEC_ENABLED); |
tdf2_.set_secure(SEC_DISABLED); |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
std::unique_ptr<SessionDescription> offer, answer; |
const cricket::MediaContentDescription* audio_media_desc; |
const cricket::MediaContentDescription* video_media_desc; |
@@ -2896,7 +2770,7 @@ |
// Test that an answer can't be created if cryptos are required but the offer is |
// unsecure. |
TEST_F(MediaSessionDescriptionFactoryTest, TestSecureAnswerToUnsecureOffer) { |
- MediaSessionOptions options = CreatePlanBMediaSessionOptions(); |
+ MediaSessionOptions options; |
f1_.set_secure(SEC_DISABLED); |
tdf1_.set_secure(SEC_DISABLED); |
f2_.set_secure(SEC_REQUIRED); |
@@ -2917,8 +2791,9 @@ |
tdf1_.set_secure(SEC_ENABLED); |
tdf2_.set_secure(SEC_ENABLED); |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
- AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
+ options.data_channel_type = cricket::DCT_RTP; |
std::unique_ptr<SessionDescription> offer, answer; |
@@ -2965,7 +2840,8 @@ |
// offer or answer. |
TEST_F(MediaSessionDescriptionFactoryTest, TestVADEnableOption) { |
MediaSessionOptions options; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &options); |
+ options.recv_audio = true; |
+ options.recv_video = true; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(options, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
const ContentInfo* audio_content = offer->GetContentByName("audio"); |
@@ -2983,21 +2859,22 @@ |
EXPECT_TRUE(VerifyNoCNCodecs(audio_content)); |
} |
-// Test that the generated MIDs match the existing offer. |
-TEST_F(MediaSessionDescriptionFactoryTest, TestMIDsMatchesExistingOffer) { |
- MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio_modified", cricket::MD_RECVONLY, |
- kActive, &opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video_modified", cricket::MD_RECVONLY, |
- kActive, &opts); |
+// Test that the content name ("mid" in SDP) is unchanged when creating a |
+// new offer. |
+TEST_F(MediaSessionDescriptionFactoryTest, |
+ TestContentNameNotChangedInSubsequentOffers) { |
+ MediaSessionOptions opts; |
+ opts.recv_audio = true; |
+ opts.recv_video = true; |
opts.data_channel_type = cricket::DCT_SCTP; |
- AddMediaSection(MEDIA_TYPE_DATA, "data_modified", cricket::MD_SENDRECV, |
- kActive, &opts); |
- // Create offer. |
+ // Create offer and modify the default content names. |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
+ for (ContentInfo& content : offer->contents()) { |
+ content.name.append("_modified"); |
+ } |
+ |
std::unique_ptr<SessionDescription> updated_offer( |
f1_.CreateOffer(opts, offer.get())); |
- |
const ContentInfo* audio_content = GetFirstAudioContent(updated_offer.get()); |
const ContentInfo* video_content = GetFirstVideoContent(updated_offer.get()); |
const ContentInfo* data_content = GetFirstDataContent(updated_offer.get()); |
@@ -3007,340 +2884,6 @@ |
EXPECT_EQ("audio_modified", audio_content->name); |
EXPECT_EQ("video_modified", video_content->name); |
EXPECT_EQ("data_modified", data_content->name); |
-} |
- |
-// The following tests verify that the unified plan SDP is supported. |
-// Test that we can create an offer with multiple media sections of same media |
-// type. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- CreateOfferWithMultipleAVMediaSections) { |
- MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio_1", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AttachSenderToMediaSection("audio_1", MEDIA_TYPE_AUDIO, kAudioTrack1, |
- kMediaStream1, 1, &opts); |
- |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video_1", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AttachSenderToMediaSection("video_1", MEDIA_TYPE_VIDEO, kVideoTrack1, |
- kMediaStream1, 1, &opts); |
- |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio_2", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AttachSenderToMediaSection("audio_2", MEDIA_TYPE_AUDIO, kAudioTrack2, |
- kMediaStream2, 1, &opts); |
- |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video_2", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AttachSenderToMediaSection("video_2", MEDIA_TYPE_VIDEO, kVideoTrack2, |
- kMediaStream2, 1, &opts); |
- std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
- ASSERT_TRUE(offer); |
- |
- ASSERT_EQ(4u, offer->contents().size()); |
- EXPECT_FALSE(offer->contents()[0].rejected); |
- const AudioContentDescription* acd = |
- static_cast<const AudioContentDescription*>( |
- offer->contents()[0].description); |
- ASSERT_EQ(1u, acd->streams().size()); |
- EXPECT_EQ(kAudioTrack1, acd->streams()[0].id); |
- EXPECT_EQ(cricket::MD_SENDRECV, acd->direction()); |
- |
- EXPECT_FALSE(offer->contents()[1].rejected); |
- const VideoContentDescription* vcd = |
- static_cast<const VideoContentDescription*>( |
- offer->contents()[1].description); |
- ASSERT_EQ(1u, vcd->streams().size()); |
- EXPECT_EQ(kVideoTrack1, vcd->streams()[0].id); |
- EXPECT_EQ(cricket::MD_SENDRECV, vcd->direction()); |
- |
- EXPECT_FALSE(offer->contents()[2].rejected); |
- acd = static_cast<const AudioContentDescription*>( |
- offer->contents()[2].description); |
- ASSERT_EQ(1u, acd->streams().size()); |
- EXPECT_EQ(kAudioTrack2, acd->streams()[0].id); |
- EXPECT_EQ(cricket::MD_SENDRECV, acd->direction()); |
- |
- EXPECT_FALSE(offer->contents()[3].rejected); |
- vcd = static_cast<const VideoContentDescription*>( |
- offer->contents()[3].description); |
- ASSERT_EQ(1u, vcd->streams().size()); |
- EXPECT_EQ(kVideoTrack2, vcd->streams()[0].id); |
- EXPECT_EQ(cricket::MD_SENDRECV, vcd->direction()); |
-} |
- |
-// Test that we can create an answer with multiple media sections of same media |
-// type. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- CreateAnswerWithMultipleAVMediaSections) { |
- MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio_1", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AttachSenderToMediaSection("audio_1", MEDIA_TYPE_AUDIO, kAudioTrack1, |
- kMediaStream1, 1, &opts); |
- |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video_1", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AttachSenderToMediaSection("video_1", MEDIA_TYPE_VIDEO, kVideoTrack1, |
- kMediaStream1, 1, &opts); |
- |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio_2", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AttachSenderToMediaSection("audio_2", MEDIA_TYPE_AUDIO, kAudioTrack2, |
- kMediaStream2, 1, &opts); |
- |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video_2", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AttachSenderToMediaSection("video_2", MEDIA_TYPE_VIDEO, kVideoTrack2, |
- kMediaStream2, 1, &opts); |
- |
- std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
- ASSERT_TRUE(offer); |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), opts, nullptr)); |
- |
- ASSERT_EQ(4u, answer->contents().size()); |
- EXPECT_FALSE(answer->contents()[0].rejected); |
- const AudioContentDescription* acd = |
- static_cast<const AudioContentDescription*>( |
- answer->contents()[0].description); |
- ASSERT_EQ(1u, acd->streams().size()); |
- EXPECT_EQ(kAudioTrack1, acd->streams()[0].id); |
- EXPECT_EQ(cricket::MD_SENDRECV, acd->direction()); |
- |
- EXPECT_FALSE(answer->contents()[1].rejected); |
- const VideoContentDescription* vcd = |
- static_cast<const VideoContentDescription*>( |
- answer->contents()[1].description); |
- ASSERT_EQ(1u, vcd->streams().size()); |
- EXPECT_EQ(kVideoTrack1, vcd->streams()[0].id); |
- EXPECT_EQ(cricket::MD_SENDRECV, vcd->direction()); |
- |
- EXPECT_FALSE(answer->contents()[2].rejected); |
- acd = static_cast<const AudioContentDescription*>( |
- answer->contents()[2].description); |
- ASSERT_EQ(1u, acd->streams().size()); |
- EXPECT_EQ(kAudioTrack2, acd->streams()[0].id); |
- EXPECT_EQ(cricket::MD_SENDRECV, acd->direction()); |
- |
- EXPECT_FALSE(answer->contents()[3].rejected); |
- vcd = static_cast<const VideoContentDescription*>( |
- answer->contents()[3].description); |
- ASSERT_EQ(1u, vcd->streams().size()); |
- EXPECT_EQ(kVideoTrack2, vcd->streams()[0].id); |
- EXPECT_EQ(cricket::MD_SENDRECV, vcd->direction()); |
-} |
- |
-// Test that the media section will be rejected in offer if the corresponding |
-// MediaDescriptionOptions is stopped by the offerer. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- CreateOfferWithMediaSectionStoppedByOfferer) { |
- // Create an offer with two audio sections and one of them is stopped. |
- MediaSessionOptions offer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive, |
- &offer_opts); |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_INACTIVE, kStopped, |
- &offer_opts); |
- std::unique_ptr<SessionDescription> offer( |
- f1_.CreateOffer(offer_opts, nullptr)); |
- ASSERT_TRUE(offer); |
- ASSERT_EQ(2u, offer->contents().size()); |
- EXPECT_FALSE(offer->contents()[0].rejected); |
- EXPECT_TRUE(offer->contents()[1].rejected); |
-} |
- |
-// Test that the media section will be rejected in answer if the corresponding |
-// MediaDescriptionOptions is stopped by the offerer. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- CreateAnswerWithMediaSectionStoppedByOfferer) { |
- // Create an offer with two audio sections and one of them is stopped. |
- MediaSessionOptions offer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive, |
- &offer_opts); |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_INACTIVE, kStopped, |
- &offer_opts); |
- std::unique_ptr<SessionDescription> offer( |
- f1_.CreateOffer(offer_opts, nullptr)); |
- ASSERT_TRUE(offer); |
- ASSERT_EQ(2u, offer->contents().size()); |
- EXPECT_FALSE(offer->contents()[0].rejected); |
- EXPECT_TRUE(offer->contents()[1].rejected); |
- |
- // Create an answer based on the offer. |
- MediaSessionOptions answer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive, |
- &answer_opts); |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_SENDRECV, kActive, |
- &answer_opts); |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), answer_opts, nullptr)); |
- ASSERT_EQ(2u, answer->contents().size()); |
- EXPECT_FALSE(answer->contents()[0].rejected); |
- EXPECT_TRUE(answer->contents()[1].rejected); |
-} |
- |
-// Test that the media section will be rejected in answer if the corresponding |
-// MediaDescriptionOptions is stopped by the answerer. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- CreateAnswerWithMediaSectionRejectedByAnswerer) { |
- // Create an offer with two audio sections. |
- MediaSessionOptions offer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive, |
- &offer_opts); |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_SENDRECV, kActive, |
- &offer_opts); |
- std::unique_ptr<SessionDescription> offer( |
- f1_.CreateOffer(offer_opts, nullptr)); |
- ASSERT_TRUE(offer); |
- ASSERT_EQ(2u, offer->contents().size()); |
- ASSERT_FALSE(offer->contents()[0].rejected); |
- ASSERT_FALSE(offer->contents()[1].rejected); |
- |
- // The answerer rejects one of the audio sections. |
- MediaSessionOptions answer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive, |
- &answer_opts); |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_INACTIVE, kStopped, |
- &answer_opts); |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), answer_opts, nullptr)); |
- ASSERT_EQ(2u, answer->contents().size()); |
- EXPECT_FALSE(answer->contents()[0].rejected); |
- EXPECT_TRUE(answer->contents()[1].rejected); |
-} |
- |
-// Test the generated media sections has the same order of the |
-// corresponding MediaDescriptionOptions. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- CreateOfferRespectsMediaDescriptionOptionsOrder) { |
- MediaSessionOptions opts; |
- // This tests put video section first because normally audio comes first by |
- // default. |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_SENDRECV, kActive, |
- &opts); |
- std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
- |
- ASSERT_TRUE(offer); |
- ASSERT_EQ(2u, offer->contents().size()); |
- EXPECT_EQ("video", offer->contents()[0].name); |
- EXPECT_EQ("audio", offer->contents()[1].name); |
-} |
- |
-// Test that different media sections using the same codec have same payload |
-// type. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- PayloadTypesSharedByMediaSectionsOfSameType) { |
- MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video1", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video2", cricket::MD_SENDRECV, kActive, |
- &opts); |
- // Create an offer with two video sections using same codecs. |
- std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
- ASSERT_TRUE(offer); |
- ASSERT_EQ(2u, offer->contents().size()); |
- const VideoContentDescription* vcd1 = |
- static_cast<const VideoContentDescription*>( |
- offer->contents()[0].description); |
- const VideoContentDescription* vcd2 = |
- static_cast<const VideoContentDescription*>( |
- offer->contents()[1].description); |
- EXPECT_EQ(vcd1->codecs().size(), vcd2->codecs().size()); |
- ASSERT_EQ(2u, vcd1->codecs().size()); |
- EXPECT_EQ(vcd1->codecs()[0].name, vcd2->codecs()[0].name); |
- EXPECT_EQ(vcd1->codecs()[0].id, vcd2->codecs()[0].id); |
- EXPECT_EQ(vcd1->codecs()[1].name, vcd2->codecs()[1].name); |
- EXPECT_EQ(vcd1->codecs()[1].id, vcd2->codecs()[1].id); |
- |
- // Create answer and negotiate the codecs. |
- std::unique_ptr<SessionDescription> answer( |
- f2_.CreateAnswer(offer.get(), opts, nullptr)); |
- ASSERT_TRUE(answer); |
- ASSERT_EQ(2u, answer->contents().size()); |
- vcd1 = static_cast<const VideoContentDescription*>( |
- answer->contents()[0].description); |
- vcd2 = static_cast<const VideoContentDescription*>( |
- answer->contents()[1].description); |
- EXPECT_EQ(vcd1->codecs().size(), vcd2->codecs().size()); |
- ASSERT_EQ(1u, vcd1->codecs().size()); |
- EXPECT_EQ(vcd1->codecs()[0].name, vcd2->codecs()[0].name); |
- EXPECT_EQ(vcd1->codecs()[0].id, vcd2->codecs()[0].id); |
-} |
- |
-// Test that the codec preference order per media section is respected in |
-// subsequent offer. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- CreateOfferRespectsCodecPreferenceOrder) { |
- MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video1", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video2", cricket::MD_SENDRECV, kActive, |
- &opts); |
- // Create an offer with two video sections using same codecs. |
- std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
- ASSERT_TRUE(offer); |
- ASSERT_EQ(2u, offer->contents().size()); |
- VideoContentDescription* vcd1 = |
- static_cast<VideoContentDescription*>(offer->contents()[0].description); |
- const VideoContentDescription* vcd2 = |
- static_cast<const VideoContentDescription*>( |
- offer->contents()[1].description); |
- auto video_codecs = MAKE_VECTOR(kVideoCodecs1); |
- EXPECT_EQ(video_codecs, vcd1->codecs()); |
- EXPECT_EQ(video_codecs, vcd2->codecs()); |
- |
- // Change the codec preference of the first video section and create a |
- // follow-up offer. |
- auto video_codecs_reverse = MAKE_VECTOR(kVideoCodecs1Reverse); |
- vcd1->set_codecs(video_codecs_reverse); |
- std::unique_ptr<SessionDescription> updated_offer( |
- f1_.CreateOffer(opts, offer.get())); |
- vcd1 = static_cast<VideoContentDescription*>( |
- updated_offer->contents()[0].description); |
- vcd2 = static_cast<const VideoContentDescription*>( |
- updated_offer->contents()[1].description); |
- // The video codec preference order should be respected. |
- EXPECT_EQ(video_codecs_reverse, vcd1->codecs()); |
- EXPECT_EQ(video_codecs, vcd2->codecs()); |
-} |
- |
-// Test that the codec preference order per media section is respected in |
-// the answer. |
-TEST_F(MediaSessionDescriptionFactoryTest, |
- CreateAnswerRespectsCodecPreferenceOrder) { |
- MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video1", cricket::MD_SENDRECV, kActive, |
- &opts); |
- AddMediaSection(MEDIA_TYPE_VIDEO, "video2", cricket::MD_SENDRECV, kActive, |
- &opts); |
- // Create an offer with two video sections using same codecs. |
- std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
- ASSERT_TRUE(offer); |
- ASSERT_EQ(2u, offer->contents().size()); |
- VideoContentDescription* vcd1 = |
- static_cast<VideoContentDescription*>(offer->contents()[0].description); |
- const VideoContentDescription* vcd2 = |
- static_cast<const VideoContentDescription*>( |
- offer->contents()[1].description); |
- auto video_codecs = MAKE_VECTOR(kVideoCodecs1); |
- EXPECT_EQ(video_codecs, vcd1->codecs()); |
- EXPECT_EQ(video_codecs, vcd2->codecs()); |
- |
- // Change the codec preference of the first video section and create an |
- // answer. |
- auto video_codecs_reverse = MAKE_VECTOR(kVideoCodecs1Reverse); |
- vcd1->set_codecs(video_codecs_reverse); |
- std::unique_ptr<SessionDescription> answer( |
- f1_.CreateAnswer(offer.get(), opts, nullptr)); |
- vcd1 = |
- static_cast<VideoContentDescription*>(answer->contents()[0].description); |
- vcd2 = static_cast<const VideoContentDescription*>( |
- answer->contents()[1].description); |
- // The video codec preference order should be respected. |
- EXPECT_EQ(video_codecs_reverse, vcd1->codecs()); |
- EXPECT_EQ(video_codecs, vcd2->codecs()); |
} |
class MediaProtocolTest : public ::testing::TestWithParam<const char*> { |
@@ -3373,7 +2916,7 @@ |
TEST_P(MediaProtocolTest, TestAudioVideoAcceptance) { |
MediaSessionOptions opts; |
- AddAudioVideoSections(cricket::MD_RECVONLY, &opts); |
+ opts.recv_video = true; |
std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr)); |
ASSERT_TRUE(offer.get() != nullptr); |
// Set the protocol for all the contents. |
@@ -3433,47 +2976,32 @@ |
// Test proper merge |
sf.set_audio_codecs(send_codecs, recv_codecs); |
- EXPECT_EQ(send_codecs, sf.audio_send_codecs()); |
- EXPECT_EQ(recv_codecs, sf.audio_recv_codecs()); |
- EXPECT_EQ(sendrecv_codecs, sf.audio_sendrecv_codecs()); |
+ EXPECT_TRUE(sf.audio_send_codecs() == send_codecs); |
+ EXPECT_TRUE(sf.audio_recv_codecs() == recv_codecs); |
+ EXPECT_TRUE(sf.audio_sendrecv_codecs() == sendrecv_codecs); |
// Test empty send codecs list |
sf.set_audio_codecs(no_codecs, recv_codecs); |
- EXPECT_EQ(no_codecs, sf.audio_send_codecs()); |
- EXPECT_EQ(recv_codecs, sf.audio_recv_codecs()); |
- EXPECT_EQ(no_codecs, sf.audio_sendrecv_codecs()); |
+ EXPECT_TRUE(sf.audio_send_codecs() == no_codecs); |
+ EXPECT_TRUE(sf.audio_recv_codecs() == recv_codecs); |
+ EXPECT_TRUE(sf.audio_sendrecv_codecs() == no_codecs); |
// Test empty recv codecs list |
sf.set_audio_codecs(send_codecs, no_codecs); |
- EXPECT_EQ(send_codecs, sf.audio_send_codecs()); |
- EXPECT_EQ(no_codecs, sf.audio_recv_codecs()); |
- EXPECT_EQ(no_codecs, sf.audio_sendrecv_codecs()); |
+ EXPECT_TRUE(sf.audio_send_codecs() == send_codecs); |
+ EXPECT_TRUE(sf.audio_recv_codecs() == no_codecs); |
+ EXPECT_TRUE(sf.audio_sendrecv_codecs() == no_codecs); |
// Test all empty codec lists |
sf.set_audio_codecs(no_codecs, no_codecs); |
- EXPECT_EQ(no_codecs, sf.audio_send_codecs()); |
- EXPECT_EQ(no_codecs, sf.audio_recv_codecs()); |
- EXPECT_EQ(no_codecs, sf.audio_sendrecv_codecs()); |
+ EXPECT_TRUE(sf.audio_send_codecs() == no_codecs); |
+ EXPECT_TRUE(sf.audio_recv_codecs() == no_codecs); |
+ EXPECT_TRUE(sf.audio_sendrecv_codecs() == no_codecs); |
} |
namespace { |
-// Compare the two vectors of codecs ignoring the payload type. |
-template <class Codec> |
-bool CodecsMatch(const std::vector<Codec>& codecs1, |
- const std::vector<Codec>& codecs2) { |
- if (codecs1.size() != codecs2.size()) { |
- return false; |
- } |
- |
- for (size_t i = 0; i < codecs1.size(); ++i) { |
- if (!codecs1[i].Matches(codecs2[i])) { |
- return false; |
- } |
- } |
- return true; |
-} |
- |
-void TestAudioCodecsOffer(MediaContentDirection direction) { |
+void TestAudioCodecsOffer(MediaContentDirection direction, |
+ bool add_legacy_stream) { |
TransportDescriptionFactory tdf; |
MediaSessionDescriptionFactory sf(&tdf); |
const std::vector<AudioCodec> send_codecs = MAKE_VECTOR(kAudioCodecs1); |
@@ -3481,56 +3009,57 @@ |
const std::vector<AudioCodec> sendrecv_codecs = |
MAKE_VECTOR(kAudioCodecsAnswer); |
sf.set_audio_codecs(send_codecs, recv_codecs); |
- |
- MediaSessionOptions opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", direction, kActive, &opts); |
- |
- if (RtpTransceiverDirection::FromMediaContentDirection(direction).send) { |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1, |
- kMediaStream1, 1, &opts); |
- } |
+ sf.set_add_legacy_streams(add_legacy_stream); |
+ |
+ MediaSessionOptions opts; |
+ opts.recv_audio = (direction == cricket::MD_RECVONLY || |
+ direction == cricket::MD_SENDRECV); |
+ opts.recv_video = false; |
+ if (direction == cricket::MD_SENDONLY || direction == cricket::MD_SENDRECV) |
+ opts.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack1, kMediaStream1); |
std::unique_ptr<SessionDescription> offer(sf.CreateOffer(opts, NULL)); |
ASSERT_TRUE(offer.get() != NULL); |
const ContentInfo* ac = offer->GetContentByName("audio"); |
// If the factory didn't add any audio content to the offer, we cannot check |
- // that the codecs put in are right. This happens when we neither want to |
- // send nor receive audio. The checks are still in place if at some point |
- // we'd instead create an inactive stream. |
+ // that the codecs put in are right. This happens when we neither want to send |
+ // nor receive audio. The checks are still in place if at some point we'd |
+ // instead create an inactive stream. |
if (ac) { |
AudioContentDescription* acd = |
static_cast<AudioContentDescription*>(ac->description); |
- // sendrecv and inactive should both present lists as if the channel was |
- // to be used for sending and receiving. Inactive essentially means it |
- // might eventually be used anything, but we don't know more at this |
- // moment. |
+ // sendrecv and inactive should both present lists as if the channel was to |
+ // be used for sending and receiving. Inactive essentially means it might |
+ // eventually be used anything, but we don't know more at this moment. |
if (acd->direction() == cricket::MD_SENDONLY) { |
- EXPECT_TRUE(CodecsMatch<AudioCodec>(send_codecs, acd->codecs())); |
+ EXPECT_TRUE(acd->codecs() == send_codecs); |
} else if (acd->direction() == cricket::MD_RECVONLY) { |
- EXPECT_TRUE(CodecsMatch<AudioCodec>(recv_codecs, acd->codecs())); |
+ EXPECT_TRUE(acd->codecs() == recv_codecs); |
} else { |
- EXPECT_TRUE(CodecsMatch<AudioCodec>(sendrecv_codecs, acd->codecs())); |
+ EXPECT_TRUE(acd->codecs() == sendrecv_codecs); |
} |
} |
} |
static const AudioCodec kOfferAnswerCodecs[] = { |
- AudioCodec(0, "codec0", 16000, -1, 1), |
- AudioCodec(1, "codec1", 8000, 13300, 1), |
- AudioCodec(2, "codec2", 8000, 64000, 1), |
- AudioCodec(3, "codec3", 8000, 64000, 1), |
- AudioCodec(4, "codec4", 8000, 0, 2), |
- AudioCodec(5, "codec5", 32000, 0, 1), |
- AudioCodec(6, "codec6", 48000, 0, 1)}; |
- |
-/* The codecs groups below are chosen as per the matrix below. The objective |
- * is to have different sets of codecs in the inputs, to get unique sets of |
- * codecs after negotiation, depending on offer and answer communication |
- * directions. One-way directions in the offer should either result in the |
- * opposite direction in the answer, or an inactive answer. Regardless, the |
- * choice of codecs should be as if the answer contained the opposite |
- * direction. Inactive offers should be treated as sendrecv/sendrecv. |
+ AudioCodec(0, "codec0", 16000, -1, 1), |
+ AudioCodec(1, "codec1", 8000, 13300, 1), |
+ AudioCodec(2, "codec2", 8000, 64000, 1), |
+ AudioCodec(3, "codec3", 8000, 64000, 1), |
+ AudioCodec(4, "codec4", 8000, 0, 2), |
+ AudioCodec(5, "codec5", 32000, 0, 1), |
+ AudioCodec(6, "codec6", 48000, 0, 1) |
+}; |
+ |
+ |
+/* The codecs groups below are chosen as per the matrix below. The objective is |
+ * to have different sets of codecs in the inputs, to get unique sets of codecs |
+ * after negotiation, depending on offer and answer communication directions. |
+ * One-way directions in the offer should either result in the opposite |
+ * direction in the answer, or an inactive answer. Regardless, the choice of |
+ * codecs should be as if the answer contained the opposite direction. |
+ * Inactive offers should be treated as sendrecv/sendrecv. |
* |
* | Offer | Answer | Result |
* codec|send recv sr | send recv sr | s/r r/s sr/s sr/r sr/sr |
@@ -3543,18 +3072,18 @@ |
* 6 | x x x | x x x | x x x x x |
*/ |
// Codecs used by offerer in the AudioCodecsAnswerTest |
-static const int kOfferSendCodecs[] = {0, 1, 3, 5, 6}; |
-static const int kOfferRecvCodecs[] = {1, 2, 3, 4, 6}; |
+static const int kOfferSendCodecs[] = { 0, 1, 3, 5, 6 }; |
+static const int kOfferRecvCodecs[] = { 1, 2, 3, 4, 6 }; |
// Codecs used in the answerer in the AudioCodecsAnswerTest. The order is |
// jumbled to catch the answer not following the order in the offer. |
-static const int kAnswerSendCodecs[] = {6, 5, 2, 3, 4}; |
-static const int kAnswerRecvCodecs[] = {6, 5, 4, 1, 0}; |
+static const int kAnswerSendCodecs[] = { 6, 5, 2, 3, 4 }; |
+static const int kAnswerRecvCodecs[] = { 6, 5, 4, 1, 0 }; |
// The resulting sets of codecs in the answer in the AudioCodecsAnswerTest |
-static const int kResultSend_RecvCodecs[] = {0, 1, 5, 6}; |
-static const int kResultRecv_SendCodecs[] = {2, 3, 4, 6}; |
-static const int kResultSendrecv_SendCodecs[] = {3, 6}; |
-static const int kResultSendrecv_RecvCodecs[] = {1, 6}; |
-static const int kResultSendrecv_SendrecvCodecs[] = {6}; |
+static const int kResultSend_RecvCodecs[] = { 0, 1, 5, 6 }; |
+static const int kResultRecv_SendCodecs[] = { 2, 3, 4, 6 }; |
+static const int kResultSendrecv_SendCodecs[] = { 3, 6 }; |
+static const int kResultSendrecv_RecvCodecs[] = { 1, 6 }; |
+static const int kResultSendrecv_SendrecvCodecs[] = { 6 }; |
template <typename T, int IDXS> |
std::vector<T> VectorFromIndices(const T* array, const int (&indices)[IDXS]) { |
@@ -3580,14 +3109,17 @@ |
VectorFromIndices(kOfferAnswerCodecs, kAnswerSendCodecs), |
VectorFromIndices(kOfferAnswerCodecs, kAnswerRecvCodecs)); |
+ // Never add a legacy stream to offer - we want to control the offer |
+ // parameters exactly. |
+ offer_factory.set_add_legacy_streams(false); |
+ answer_factory.set_add_legacy_streams(add_legacy_stream); |
MediaSessionOptions offer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", offer_direction, kActive, |
- &offer_opts); |
- |
- if (RtpTransceiverDirection::FromMediaContentDirection(offer_direction) |
- .send) { |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1, |
- kMediaStream1, 1, &offer_opts); |
+ offer_opts.recv_audio = (offer_direction == cricket::MD_RECVONLY || |
+ offer_direction == cricket::MD_SENDRECV); |
+ offer_opts.recv_video = false; |
+ if (offer_direction == cricket::MD_SENDONLY || |
+ offer_direction == cricket::MD_SENDRECV) { |
+ offer_opts.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack1, kMediaStream1); |
} |
std::unique_ptr<SessionDescription> offer( |
@@ -3595,26 +3127,26 @@ |
ASSERT_TRUE(offer.get() != NULL); |
MediaSessionOptions answer_opts; |
- AddMediaSection(MEDIA_TYPE_AUDIO, "audio", answer_direction, kActive, |
- &answer_opts); |
- |
- if (RtpTransceiverDirection::FromMediaContentDirection(answer_direction) |
- .send) { |
- AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1, |
- kMediaStream1, 1, &answer_opts); |
+ answer_opts.recv_audio = (answer_direction == cricket::MD_RECVONLY || |
+ answer_direction == cricket::MD_SENDRECV); |
+ answer_opts.recv_video = false; |
+ if (answer_direction == cricket::MD_SENDONLY || |
+ answer_direction == cricket::MD_SENDRECV) { |
+ answer_opts.AddSendStream(MEDIA_TYPE_AUDIO, kAudioTrack1, kMediaStream1); |
} |
std::unique_ptr<SessionDescription> answer( |
answer_factory.CreateAnswer(offer.get(), answer_opts, NULL)); |
const ContentInfo* ac = answer->GetContentByName("audio"); |
- // If the factory didn't add any audio content to the answer, we cannot |
- // check that the codecs put in are right. This happens when we neither want |
- // to send nor receive audio. The checks are still in place if at some point |
- // we'd instead create an inactive stream. |
+ // If the factory didn't add any audio content to the answer, we cannot check |
+ // that the codecs put in are right. This happens when we neither want to send |
+ // nor receive audio. The checks are still in place if at some point we'd |
+ // instead create an inactive stream. |
if (ac) { |
const AudioContentDescription* acd = |
static_cast<const AudioContentDescription*>(ac->description); |
EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); |
+ |
std::vector<AudioCodec> target_codecs; |
// For offers with sendrecv or inactive, we should never reply with more |
@@ -3625,20 +3157,20 @@ |
kResultSendrecv_SendrecvCodecs); |
break; |
case cricket::MD_SENDONLY: |
- target_codecs = |
- VectorFromIndices(kOfferAnswerCodecs, kResultSend_RecvCodecs); |
+ target_codecs = VectorFromIndices(kOfferAnswerCodecs, |
+ kResultSend_RecvCodecs); |
break; |
case cricket::MD_RECVONLY: |
- target_codecs = |
- VectorFromIndices(kOfferAnswerCodecs, kResultRecv_SendCodecs); |
+ target_codecs = VectorFromIndices(kOfferAnswerCodecs, |
+ kResultRecv_SendCodecs); |
break; |
case cricket::MD_SENDRECV: |
if (acd->direction() == cricket::MD_SENDONLY) { |
- target_codecs = |
- VectorFromIndices(kOfferAnswerCodecs, kResultSendrecv_SendCodecs); |
+ target_codecs = VectorFromIndices(kOfferAnswerCodecs, |
+ kResultSendrecv_SendCodecs); |
} else if (acd->direction() == cricket::MD_RECVONLY) { |
- target_codecs = |
- VectorFromIndices(kOfferAnswerCodecs, kResultSendrecv_RecvCodecs); |
+ target_codecs = VectorFromIndices(kOfferAnswerCodecs, |
+ kResultSendrecv_RecvCodecs); |
} else { |
target_codecs = VectorFromIndices(kOfferAnswerCodecs, |
kResultSendrecv_SendrecvCodecs); |
@@ -3646,7 +3178,7 @@ |
break; |
} |
- auto format_codecs = [](const std::vector<AudioCodec>& codecs) { |
+ auto format_codecs = [] (const std::vector<AudioCodec>& codecs) { |
std::stringstream os; |
bool first = true; |
os << "{"; |
@@ -3667,31 +3199,36 @@ |
<< "; got: " << MediaContentDirectionToString(acd->direction()); |
} else { |
EXPECT_EQ(offer_direction, cricket::MD_INACTIVE) |
- << "Only inactive offers are allowed to not generate any audio " |
- "content"; |
+ << "Only inactive offers are allowed to not generate any audio content"; |
} |
} |
} // namespace |
class AudioCodecsOfferTest |
- : public ::testing::TestWithParam<MediaContentDirection> {}; |
+ : public ::testing::TestWithParam<::testing::tuple<MediaContentDirection, |
+ bool>> { |
+}; |
TEST_P(AudioCodecsOfferTest, TestCodecsInOffer) { |
- TestAudioCodecsOffer(GetParam()); |
+ TestAudioCodecsOffer(::testing::get<0>(GetParam()), |
+ ::testing::get<1>(GetParam())); |
} |
INSTANTIATE_TEST_CASE_P(MediaSessionDescriptionFactoryTest, |
AudioCodecsOfferTest, |
- ::testing::Values(cricket::MD_SENDONLY, |
- cricket::MD_RECVONLY, |
- cricket::MD_SENDRECV, |
- cricket::MD_INACTIVE)); |
+ ::testing::Combine( |
+ ::testing::Values(cricket::MD_SENDONLY, |
+ cricket::MD_RECVONLY, |
+ cricket::MD_SENDRECV, |
+ cricket::MD_INACTIVE), |
+ ::testing::Bool())); |
class AudioCodecsAnswerTest |
: public ::testing::TestWithParam<::testing::tuple<MediaContentDirection, |
MediaContentDirection, |
- bool>> {}; |
+ bool>> { |
+}; |
TEST_P(AudioCodecsAnswerTest, TestCodecsInAnswer) { |
TestAudioCodecsAnswer(::testing::get<0>(GetParam()), |
@@ -3699,15 +3236,15 @@ |
::testing::get<2>(GetParam())); |
} |
-INSTANTIATE_TEST_CASE_P( |
- MediaSessionDescriptionFactoryTest, |
- AudioCodecsAnswerTest, |
- ::testing::Combine(::testing::Values(cricket::MD_SENDONLY, |
- cricket::MD_RECVONLY, |
- cricket::MD_SENDRECV, |
- cricket::MD_INACTIVE), |
- ::testing::Values(cricket::MD_SENDONLY, |
- cricket::MD_RECVONLY, |
- cricket::MD_SENDRECV, |
- cricket::MD_INACTIVE), |
- ::testing::Bool())); |
+INSTANTIATE_TEST_CASE_P(MediaSessionDescriptionFactoryTest, |
+ AudioCodecsAnswerTest, |
+ ::testing::Combine( |
+ ::testing::Values(cricket::MD_SENDONLY, |
+ cricket::MD_RECVONLY, |
+ cricket::MD_SENDRECV, |
+ cricket::MD_INACTIVE), |
+ ::testing::Values(cricket::MD_SENDONLY, |
+ cricket::MD_RECVONLY, |
+ cricket::MD_SENDRECV, |
+ cricket::MD_INACTIVE), |
+ ::testing::Bool())); |