From ed6d555775d7d7be16ecda21601ce435c6991370 Mon Sep 17 00:00:00 2001 From: "wu@webrtc.org" Date: Mon, 3 Oct 2011 21:13:29 +0000 Subject: [PATCH] * Add the crypto serialize and deserialize. * Populate candidates test data. BUG= TEST= Review URL: http://webrtc-codereview.appspot.com/190004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@680 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../peerconnectionmessage_unittest.cc | 34 ++++++--- .../source/talk/app/webrtc_dev/webrtcjson.cc | 76 ++++++++++++++++--- 2 files changed, 90 insertions(+), 20 deletions(-) diff --git a/third_party_mods/libjingle/source/talk/app/webrtc_dev/peerconnectionmessage_unittest.cc b/third_party_mods/libjingle/source/talk/app/webrtc_dev/peerconnectionmessage_unittest.cc index f55566d9fc..3b5202cb87 100644 --- a/third_party_mods/libjingle/source/talk/app/webrtc_dev/peerconnectionmessage_unittest.cc +++ b/third_party_mods/libjingle/source/talk/app/webrtc_dev/peerconnectionmessage_unittest.cc @@ -67,6 +67,25 @@ class PeerConnectionMessageTest: public testing::Test { kVideoTrackLabel3, kStreamLabel2)); options_.is_video = true; + + int port = 1234; + talk_base::SocketAddress address("127.0.0.1", port++); + cricket::Candidate candidate1("video_rtcp", "udp", address, 1, + "user_video_rtcp", "password_video_rtcp", "local", "eth0", 0); + address.SetPort(port++); + cricket::Candidate candidate2("video_rtp", "udp", address, 1, + "user_video_rtp", "password_video_rtp", "local", "eth0", 0); + address.SetPort(port++); + cricket::Candidate candidate3("rtp", "udp", address, 1, + "user_rtp", "password_rtp", "local", "eth0", 0); + address.SetPort(port++); + cricket::Candidate candidate4("rtcp", "udp", address, 1, + "user_rtcp", "password_rtcp", "local", "eth0", 0); + + candidates_.push_back(candidate1); + candidates_.push_back(candidate2); + candidates_.push_back(candidate3); + candidates_.push_back(candidate4); } protected: @@ -74,15 +93,13 @@ class PeerConnectionMessageTest: public testing::Test { talk_base::scoped_ptr session_description_factory_; cricket::MediaSessionOptions options_; + cricket::Candidates candidates_; private: int ssrc_counter_; }; TEST_F(PeerConnectionMessageTest, Serialize) { - std::vector candidates; - // TODO(ronghuawu): Populate the test candidates. - std::string message; scoped_refptr pc_message; @@ -90,7 +107,7 @@ TEST_F(PeerConnectionMessageTest, Serialize) { talk_base::scoped_ptr offer( session_description_factory_->CreateOffer(options_)); pc_message = PeerConnectionMessage::Create(PeerConnectionMessage::kOffer, - offer.get(), candidates); + offer.get(), candidates_); EXPECT_TRUE(pc_message->Serialize(&message)); pc_message.release(); LOG(LS_INFO) << message; @@ -99,7 +116,7 @@ TEST_F(PeerConnectionMessageTest, Serialize) { talk_base::scoped_ptr answer( session_description_factory_->CreateAnswer(offer.get(), options_)); pc_message = PeerConnectionMessage::Create(PeerConnectionMessage::kAnswer, - answer.get(), candidates); + answer.get(), candidates_); EXPECT_TRUE(pc_message->Serialize(&message)); pc_message.release(); LOG(LS_INFO) << message; @@ -115,9 +132,6 @@ TEST_F(PeerConnectionMessageTest, Serialize) { } TEST_F(PeerConnectionMessageTest, Deserialize) { - std::vector candidates; - // TODO(ronghuawu): Populate the test candidates. - std::string message_ref; std::string message_result; scoped_refptr pc_message; @@ -126,7 +140,7 @@ TEST_F(PeerConnectionMessageTest, Deserialize) { talk_base::scoped_ptr offer( session_description_factory_->CreateOffer(options_)); pc_message = PeerConnectionMessage::Create(PeerConnectionMessage::kOffer, - offer.get(), candidates); + offer.get(), candidates_); EXPECT_TRUE(pc_message->Serialize(&message_ref)); pc_message.release(); LOG(LS_INFO) << "The reference message: " << message_ref; @@ -142,7 +156,7 @@ TEST_F(PeerConnectionMessageTest, Deserialize) { talk_base::scoped_ptr answer( session_description_factory_->CreateAnswer(offer.get(), options_)); pc_message = PeerConnectionMessage::Create(PeerConnectionMessage::kAnswer, - answer.get(), candidates); + answer.get(), candidates_); EXPECT_TRUE(pc_message->Serialize(&message_ref)); pc_message.release(); LOG(LS_INFO) << "The reference message: " << message_ref; diff --git a/third_party_mods/libjingle/source/talk/app/webrtc_dev/webrtcjson.cc b/third_party_mods/libjingle/source/talk/app/webrtc_dev/webrtcjson.cc index a4184b3237..bc8f3ff0bc 100644 --- a/third_party_mods/libjingle/source/talk/app/webrtc_dev/webrtcjson.cc +++ b/third_party_mods/libjingle/source/talk/app/webrtc_dev/webrtcjson.cc @@ -34,6 +34,7 @@ #include "talk/base/logging.h" #include "talk/base/stringutils.h" #include "talk/session/phone/codec.h" +#include "talk/session/phone/cryptoparams.h" #include "talk/session/phone/mediasession.h" #include "talk/session/phone/mediasessionclient.h" @@ -60,10 +61,14 @@ static bool BuildCandidate(const std::vector& candidates, bool video, std::vector* jcandidates); -static bool BuildRtpMapParams(const cricket::ContentInfo& audio_offer, +static bool BuildRtpMapParams(const cricket::ContentInfo& content_info, bool video, std::vector* rtpmap); +static void BuildCrypto(const cricket::ContentInfo& content_info, + bool video, + std::vector* cryptos); + static bool BuildTrack(const cricket::SessionDescription* sdp, bool video, std::vector* track); @@ -80,6 +85,9 @@ static bool ParseAudioCodec(const Json::Value& value, cricket::AudioContentDescription* content); static bool ParseVideoCodec(const Json::Value& value, cricket::VideoContentDescription* content); +static bool ParseCrypto(const Json::Value& content, + cricket::MediaContentDescription* desc); + static bool ParseCandidates(const Json::Value& content, std::vector* candidates); @@ -173,8 +181,8 @@ bool BuildContent( Append(content, "rtpmap", rtpmap); // crypto - Json::Value crypto; - // TODO(ronghuawu): BuildCrypto + std::vector crypto; + BuildCrypto(content_info, video, &crypto); Append(content, "crypto", crypto); // candidate @@ -194,14 +202,14 @@ bool BuildRtpMapParams(const cricket::ContentInfo& content_info, bool video, std::vector* rtpmap) { if (!video) { - const cricket::AudioContentDescription* audio_offer = + const cricket::AudioContentDescription* audio = static_cast( content_info.description); std::vector::const_iterator iter = - audio_offer->codecs().begin(); + audio->codecs().begin(); std::vector::const_iterator iter_end = - audio_offer->codecs().end(); + audio->codecs().end(); for (; iter != iter_end; ++iter) { Json::Value codec; std::string codec_str(std::string("audio/").append(iter->name)); @@ -213,14 +221,14 @@ bool BuildRtpMapParams(const cricket::ContentInfo& content_info, rtpmap->push_back(codec_id); } } else { - const cricket::VideoContentDescription* video_offer = + const cricket::VideoContentDescription* video = static_cast( content_info.description); std::vector::const_iterator iter = - video_offer->codecs().begin(); + video->codecs().begin(); std::vector::const_iterator iter_end = - video_offer->codecs().end(); + video->codecs().end(); for (; iter != iter_end; ++iter) { Json::Value codec; std::string codec_str(std::string("video/").append(iter->name)); @@ -233,6 +241,24 @@ bool BuildRtpMapParams(const cricket::ContentInfo& content_info, return true; } +void BuildCrypto(const cricket::ContentInfo& content_info, + bool video, + std::vector* cryptos) { + const cricket::MediaContentDescription* content_desc = + static_cast( + content_info.description); + std::vector::const_iterator iter = + content_desc->cryptos().begin(); + std::vector::const_iterator iter_end = + content_desc->cryptos().end(); + for (; iter != iter_end; ++iter) { + Json::Value crypto; + Append(&crypto, "cipher_suite", iter->cipher_suite); + Append(&crypto, "key_params", iter->key_params); + cryptos->push_back(crypto); + } +} + bool BuildCandidate(const std::vector& candidates, bool video, std::vector* jcandidates) { @@ -355,7 +381,6 @@ bool ParseContent(const Json::Value& jmessage, return false; for (size_t i = 0; i < contents.size(); ++i) { Json::Value content = contents[i]; - // TODO(ronghuawu): crypto // candidates if (!ParseCandidates(content, candidates)) return false; @@ -371,6 +396,9 @@ bool ParseContent(const Json::Value& jmessage, return false; audio_content->set_rtcp_mux(rtcp_mux); audio_content->SortCodecs(); + // crypto + if (!ParseCrypto(content, audio_content)) + return false; // tracks if (!ParseTrack(content, audio_content)) return false; @@ -383,6 +411,9 @@ bool ParseContent(const Json::Value& jmessage, return false; video_content->set_rtcp_mux(rtcp_mux); video_content->SortCodecs(); + // crypto + if (!ParseCrypto(content, video_content)) + return false; if (!ParseTrack(content, video_content)) return false; (sdp)->AddContent(cricket::CN_VIDEO, @@ -508,6 +539,31 @@ bool ParseCandidates(const Json::Value& content, return true; } +bool ParseCrypto(const Json::Value& content, + cricket::MediaContentDescription* desc) { + std::vector jcryptos(ReadValues(content, "crypto")); + std::vector::const_iterator iter = + jcryptos.begin(); + std::vector::const_iterator iter_end = + jcryptos.end(); + for (; iter != iter_end; ++iter) { + cricket::CryptoParams crypto; + + std::string cipher_suite; + if (!GetStringFromJsonObject(*iter, "cipher_suite", &cipher_suite)) + return false; + crypto.cipher_suite = cipher_suite; + + std::string key_params; + if (!GetStringFromJsonObject(*iter, "key_params", &key_params)) + return false; + crypto.key_params= key_params; + + desc->AddCrypto(crypto); + } + return true; +} + bool ParseTrack(const Json::Value& content, cricket::MediaContentDescription* content_desc) { ASSERT(content_desc);