Pass the correct abs_capture_timestamp while cloning audio frame

This change replaces type of absolute_capture_timestamp_ms_ in
TransformableOutgoingAudioFrame from int to optional uint and makes
the function AbsoluteCaptureTimestamp() inside
TransformableAudioFrameInterface pure virtual.

Bug: webrtc:14949
Change-Id: Id3bdbcba63a5f91105ab198208e4f2b11eb3c7db
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/319000
Commit-Queue: Palak Agarwal <agpalak@google.com>
Reviewed-by: Tony Herre <herre@google.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40814}
diff --git a/api/frame_transformer_interface.h b/api/frame_transformer_interface.h
index bd9ea2d..40d2f36 100644
--- a/api/frame_transformer_interface.h
+++ b/api/frame_transformer_interface.h
@@ -78,11 +78,7 @@
     return absl::nullopt;
   }
 
-  // TODO(crbug.com/1456628): Change this to pure virtual after it
-  // is implemented everywhere.
-  virtual absl::optional<uint64_t> AbsoluteCaptureTimestamp() const {
-    return absl::nullopt;
-  }
+  virtual absl::optional<uint64_t> AbsoluteCaptureTimestamp() const = 0;
 
   enum class FrameType { kEmptyFrame, kAudioFrameSpeech, kAudioFrameCN };
 
diff --git a/audio/channel_send_frame_transformer_delegate.cc b/audio/channel_send_frame_transformer_delegate.cc
index 9b88d4d..0f85216 100644
--- a/audio/channel_send_frame_transformer_delegate.cc
+++ b/audio/channel_send_frame_transformer_delegate.cc
@@ -48,13 +48,14 @@
 class TransformableOutgoingAudioFrame
     : public TransformableAudioFrameInterface {
  public:
-  TransformableOutgoingAudioFrame(AudioFrameType frame_type,
-                                  uint8_t payload_type,
-                                  uint32_t rtp_timestamp_with_offset,
-                                  const uint8_t* payload_data,
-                                  size_t payload_size,
-                                  int64_t absolute_capture_timestamp_ms,
-                                  uint32_t ssrc)
+  TransformableOutgoingAudioFrame(
+      AudioFrameType frame_type,
+      uint8_t payload_type,
+      uint32_t rtp_timestamp_with_offset,
+      const uint8_t* payload_data,
+      size_t payload_size,
+      absl::optional<uint64_t> absolute_capture_timestamp_ms,
+      uint32_t ssrc)
       : frame_type_(frame_type),
         payload_type_(payload_type),
         rtp_timestamp_with_offset_(rtp_timestamp_with_offset),
@@ -97,7 +98,7 @@
   uint8_t payload_type_;
   uint32_t rtp_timestamp_with_offset_;
   rtc::Buffer payload_;
-  int64_t absolute_capture_timestamp_ms_;
+  absl::optional<uint64_t> absolute_capture_timestamp_ms_;
   uint32_t ssrc_;
 };
 }  // namespace
@@ -168,12 +169,11 @@
 
 std::unique_ptr<TransformableAudioFrameInterface> CloneSenderAudioFrame(
     TransformableAudioFrameInterface* original) {
-  // TODO(crbug.com/webrtc/14949): Ensure the correct timestamps are passed.
   return std::make_unique<TransformableOutgoingAudioFrame>(
       InterfaceFrameTypeToInternalFrameType(original->Type()),
       original->GetPayloadType(), original->GetTimestamp(),
       original->GetData().data(), original->GetData().size(),
-      original->GetTimestamp(), original->GetSsrc());
+      original->AbsoluteCaptureTimestamp(), original->GetSsrc());
 }
 
 }  // namespace webrtc
diff --git a/test/mock_transformable_frame.h b/test/mock_transformable_frame.h
index 35b8d92..17d7e83 100644
--- a/test/mock_transformable_frame.h
+++ b/test/mock_transformable_frame.h
@@ -23,6 +23,10 @@
               GetContributingSources,
               (),
               (const, override));
+  MOCK_METHOD(absl::optional<uint64_t>,
+              AbsoluteCaptureTimestamp,
+              (),
+              (const, override));
   MOCK_METHOD(void, SetData, (rtc::ArrayView<const uint8_t>), (override));
   MOCK_METHOD(uint8_t, GetPayloadType, (), (const, override));
   MOCK_METHOD(uint32_t, GetSsrc, (), (const, override));