Ready to support of absolute capture timestamp header extension.

This does not add it in default SDP offer.

Bug: webrtc:10739
Change-Id: I4e73f4497989fc34f3676927921a4dabb5926096
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/169729
Commit-Queue: Minyue Li <minyue@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Johannes Kron <kron@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30707}
diff --git a/api/rtp_parameters.cc b/api/rtp_parameters.cc
index 2b580b1..9b72960 100644
--- a/api/rtp_parameters.cc
+++ b/api/rtp_parameters.cc
@@ -159,8 +159,7 @@
 bool RtpExtension::IsSupportedForAudio(const std::string& uri) {
   return uri == webrtc::RtpExtension::kAudioLevelUri ||
          uri == webrtc::RtpExtension::kAbsSendTimeUri ||
-         // TODO(bugs.webrtc.org/10739): Uncomment once the audio impl is ready.
-         // uri == webrtc::RtpExtension::kAbsoluteCaptureTimeUri ||
+         uri == webrtc::RtpExtension::kAbsoluteCaptureTimeUri ||
          uri == webrtc::RtpExtension::kTransportSequenceNumberUri ||
          uri == webrtc::RtpExtension::kTransportSequenceNumberV2Uri ||
          uri == webrtc::RtpExtension::kMidUri ||
@@ -171,8 +170,7 @@
 bool RtpExtension::IsSupportedForVideo(const std::string& uri) {
   return uri == webrtc::RtpExtension::kTimestampOffsetUri ||
          uri == webrtc::RtpExtension::kAbsSendTimeUri ||
-         // TODO(bugs.webrtc.org/10739): Uncomment once the video impl is ready.
-         // uri == webrtc::RtpExtension::kAbsoluteCaptureTimeUri ||
+         uri == webrtc::RtpExtension::kAbsoluteCaptureTimeUri ||
          uri == webrtc::RtpExtension::kVideoRotationUri ||
          uri == webrtc::RtpExtension::kTransportSequenceNumberUri ||
          uri == webrtc::RtpExtension::kTransportSequenceNumberV2Uri ||
diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc
index 9c709d8..3e1da09 100644
--- a/audio/audio_send_stream.cc
+++ b/audio/audio_send_stream.cc
@@ -212,6 +212,8 @@
       ids.rid = extension.id;
     } else if (extension.uri == RtpExtension::kRepairedRidUri) {
       ids.repaired_rid = extension.id;
+    } else if (extension.uri == RtpExtension::kAbsoluteCaptureTimeUri) {
+      ids.abs_capture_time = extension.id;
     }
   }
   return ids;
@@ -323,6 +325,15 @@
     rtp_rtcp_module_->SetRid(new_config.rtp.rid);
   }
 
+  if (first_time || new_ids.abs_capture_time != old_ids.abs_capture_time) {
+    rtp_rtcp_module_->DeregisterSendRtpHeaderExtension(
+        kRtpExtensionAbsoluteCaptureTime);
+    if (new_ids.abs_capture_time) {
+      rtp_rtcp_module_->RegisterRtpHeaderExtension(
+          AbsoluteCaptureTimeExtension::kUri, new_ids.abs_capture_time);
+    }
+  }
+
   if (!ReconfigureSendCodec(new_config)) {
     RTC_LOG(LS_ERROR) << "Failed to set up send codec state.";
   }
diff --git a/audio/audio_send_stream.h b/audio/audio_send_stream.h
index 6875915..1dbb134 100644
--- a/audio/audio_send_stream.h
+++ b/audio/audio_send_stream.h
@@ -190,6 +190,7 @@
   struct ExtensionIds {
     int audio_level = 0;
     int abs_send_time = 0;
+    int abs_capture_time = 0;
     int transport_sequence_number = 0;
     int mid = 0;
     int rid = 0;