Adds send time to ReceivedPacket struct.

Bug: webrtc:10742
Change-Id: I7e83d5ec2e23d1db38d02a0c883466ecdcd387c6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/141874
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28290}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 6d9b7c1..906ae63 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -73,6 +73,7 @@
   deps = [
     ":array_view",
     "..:webrtc_common",
+    "units:timestamp",
     "video:video_frame",
     "video:video_rtp_headers",
     "//third_party/abseil-cpp/absl/types:optional",
diff --git a/api/rtp_headers.h b/api/rtp_headers.h
index a7ae5cd..cdf1e28 100644
--- a/api/rtp_headers.h
+++ b/api/rtp_headers.h
@@ -17,6 +17,7 @@
 
 #include "absl/types/optional.h"
 #include "api/array_view.h"
+#include "api/units/timestamp.h"
 #include "api/video/color_space.h"
 #include "api/video/video_content_type.h"
 #include "api/video/video_frame_marking.h"
@@ -42,6 +43,15 @@
   RTPHeaderExtension(const RTPHeaderExtension& other);
   RTPHeaderExtension& operator=(const RTPHeaderExtension& other);
 
+  static constexpr int kAbsSendTimeFraction = 18;
+
+  Timestamp GetAbsoluteSendTimestamp() const {
+    RTC_DCHECK(hasAbsoluteSendTime);
+    RTC_DCHECK(absoluteSendTime < (1ul << 24));
+    return Timestamp::us((absoluteSendTime * 1000000L) /
+                         (1 << kAbsSendTimeFraction));
+  }
+
   bool hasTransmissionTimeOffset;
   int32_t transmissionTimeOffset;
   bool hasAbsoluteSendTime;
diff --git a/api/transport/network_types.h b/api/transport/network_types.h
index dfb89d2..a415c09 100644
--- a/api/transport/network_types.h
+++ b/api/transport/network_types.h
@@ -102,6 +102,7 @@
 };
 
 struct ReceivedPacket {
+  Timestamp send_time = Timestamp::MinusInfinity();
   Timestamp receive_time = Timestamp::PlusInfinity();
   DataSize size = DataSize::Zero();
 };
diff --git a/call/call.cc b/call/call.cc
index a25e161..fe922e4 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -1500,6 +1500,9 @@
   ReceivedPacket packet_msg;
   packet_msg.size = DataSize::bytes(packet.payload_size());
   packet_msg.receive_time = Timestamp::ms(packet.arrival_time_ms());
+  if (header.extension.hasAbsoluteSendTime) {
+    packet_msg.send_time = header.extension.GetAbsoluteSendTimestamp();
+  }
   transport_send_ptr_->OnReceivedPacket(packet_msg);
 
   if (!use_send_side_bwe && header.extension.hasTransportSequenceNumber) {
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc
index ed2d061..61dd3e2 100644
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc
+++ b/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc
@@ -36,9 +36,9 @@
 
 enum {
   kTimestampGroupLengthMs = 5,
-  kAbsSendTimeFraction = 18,
   kAbsSendTimeInterArrivalUpshift = 8,
-  kInterArrivalShift = kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift,
+  kInterArrivalShift = RTPHeaderExtension::kAbsSendTimeFraction +
+                       kAbsSendTimeInterArrivalUpshift,
   kInitialProbingIntervalMs = 2000,
   kMinClusterSize = 4,
   kMaxProbePackets = 15,
@@ -61,9 +61,10 @@
 
 uint32_t ConvertMsTo24Bits(int64_t time_ms) {
   uint32_t time_24_bits =
-      static_cast<uint32_t>(
-          ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) /
-          1000) &
+      static_cast<uint32_t>(((static_cast<uint64_t>(time_ms)
+                              << RTPHeaderExtension::kAbsSendTimeFraction) +
+                             500) /
+                            1000) &
       0x00FFFFFF;
   return time_24_bits;
 }