Simplify registration of RTP-header extensions.

Removes per-extension functions in ViEChannel/ViEReceiver and instead
register extensions directly on the RTP module by mapping extension
string to RTP-header-extension type.

BUG=webrtc:5494
R=danilchap@webrtc.org, stefan@webrtc.org

Review URL: https://codereview.webrtc.org/1740133002 .

Cr-Commit-Position: refs/heads/master@{#11786}
diff --git a/webrtc/modules/rtp_rtcp/include/rtp_rtcp.h b/webrtc/modules/rtp_rtcp/include/rtp_rtcp.h
index e0ace4c..a47d3fe 100644
--- a/webrtc/modules/rtp_rtcp/include/rtp_rtcp.h
+++ b/webrtc/modules/rtp_rtcp/include/rtp_rtcp.h
@@ -12,6 +12,7 @@
 #define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_H_
 
 #include <set>
+#include <string>
 #include <utility>
 #include <vector>
 
@@ -26,6 +27,8 @@
 class Transport;
 class RtcEventLog;
 
+RTPExtensionType StringToRtpExtensionType(const std::string& extension);
+
 namespace rtcp {
 class TransportFeedback;
 }
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index 7f33bc2..cbb085b 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -13,10 +13,12 @@
 #include <string.h>
 
 #include <set>
+#include <string>
 
 #include "webrtc/base/checks.h"
 #include "webrtc/base/logging.h"
 #include "webrtc/common_types.h"
+#include "webrtc/config.h"
 #include "webrtc/system_wrappers/include/trace.h"
 
 #ifdef _WIN32
@@ -26,6 +28,21 @@
 
 namespace webrtc {
 
+RTPExtensionType StringToRtpExtensionType(const std::string& extension) {
+  if (extension == RtpExtension::kTOffset)
+    return kRtpExtensionTransmissionTimeOffset;
+  if (extension == RtpExtension::kAudioLevel)
+    return kRtpExtensionAudioLevel;
+  if (extension == RtpExtension::kAbsSendTime)
+    return kRtpExtensionAbsoluteSendTime;
+  if (extension == RtpExtension::kVideoRotation)
+    return kRtpExtensionVideoRotation;
+  if (extension == RtpExtension::kTransportSequenceNumber)
+    return kRtpExtensionTransportSequenceNumber;
+  RTC_NOTREACHED() << "Looking up unsupported RTP extension.";
+  return kRtpExtensionNone;
+}
+
 RtpRtcp::Configuration::Configuration()
     : audio(false),
       receiver_only(false),
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc
index a0775bb..983e28f 100644
--- a/webrtc/video/video_receive_stream.cc
+++ b/webrtc/video/video_receive_stream.cc
@@ -229,17 +229,7 @@
     // One-byte-extension local identifiers are in the range 1-14 inclusive.
     RTC_DCHECK_GE(id, 1);
     RTC_DCHECK_LE(id, 14);
-    if (extension == RtpExtension::kTOffset) {
-      RTC_CHECK(vie_receiver_->EnableReceiveTimestampOffset(id));
-    } else if (extension == RtpExtension::kAbsSendTime) {
-      RTC_CHECK(vie_receiver_->EnableReceiveAbsoluteSendTime(id));
-    } else if (extension == RtpExtension::kVideoRotation) {
-      RTC_CHECK(vie_receiver_->EnableReceiveVideoRotation(id));
-    } else if (extension == RtpExtension::kTransportSequenceNumber) {
-      RTC_CHECK(vie_receiver_->EnableReceiveTransportSequenceNumber(id));
-    } else {
-      RTC_NOTREACHED() << "Unsupported RTP extension.";
-    }
+    vie_receiver_->EnableReceiveRtpHeaderExtension(extension, id);
   }
 
   if (config_.rtp.fec.ulpfec_payload_type != -1) {
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
index 93ff1f1..66a6a32 100644
--- a/webrtc/video/video_send_stream.cc
+++ b/webrtc/video/video_send_stream.cc
@@ -22,6 +22,7 @@
 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
 #include "webrtc/modules/congestion_controller/include/congestion_controller.h"
 #include "webrtc/modules/pacing/packet_router.h"
+#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
 #include "webrtc/modules/utility/include/process_thread.h"
 #include "webrtc/video/call_stats.h"
 #include "webrtc/video/video_capture_input.h"
@@ -228,16 +229,10 @@
     // One-byte-extension local identifiers are in the range 1-14 inclusive.
     RTC_DCHECK_GE(id, 1);
     RTC_DCHECK_LE(id, 14);
-    if (extension == RtpExtension::kTOffset) {
-      RTC_CHECK_EQ(0, vie_channel_.EnableSendTimestampOffset(id));
-    } else if (extension == RtpExtension::kAbsSendTime) {
-      RTC_CHECK_EQ(0, vie_channel_.EnableSendAbsoluteSendTime(id));
-    } else if (extension == RtpExtension::kVideoRotation) {
-      RTC_CHECK_EQ(0, vie_channel_.EnableSendVideoRotation(id));
-    } else if (extension == RtpExtension::kTransportSequenceNumber) {
-      RTC_CHECK_EQ(0, vie_channel_.EnableSendTransportSequenceNumber(id));
-    } else {
-      RTC_NOTREACHED() << "Registering unsupported RTP extension.";
+    RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension));
+    for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
+      RTC_CHECK_EQ(0, rtp_rtcp->RegisterSendRtpHeaderExtension(
+                          StringToRtpExtensionType(extension), id));
     }
   }
 
diff --git a/webrtc/video/vie_channel.cc b/webrtc/video/vie_channel.cc
index 82460d8..d91f20b 100644
--- a/webrtc/video/vie_channel.cc
+++ b/webrtc/video/vie_channel.cc
@@ -377,47 +377,6 @@
   return target_delay_ms * 40 * 30 / 1000;
 }
 
-int ViEChannel::EnableSendTimestampOffset(int id) {
-  // Enable the extension.
-  int error = 0;
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    error |= rtp_rtcp->RegisterSendRtpHeaderExtension(
-        kRtpExtensionTransmissionTimeOffset, id);
-  }
-  return error;
-}
-
-int ViEChannel::EnableSendAbsoluteSendTime(int id) {
-  // Enable the extension.
-  int error = 0;
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    error |= rtp_rtcp->RegisterSendRtpHeaderExtension(
-        kRtpExtensionAbsoluteSendTime, id);
-  }
-  return error;
-}
-
-int ViEChannel::EnableSendVideoRotation(int id) {
-  // Enable the extension.
-  int error = 0;
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    error |= rtp_rtcp->RegisterSendRtpHeaderExtension(
-        kRtpExtensionVideoRotation, id);
-  }
-  return error;
-}
-
-int ViEChannel::EnableSendTransportSequenceNumber(int id) {
-  RTC_DCHECK(sender_);
-  // Enable the extension.
-  int error = 0;
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    error |= rtp_rtcp->RegisterSendRtpHeaderExtension(
-        kRtpExtensionTransportSequenceNumber, id);
-  }
-  return error;
-}
-
 RtpState ViEChannel::GetRtpStateForSsrc(uint32_t ssrc) const {
   RTC_DCHECK(!rtp_rtcp_modules_[0]->Sending());
   RtpState rtp_state;
diff --git a/webrtc/video/vie_channel.h b/webrtc/video/vie_channel.h
index e3182cb..a17207b 100644
--- a/webrtc/video/vie_channel.h
+++ b/webrtc/video/vie_channel.h
@@ -88,10 +88,6 @@
                          bool enable_fec,
                          int payload_type_red,
                          int payload_type_fec);
-  int EnableSendTimestampOffset(int id);
-  int EnableSendAbsoluteSendTime(int id);
-  int EnableSendVideoRotation(int id);
-  int EnableSendTransportSequenceNumber(int id);
 
   RtpState GetRtpStateForSsrc(uint32_t ssrc) const;
 
diff --git a/webrtc/video/vie_receiver.cc b/webrtc/video/vie_receiver.cc
index 4048ad7..2f0cf7a 100644
--- a/webrtc/video/vie_receiver.cc
+++ b/webrtc/video/vie_receiver.cc
@@ -13,6 +13,7 @@
 #include <vector>
 
 #include "webrtc/base/logging.h"
+#include "webrtc/config.h"
 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
 #include "webrtc/modules/rtp_rtcp/include/fec_receiver.h"
 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
@@ -52,9 +53,6 @@
       ntp_estimator_(new RemoteNtpTimeEstimator(clock_)),
       receiving_(false),
       restored_packet_in_use_(false),
-      receiving_ast_enabled_(false),
-      receiving_cvo_enabled_(false),
-      receiving_tsn_enabled_(false),
       last_packet_log_ms_(-1) {}
 
 ViEReceiver::~ViEReceiver() {
@@ -156,39 +154,11 @@
       std::vector<RtpRtcp*>(rtp_modules.begin() + 1, rtp_modules.end());
 }
 
-bool ViEReceiver::EnableReceiveTimestampOffset(int id) {
-  return rtp_header_parser_->RegisterRtpHeaderExtension(
-      kRtpExtensionTransmissionTimeOffset, id);
-}
-
-bool ViEReceiver::EnableReceiveAbsoluteSendTime(int id) {
-  if (rtp_header_parser_->RegisterRtpHeaderExtension(
-      kRtpExtensionAbsoluteSendTime, id)) {
-    receiving_ast_enabled_ = true;
-    return true;
-  } else {
-    return false;
-  }
-}
-
-bool ViEReceiver::EnableReceiveVideoRotation(int id) {
-  if (rtp_header_parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionVideoRotation, id)) {
-    receiving_cvo_enabled_ = true;
-    return true;
-  } else {
-    return false;
-  }
-}
-
-bool ViEReceiver::EnableReceiveTransportSequenceNumber(int id) {
-  if (rtp_header_parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionTransportSequenceNumber, id)) {
-    receiving_tsn_enabled_ = true;
-    return true;
-  } else {
-    return false;
-  }
+void ViEReceiver::EnableReceiveRtpHeaderExtension(const std::string& extension,
+                                                  int id) {
+  RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension));
+  RTC_CHECK(rtp_header_parser_->RegisterRtpHeaderExtension(
+      StringToRtpExtensionType(extension), id));
 }
 
 int32_t ViEReceiver::OnReceivedPayloadData(const uint8_t* payload_data,
diff --git a/webrtc/video/vie_receiver.h b/webrtc/video/vie_receiver.h
index 3667a5c..ccfbd45 100644
--- a/webrtc/video/vie_receiver.h
+++ b/webrtc/video/vie_receiver.h
@@ -12,6 +12,7 @@
 #define WEBRTC_VIDEO_VIE_RECEIVER_H_
 
 #include <list>
+#include <string>
 #include <vector>
 
 #include "webrtc/base/scoped_ptr.h"
@@ -64,10 +65,7 @@
 
   void RegisterRtpRtcpModules(const std::vector<RtpRtcp*>& rtp_modules);
 
-  bool EnableReceiveTimestampOffset(int id);
-  bool EnableReceiveAbsoluteSendTime(int id);
-  bool EnableReceiveVideoRotation(int id);
-  bool EnableReceiveTransportSequenceNumber(int id);
+  void EnableReceiveRtpHeaderExtension(const std::string& extension, int id);
 
   void StartReceive();
   void StopReceive();
@@ -117,9 +115,6 @@
   bool receiving_;
   uint8_t restored_packet_[IP_PACKET_SIZE];
   bool restored_packet_in_use_;
-  bool receiving_ast_enabled_;
-  bool receiving_cvo_enabled_;
-  bool receiving_tsn_enabled_;
   int64_t last_packet_log_ms_;
 };