From d43aa9de7a4a2b793e5ec59c86fb0b81e4052bb0 Mon Sep 17 00:00:00 2001 From: "henrike@webrtc.org" Date: Fri, 21 Feb 2014 23:43:24 +0000 Subject: [PATCH] Update libjingle 61901702->61966318 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5596 4adac7df-926f-26a2-2b94-8c16560cd09d --- talk/base/openssl.h | 4 +- talk/base/opensslstreamadapter.cc | 28 +++++++++++++ talk/media/base/constants.cc | 3 ++ talk/media/base/constants.h | 4 ++ talk/media/base/videoadapter.cc | 54 ++++++++++++++++++++++++++ talk/media/base/videoadapter.h | 52 +++---------------------- talk/media/webrtc/webrtcvideoengine.cc | 5 +-- talk/session/media/channel.cc | 45 +++++++++++++++++++-- talk/session/media/channel.h | 6 +++ talk/session/media/externalhmac.cc | 2 +- talk/session/media/srtpfilter.cc | 2 +- talk/xmpp/constants.cc | 1 + talk/xmpp/constants.h | 1 + 13 files changed, 149 insertions(+), 58 deletions(-) diff --git a/talk/base/openssl.h b/talk/base/openssl.h index e2cfd2b1dd..d9628a7636 100644 --- a/talk/base/openssl.h +++ b/talk/base/openssl.h @@ -30,8 +30,8 @@ #include -#if (OPENSSL_VERSION_NUMBER < 0x10001000L) -#error OpenSSL is older than 1.0.1, which is the minimum supported version. +#if (OPENSSL_VERSION_NUMBER < 0x10000000L) +#error OpenSSL is older than 1.0.0, which is the minimum supported version. #endif #endif // TALK_BASE_OPENSSL_H_ diff --git a/talk/base/opensslstreamadapter.cc b/talk/base/opensslstreamadapter.cc index cafef9266e..ba88a68533 100644 --- a/talk/base/opensslstreamadapter.cc +++ b/talk/base/opensslstreamadapter.cc @@ -53,6 +53,11 @@ namespace talk_base { +#if (OPENSSL_VERSION_NUMBER >= 0x10001000L) +#define HAVE_DTLS_SRTP +#endif + +#ifdef HAVE_DTLS_SRTP // SRTP cipher suite table struct SrtpCipherMapEntry { const char* external_name; @@ -65,6 +70,7 @@ static SrtpCipherMapEntry SrtpCipherMap[] = { {"AES_CM_128_HMAC_SHA1_32", "SRTP_AES128_CM_SHA1_32"}, {NULL, NULL} }; +#endif ////////////////////////////////////////////////////////////////////// // StreamBIO @@ -238,6 +244,7 @@ bool OpenSSLStreamAdapter::ExportKeyingMaterial(const std::string& label, bool use_context, uint8* result, size_t result_len) { +#ifdef HAVE_DTLS_SRTP int i; i = SSL_export_keying_material(ssl_, result, result_len, @@ -249,10 +256,14 @@ bool OpenSSLStreamAdapter::ExportKeyingMaterial(const std::string& label, return false; return true; +#else + return false; +#endif } bool OpenSSLStreamAdapter::SetDtlsSrtpCiphers( const std::vector& ciphers) { +#ifdef HAVE_DTLS_SRTP std::string internal_ciphers; if (state_ != SSL_NONE) @@ -283,9 +294,13 @@ bool OpenSSLStreamAdapter::SetDtlsSrtpCiphers( srtp_ciphers_ = internal_ciphers; return true; +#else + return false; +#endif } bool OpenSSLStreamAdapter::GetDtlsSrtpCipher(std::string* cipher) { +#ifdef HAVE_DTLS_SRTP ASSERT(state_ == SSL_CONNECTED); if (state_ != SSL_CONNECTED) return false; @@ -307,6 +322,9 @@ bool OpenSSLStreamAdapter::GetDtlsSrtpCipher(std::string* cipher) { ASSERT(false); // This should never happen return false; +#else + return false; +#endif } int OpenSSLStreamAdapter::StartSSLWithServer(const char* server_name) { @@ -737,12 +755,14 @@ SSL_CTX* OpenSSLStreamAdapter::SetupSSLContext() { SSL_CTX_set_verify_depth(ctx, 4); SSL_CTX_set_cipher_list(ctx, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); +#ifdef HAVE_DTLS_SRTP if (!srtp_ciphers_.empty()) { if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_ciphers_.c_str())) { SSL_CTX_free(ctx); return NULL; } } +#endif return ctx; } @@ -820,11 +840,19 @@ bool OpenSSLStreamAdapter::HaveDtls() { } bool OpenSSLStreamAdapter::HaveDtlsSrtp() { +#ifdef HAVE_DTLS_SRTP return true; +#else + return false; +#endif } bool OpenSSLStreamAdapter::HaveExporter() { +#ifdef HAVE_DTLS_SRTP return true; +#else + return false; +#endif } } // namespace talk_base diff --git a/talk/media/base/constants.cc b/talk/media/base/constants.cc index a8a0da7487..72ea043c03 100644 --- a/talk/media/base/constants.cc +++ b/talk/media/base/constants.cc @@ -96,4 +96,7 @@ const char kGoogleSctpDataCodecName[] = "google-sctp-data"; const char kComfortNoiseCodecName[] = "CN"; +const char kRtpAbsoluteSendTimeHeaderExtension[] = + "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"; + } // namespace cricket diff --git a/talk/media/base/constants.h b/talk/media/base/constants.h index 5414db5148..5f123ffcba 100644 --- a/talk/media/base/constants.h +++ b/talk/media/base/constants.h @@ -116,6 +116,10 @@ extern const char kGoogleSctpDataCodecName[]; extern const char kComfortNoiseCodecName[]; +// Extension header for absolute send time, see url for details: +// http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time +extern const char kRtpAbsoluteSendTimeHeaderExtension[]; + } // namespace cricket #endif // TALK_MEDIA_BASE_CONSTANTS_H_ diff --git a/talk/media/base/videoadapter.cc b/talk/media/base/videoadapter.cc index dc672bbab7..f1979951cd 100644 --- a/talk/media/base/videoadapter.cc +++ b/talk/media/base/videoadapter.cc @@ -211,6 +211,12 @@ void CoordinatedVideoAdapter::SetInputFormat(const VideoFormat& format) { } } +void CoordinatedVideoAdapter::set_cpu_smoothing(bool enable) { + LOG(LS_INFO) << "CPU smoothing is now " + << (enable ? "enabled" : "disabled"); + cpu_smoothing_ = enable; +} + void VideoAdapter::SetOutputFormat(const VideoFormat& format) { talk_base::CritScope cs(&critical_section_); int64 old_output_interval = output_format_.interval; @@ -361,6 +367,12 @@ bool VideoAdapter::AdaptFrame(const VideoFrame* in_frame, return true; } +void VideoAdapter::set_scale_third(bool enable) { + LOG(LS_INFO) << "Video Adapter third scaling is now " + << (enable ? "enabled" : "disabled"); + scale_third_ = enable; +} + // Scale or Blacken the frame. Returns true if successful. bool VideoAdapter::StretchToOutputFrame(const VideoFrame* in_frame) { int output_width = output_format_.width; @@ -481,6 +493,48 @@ void CoordinatedVideoAdapter::OnOutputFormatRequest(const VideoFormat& format) { << " To: " << new_width << "x" << new_height; } +void CoordinatedVideoAdapter::set_cpu_load_min_samples( + int cpu_load_min_samples) { + if (cpu_load_min_samples_ != cpu_load_min_samples) { + LOG(LS_INFO) << "VAdapt Change Cpu Adapt Min Samples from: " + << cpu_load_min_samples_ << " to " + << cpu_load_min_samples; + cpu_load_min_samples_ = cpu_load_min_samples; + } +} + +void CoordinatedVideoAdapter::set_high_system_threshold( + float high_system_threshold) { + ASSERT(high_system_threshold <= 1.0f); + ASSERT(high_system_threshold >= 0.0f); + if (high_system_threshold_ != high_system_threshold) { + LOG(LS_INFO) << "VAdapt Change High System Threshold from: " + << high_system_threshold_ << " to " << high_system_threshold; + high_system_threshold_ = high_system_threshold; + } +} + +void CoordinatedVideoAdapter::set_low_system_threshold( + float low_system_threshold) { + ASSERT(low_system_threshold <= 1.0f); + ASSERT(low_system_threshold >= 0.0f); + if (low_system_threshold_ != low_system_threshold) { + LOG(LS_INFO) << "VAdapt Change Low System Threshold from: " + << low_system_threshold_ << " to " << low_system_threshold; + low_system_threshold_ = low_system_threshold; + } +} + +void CoordinatedVideoAdapter::set_process_threshold(float process_threshold) { + ASSERT(process_threshold <= 1.0f); + ASSERT(process_threshold >= 0.0f); + if (process_threshold_ != process_threshold) { + LOG(LS_INFO) << "VAdapt Change High Process Threshold from: " + << process_threshold_ << " to " << process_threshold; + process_threshold_ = process_threshold; + } +} + // A Bandwidth GD request for new resolution void CoordinatedVideoAdapter::OnEncoderResolutionRequest( int width, int height, AdaptRequest request) { diff --git a/talk/media/base/videoadapter.h b/talk/media/base/videoadapter.h index 70d4da7efa..98c64d6a43 100644 --- a/talk/media/base/videoadapter.h +++ b/talk/media/base/videoadapter.h @@ -28,7 +28,6 @@ #include "talk/base/common.h" // For ASSERT #include "talk/base/criticalsection.h" -#include "talk/base/logging.h" #include "talk/base/scoped_ptr.h" #include "talk/base/sigslot.h" #include "talk/media/base/videocommon.h" @@ -64,11 +63,7 @@ class VideoAdapter { // the output frame. bool AdaptFrame(const VideoFrame* in_frame, VideoFrame** out_frame); - void set_scale_third(bool enable) { - LOG(LS_INFO) << "Video Adapter third scaling is now " - << (enable ? "enabled" : "disabled"); - scale_third_ = enable; - } + void set_scale_third(bool enable); bool scale_third() const { return scale_third_; } protected: @@ -129,11 +124,7 @@ class CoordinatedVideoAdapter // Enable or disable smoothing when doing CPU adaptation. When smoothing is // enabled, system CPU load is tracked using an exponential weighted // average. - void set_cpu_smoothing(bool enable) { - LOG(LS_INFO) << "CPU smoothing is now " - << (enable ? "enabled" : "disabled"); - cpu_smoothing_ = enable; - } + void set_cpu_smoothing(bool enable); bool cpu_smoothing() const { return cpu_smoothing_; } // Enable or disable video adaptation due to the change of the GD void set_gd_adaptation(bool enable) { gd_adaptation_ = enable; } @@ -151,47 +142,16 @@ class CoordinatedVideoAdapter // When the video is decreased, set the waiting time for CPU adaptation to // decrease video again. - void set_cpu_load_min_samples(int cpu_load_min_samples) { - if (cpu_load_min_samples_ != cpu_load_min_samples) { - LOG(LS_INFO) << "VAdapt Change Cpu Adapt Min Samples from: " - << cpu_load_min_samples_ << " to " - << cpu_load_min_samples; - cpu_load_min_samples_ = cpu_load_min_samples; - } - } + void set_cpu_load_min_samples(int cpu_load_min_samples); int cpu_load_min_samples() const { return cpu_load_min_samples_; } // CPU system load high threshold for reducing resolution. e.g. 0.85f - void set_high_system_threshold(float high_system_threshold) { - ASSERT(high_system_threshold <= 1.0f); - ASSERT(high_system_threshold >= 0.0f); - if (high_system_threshold_ != high_system_threshold) { - LOG(LS_INFO) << "VAdapt Change High System Threshold from: " - << high_system_threshold_ << " to " << high_system_threshold; - high_system_threshold_ = high_system_threshold; - } - } + void set_high_system_threshold(float high_system_threshold); float high_system_threshold() const { return high_system_threshold_; } // CPU system load low threshold for increasing resolution. e.g. 0.70f - void set_low_system_threshold(float low_system_threshold) { - ASSERT(low_system_threshold <= 1.0f); - ASSERT(low_system_threshold >= 0.0f); - if (low_system_threshold_ != low_system_threshold) { - LOG(LS_INFO) << "VAdapt Change Low System Threshold from: " - << low_system_threshold_ << " to " << low_system_threshold; - low_system_threshold_ = low_system_threshold; - } - } + void set_low_system_threshold(float low_system_threshold); float low_system_threshold() const { return low_system_threshold_; } // CPU process load threshold for reducing resolution. e.g. 0.10f - void set_process_threshold(float process_threshold) { - ASSERT(process_threshold <= 1.0f); - ASSERT(process_threshold >= 0.0f); - if (process_threshold_ != process_threshold) { - LOG(LS_INFO) << "VAdapt Change High Process Threshold from: " - << process_threshold_ << " to " << process_threshold; - process_threshold_ = process_threshold; - } - } + void set_process_threshold(float process_threshold); float process_threshold() const { return process_threshold_; } // Handle the format request from the server via Jingle update message. diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc index f096ac5282..72432f1694 100644 --- a/talk/media/webrtc/webrtcvideoengine.cc +++ b/talk/media/webrtc/webrtcvideoengine.cc @@ -152,10 +152,7 @@ static const char kRtpTimestampOffsetHeaderExtension[] = "urn:ietf:params:rtp-hdrext:toffset"; static const int kRtpTimeOffsetExtensionId = 2; -// Extension header for absolute send time, see url for details: -// http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time -static const char kRtpAbsoluteSendTimeHeaderExtension[] = - "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"; +// Extension header ID for absolute send time. Url defined in constants.cc static const int kRtpAbsoluteSendTimeExtensionId = 3; // Default video dscp value. // See http://tools.ietf.org/html/rfc2474 for details diff --git a/talk/session/media/channel.cc b/talk/session/media/channel.cc index 6c0233f965..fb328e2a3e 100644 --- a/talk/session/media/channel.cc +++ b/talk/session/media/channel.cc @@ -33,6 +33,7 @@ #include "talk/base/common.h" #include "talk/base/dscp.h" #include "talk/base/logging.h" +#include "talk/media/base/constants.h" #include "talk/media/base/rtputils.h" #include "talk/p2p/base/transportchannel.h" #include "talk/session/media/channelmanager.h" @@ -186,7 +187,8 @@ BaseChannel::BaseChannel(talk_base::Thread* thread, remote_content_direction_(MD_INACTIVE), has_received_packet_(false), dtls_keyed_(false), - secure_required_(false) { + secure_required_(false), + rtp_abs_sendtime_extn_id_(-1) { ASSERT(worker_thread_ == talk_base::Thread::Current()); LOG(LS_INFO) << "Created channel for " << content_name; } @@ -462,14 +464,40 @@ bool BaseChannel::SendPacket(bool rtcp, talk_base::Buffer* packet, SignalSendPacketPreCrypto(packet->data(), packet->length(), rtcp); } + talk_base::PacketOptions options(dscp); + options.packet_time_params.rtp_sendtime_extension_id = + rtp_abs_sendtime_extn_id_; // Protect if needed. if (srtp_filter_.IsActive()) { bool res; char* data = packet->data(); int len = static_cast(packet->length()); if (!rtcp) { - res = srtp_filter_.ProtectRtp(data, len, - static_cast(packet->capacity()), &len); + // If ENABLE_EXTERNAL_AUTH flag is on then packet authentication is not done + // inside libsrtp for a RTP packet. A external HMAC module will be writing + // a fake HMAC value. This is ONLY done for a RTP packet. + // Socket layer will update rtp sendtime extension header if present in + // packet with current time before updating the HMAC. +#if !defined(ENABLE_EXTERNAL_AUTH) + res = srtp_filter_.ProtectRtp( + data, len, static_cast(packet->capacity()), &len); +#else + res = srtp_filter_.ProtectRtp( + data, len, static_cast(packet->capacity()), &len, + &options.packet_time_params.srtp_packet_index); + // If protection succeeds, let's get auth params from srtp. + if (res) { + uint8* auth_key = NULL; + int key_len; + res = srtp_filter_.GetRtpAuthParams( + &auth_key, &key_len, &options.packet_time_params.srtp_auth_tag_len); + if (res) { + options.packet_time_params.srtp_auth_key.resize(key_len); + options.packet_time_params.srtp_auth_key.assign(auth_key, + auth_key + key_len); + } + } +#endif if (!res) { int seq_num = -1; uint32 ssrc = 0; @@ -511,7 +539,6 @@ bool BaseChannel::SendPacket(bool rtcp, talk_base::Buffer* packet, } // Bon voyage. - talk_base::PacketOptions options(dscp); int ret = channel->SendPacket(packet->data(), packet->length(), options, (secure() && secure_dtls()) ? PF_SRTP_BYPASS : 0); if (ret != static_cast(packet->length())) { @@ -1170,6 +1197,8 @@ bool BaseChannel::SetBaseRemoteContent_w(const MediaContentDescription* content, << MediaTypeToString(content->type()) << " content."; SafeSetError(desc.str(), error_desc); ret = false; + } else { + MaybeCacheRtpAbsSendTimeHeaderExtension(content->rtp_header_extensions()); } } @@ -1184,6 +1213,14 @@ bool BaseChannel::SetBaseRemoteContent_w(const MediaContentDescription* content, return ret; } +void BaseChannel::MaybeCacheRtpAbsSendTimeHeaderExtension( + const std::vector& extensions) { + const RtpHeaderExtension* send_time_extension = + FindHeaderExtension(extensions, kRtpAbsoluteSendTimeHeaderExtension); + rtp_abs_sendtime_extn_id_ = + send_time_extension ? send_time_extension->id : -1; +} + void BaseChannel::OnMessage(talk_base::Message *pmsg) { switch (pmsg->message_id) { case MSG_RTPPACKET: diff --git a/talk/session/media/channel.h b/talk/session/media/channel.h index 5a69fed8b2..2896bcede6 100644 --- a/talk/session/media/channel.h +++ b/talk/session/media/channel.h @@ -319,6 +319,11 @@ class BaseChannel ContentAction action, std::string* error_desc) = 0; + // Helper method to get RTP Absoulute SendTime extension header id if + // present in remote supported extensions list. + void MaybeCacheRtpAbsSendTimeHeaderExtension( + const std::vector& extensions); + bool CheckSrtpConfig(const std::vector& cryptos, bool* dtls, std::string* error_desc); @@ -380,6 +385,7 @@ class BaseChannel bool has_received_packet_; bool dtls_keyed_; bool secure_required_; + int rtp_abs_sendtime_extn_id_; }; // VoiceChannel is a specialization that adds support for early media, DTMF, diff --git a/talk/session/media/externalhmac.cc b/talk/session/media/externalhmac.cc index d5cfc951b5..69d44b6a69 100644 --- a/talk/session/media/externalhmac.cc +++ b/talk/session/media/externalhmac.cc @@ -33,7 +33,7 @@ #include "third_party/libsrtp/include/srtp.h" #endif // SRTP_RELATIVE_PATH -#include "talk/session/media/external_hmac.h" +#include "talk/session/media/externalhmac.h" #include "talk/base/logging.h" diff --git a/talk/session/media/srtpfilter.cc b/talk/session/media/srtpfilter.cc index 2f14268607..2e8c5f281d 100644 --- a/talk/session/media/srtpfilter.cc +++ b/talk/session/media/srtpfilter.cc @@ -52,7 +52,7 @@ extern "C" srtp_stream_t srtp_get_stream(srtp_t srtp, uint32_t ssrc); #include "third_party/libsrtp/include/srtp_priv.h" #endif // SRTP_RELATIVE_PATH #ifdef ENABLE_EXTERNAL_AUTH -#include "talk/session/media/external_hmac.h" +#include "talk/session/media/externalhmac.h" #endif // ENABLE_EXTERNAL_AUTH #ifdef _DEBUG extern "C" debug_module_t mod_srtp; diff --git a/talk/xmpp/constants.cc b/talk/xmpp/constants.cc index b1febd8a31..39d06b4219 100644 --- a/talk/xmpp/constants.cc +++ b/talk/xmpp/constants.cc @@ -118,6 +118,7 @@ const char STR_MUC_ROOM_FEATURE_HANGOUT[] = "muc_es"; const char STR_MUC_ROOM_FEATURE_HANGOUT_LITE[] = "muc_lite"; const char STR_MUC_ROOM_FEATURE_BROADCAST[] = "broadcast"; const char STR_MUC_ROOM_FEATURE_MULTI_USER_VC[] = "muc_muvc"; +const char STR_MUC_ROOM_FEATURE_RECORDABLE[] = "recordable"; const char STR_MUC_ROOM_OWNER_PROFILE_ID[] = "muc#roominfo_owner_profile_id"; const char STR_ID_TYPE_CONVERSATION[] = "conversation"; diff --git a/talk/xmpp/constants.h b/talk/xmpp/constants.h index 2533e1e2d1..d4cdd8cd85 100644 --- a/talk/xmpp/constants.h +++ b/talk/xmpp/constants.h @@ -111,6 +111,7 @@ extern const char STR_MUC_ROOM_FEATURE_HANGOUT[]; extern const char STR_MUC_ROOM_FEATURE_HANGOUT_LITE[]; extern const char STR_MUC_ROOM_FEATURE_BROADCAST[]; extern const char STR_MUC_ROOM_FEATURE_MULTI_USER_VC[]; +extern const char STR_MUC_ROOM_FEATURE_RECORDABLE[]; extern const char STR_MUC_ROOM_OWNER_PROFILE_ID[]; extern const char STR_ID_TYPE_CONVERSATION[];