Update libjingle 61901702->61966318

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5596 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/base/openssl.h b/talk/base/openssl.h
index e2cfd2b..d9628a7 100644
--- a/talk/base/openssl.h
+++ b/talk/base/openssl.h
@@ -30,8 +30,8 @@
 
 #include <openssl/ssl.h>
 
-#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 cafef92..ba88a68 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 @@
   {"AES_CM_128_HMAC_SHA1_32", "SRTP_AES128_CM_SHA1_32"},
   {NULL, NULL}
 };
+#endif
 
 //////////////////////////////////////////////////////////////////////
 // StreamBIO
@@ -238,6 +244,7 @@
                                                 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 @@
     return false;
 
   return true;
+#else
+  return false;
+#endif
 }
 
 bool OpenSSLStreamAdapter::SetDtlsSrtpCiphers(
     const std::vector<std::string>& ciphers) {
+#ifdef HAVE_DTLS_SRTP
   std::string internal_ciphers;
 
   if (state_ != SSL_NONE)
@@ -283,9 +294,13 @@
 
   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 @@
   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_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::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 a8a0da7..72ea043 100644
--- a/talk/media/base/constants.cc
+++ b/talk/media/base/constants.cc
@@ -96,4 +96,7 @@
 
 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 5414db5..5f123ff 100644
--- a/talk/media/base/constants.h
+++ b/talk/media/base/constants.h
@@ -116,6 +116,10 @@
 
 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 dc672bb..f197995 100644
--- a/talk/media/base/videoadapter.cc
+++ b/talk/media/base/videoadapter.cc
@@ -211,6 +211,12 @@
   }
 }
 
+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 @@
   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 @@
                << " 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 70d4da7..98c64d6 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 @@
   // 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 @@
   // 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 @@
 
   // 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 f096ac5..72432f1 100644
--- a/talk/media/webrtc/webrtcvideoengine.cc
+++ b/talk/media/webrtc/webrtcvideoengine.cc
@@ -152,10 +152,7 @@
     "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 6c0233f..fb328e2 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 @@
       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 @@
     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<int>(packet->length());
     if (!rtcp) {
-      res = srtp_filter_.ProtectRtp(data, len,
-                                    static_cast<int>(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<int>(packet->capacity()), &len);
+#else
+      res = srtp_filter_.ProtectRtp(
+          data, len, static_cast<int>(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 @@
   }
 
   // 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<int>(packet->length())) {
@@ -1170,6 +1197,8 @@
            << MediaTypeToString(content->type()) << " content.";
       SafeSetError(desc.str(), error_desc);
       ret = false;
+    } else {
+      MaybeCacheRtpAbsSendTimeHeaderExtension(content->rtp_header_extensions());
     }
   }
 
@@ -1184,6 +1213,14 @@
   return ret;
 }
 
+void BaseChannel::MaybeCacheRtpAbsSendTimeHeaderExtension(
+    const std::vector<RtpHeaderExtension>& 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 5a69fed..2896bce 100644
--- a/talk/session/media/channel.h
+++ b/talk/session/media/channel.h
@@ -319,6 +319,11 @@
                                   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<RtpHeaderExtension>& extensions);
+
   bool CheckSrtpConfig(const std::vector<CryptoParams>& cryptos,
                        bool* dtls,
                        std::string* error_desc);
@@ -380,6 +385,7 @@
   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 d5cfc95..69d44b6 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 2f14268..2e8c5f2 100644
--- a/talk/session/media/srtpfilter.cc
+++ b/talk/session/media/srtpfilter.cc
@@ -52,7 +52,7 @@
 #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 b1febd8..39d06b4 100644
--- a/talk/xmpp/constants.cc
+++ b/talk/xmpp/constants.cc
@@ -118,6 +118,7 @@
 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 2533e1e..d4cdd8c 100644
--- a/talk/xmpp/constants.h
+++ b/talk/xmpp/constants.h
@@ -111,6 +111,7 @@
 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[];