`RtpPacketInfo`: new ctor + deprecated ctors clean-up

New ctor added without optional and media specific fields.

Bug: webrtc:10739, b/246753278
Change-Id: I7e15849aced6ed0a7ada725ea171a15ea1e9bc5a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/275941
Reviewed-by: Ivo Creusen <ivoc@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38124}
diff --git a/api/rtp_packet_info.cc b/api/rtp_packet_info.cc
index db818f7..312dc33 100644
--- a/api/rtp_packet_info.cc
+++ b/api/rtp_packet_info.cc
@@ -18,6 +18,15 @@
 RtpPacketInfo::RtpPacketInfo()
     : ssrc_(0), rtp_timestamp_(0), receive_time_(Timestamp::MinusInfinity()) {}
 
+RtpPacketInfo::RtpPacketInfo(uint32_t ssrc,
+                             std::vector<uint32_t> csrcs,
+                             uint32_t rtp_timestamp,
+                             Timestamp receive_time)
+    : ssrc_(ssrc),
+      csrcs_(std::move(csrcs)),
+      rtp_timestamp_(rtp_timestamp),
+      receive_time_(receive_time) {}
+
 RtpPacketInfo::RtpPacketInfo(
     uint32_t ssrc,
     std::vector<uint32_t> csrcs,
@@ -28,9 +37,9 @@
     : ssrc_(ssrc),
       csrcs_(std::move(csrcs)),
       rtp_timestamp_(rtp_timestamp),
+      receive_time_(receive_time),
       audio_level_(audio_level),
-      absolute_capture_time_(absolute_capture_time),
-      receive_time_(receive_time) {}
+      absolute_capture_time_(absolute_capture_time) {}
 
 RtpPacketInfo::RtpPacketInfo(const RTPHeader& rtp_header,
                              Timestamp receive_time)
@@ -69,11 +78,10 @@
 bool operator==(const RtpPacketInfo& lhs, const RtpPacketInfo& rhs) {
   return (lhs.ssrc() == rhs.ssrc()) && (lhs.csrcs() == rhs.csrcs()) &&
          (lhs.rtp_timestamp() == rhs.rtp_timestamp()) &&
+         (lhs.receive_time() == rhs.receive_time()) &&
          (lhs.audio_level() == rhs.audio_level()) &&
          (lhs.absolute_capture_time() == rhs.absolute_capture_time()) &&
-         (lhs.receive_time() == rhs.receive_time() &&
-          (lhs.local_capture_clock_offset() ==
-           rhs.local_capture_clock_offset()));
+         (lhs.local_capture_clock_offset() == rhs.local_capture_clock_offset());
 }
 
 }  // namespace webrtc
diff --git a/api/rtp_packet_info.h b/api/rtp_packet_info.h
index bc9839f..f9980a1c 100644
--- a/api/rtp_packet_info.h
+++ b/api/rtp_packet_info.h
@@ -34,6 +34,13 @@
   RtpPacketInfo(uint32_t ssrc,
                 std::vector<uint32_t> csrcs,
                 uint32_t rtp_timestamp,
+                Timestamp receive_time);
+
+  // TODO(bugs.webrtc.org/12722): Deprecated, remove once downstream projects
+  // are updated.
+  RtpPacketInfo(uint32_t ssrc,
+                std::vector<uint32_t> csrcs,
+                uint32_t rtp_timestamp,
                 absl::optional<uint8_t> audio_level,
                 absl::optional<AbsoluteCaptureTime> absolute_capture_time,
                 Timestamp receive_time);
@@ -64,31 +71,36 @@
   uint32_t rtp_timestamp() const { return rtp_timestamp_; }
   void set_rtp_timestamp(uint32_t value) { rtp_timestamp_ = value; }
 
-  absl::optional<uint8_t> audio_level() const { return audio_level_; }
-  void set_audio_level(absl::optional<uint8_t> value) { audio_level_ = value; }
-
-  const absl::optional<AbsoluteCaptureTime>& absolute_capture_time() const {
-    return absolute_capture_time_;
-  }
-  void set_absolute_capture_time(
-      const absl::optional<AbsoluteCaptureTime>& value) {
-    absolute_capture_time_ = value;
-  }
-
-  const absl::optional<int64_t>& local_capture_clock_offset() const {
-    return local_capture_clock_offset_;
-  }
-
-  void set_local_capture_clock_offset(const absl::optional<int64_t>& value) {
-    local_capture_clock_offset_ = value;
-  }
-
   Timestamp receive_time() const { return receive_time_; }
   void set_receive_time(Timestamp value) { receive_time_ = value; }
   // TODO(bugs.webrtc.org/12722): Deprecated, remove once downstream projects
   // are updated.
   int64_t receive_time_ms() const { return receive_time_.ms(); }
 
+  absl::optional<uint8_t> audio_level() const { return audio_level_; }
+  RtpPacketInfo& set_audio_level(absl::optional<uint8_t> value) {
+    audio_level_ = value;
+    return *this;
+  }
+
+  const absl::optional<AbsoluteCaptureTime>& absolute_capture_time() const {
+    return absolute_capture_time_;
+  }
+  RtpPacketInfo& set_absolute_capture_time(
+      const absl::optional<AbsoluteCaptureTime>& value) {
+    absolute_capture_time_ = value;
+    return *this;
+  }
+
+  const absl::optional<int64_t>& local_capture_clock_offset() const {
+    return local_capture_clock_offset_;
+  }
+  RtpPacketInfo& set_local_capture_clock_offset(
+      const absl::optional<int64_t>& value) {
+    local_capture_clock_offset_ = value;
+    return *this;
+  }
+
  private:
   // Fields from the RTP header:
   // https://tools.ietf.org/html/rfc3550#section-5.1
@@ -96,6 +108,9 @@
   std::vector<uint32_t> csrcs_;
   uint32_t rtp_timestamp_;
 
+  // Local `webrtc::Clock`-based timestamp of when the packet was received.
+  Timestamp receive_time_;
+
   // Fields from the Audio Level header extension:
   // https://tools.ietf.org/html/rfc6464#section-3
   absl::optional<uint8_t> audio_level_;
@@ -112,9 +127,6 @@
   // Clock offset against capturer's clock. Should be derived from the estimated
   // capture clock offset defined in the Absolute Capture Time header extension.
   absl::optional<int64_t> local_capture_clock_offset_;
-
-  // Local `webrtc::Clock`-based timestamp of when the packet was received.
-  Timestamp receive_time_;
 };
 
 bool operator==(const RtpPacketInfo& lhs, const RtpPacketInfo& rhs);
diff --git a/api/rtp_packet_info_unittest.cc b/api/rtp_packet_info_unittest.cc
index 0e82aef..80abccc 100644
--- a/api/rtp_packet_info_unittest.cc
+++ b/api/rtp_packet_info_unittest.cc
@@ -15,7 +15,7 @@
 namespace webrtc {
 
 TEST(RtpPacketInfoTest, Ssrc) {
-  const uint32_t value = 4038189233;
+  constexpr uint32_t kValue = 4038189233;
 
   RtpPacketInfo lhs;
   RtpPacketInfo rhs;
@@ -23,8 +23,8 @@
   EXPECT_TRUE(lhs == rhs);
   EXPECT_FALSE(lhs != rhs);
 
-  rhs.set_ssrc(value);
-  EXPECT_EQ(rhs.ssrc(), value);
+  rhs.set_ssrc(kValue);
+  EXPECT_EQ(rhs.ssrc(), kValue);
 
   EXPECT_FALSE(lhs == rhs);
   EXPECT_TRUE(lhs != rhs);
@@ -35,10 +35,11 @@
   EXPECT_FALSE(lhs != rhs);
 
   rhs = RtpPacketInfo();
-  EXPECT_NE(rhs.ssrc(), value);
+  EXPECT_NE(rhs.ssrc(), kValue);
 
-  rhs = RtpPacketInfo(value, {}, {}, {}, {}, Timestamp::Zero());
-  EXPECT_EQ(rhs.ssrc(), value);
+  rhs = RtpPacketInfo(/*ssrc=*/kValue, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                      /*receive_time=*/Timestamp::Zero());
+  EXPECT_EQ(rhs.ssrc(), kValue);
 }
 
 TEST(RtpPacketInfoTest, Csrcs) {
@@ -64,12 +65,13 @@
   rhs = RtpPacketInfo();
   EXPECT_NE(rhs.csrcs(), value);
 
-  rhs = RtpPacketInfo({}, value, {}, {}, {}, Timestamp::Zero());
+  rhs = RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/value, /*rtp_timestamp=*/{},
+                      /*receive_time=*/Timestamp::Zero());
   EXPECT_EQ(rhs.csrcs(), value);
 }
 
 TEST(RtpPacketInfoTest, RtpTimestamp) {
-  const uint32_t value = 4038189233;
+  constexpr uint32_t kValue = 4038189233;
 
   RtpPacketInfo lhs;
   RtpPacketInfo rhs;
@@ -77,8 +79,8 @@
   EXPECT_TRUE(lhs == rhs);
   EXPECT_FALSE(lhs != rhs);
 
-  rhs.set_rtp_timestamp(value);
-  EXPECT_EQ(rhs.rtp_timestamp(), value);
+  rhs.set_rtp_timestamp(kValue);
+  EXPECT_EQ(rhs.rtp_timestamp(), kValue);
 
   EXPECT_FALSE(lhs == rhs);
   EXPECT_TRUE(lhs != rhs);
@@ -89,97 +91,15 @@
   EXPECT_FALSE(lhs != rhs);
 
   rhs = RtpPacketInfo();
-  EXPECT_NE(rhs.rtp_timestamp(), value);
+  EXPECT_NE(rhs.rtp_timestamp(), kValue);
 
-  rhs = RtpPacketInfo({}, {}, value, {}, {}, Timestamp::Zero());
-  EXPECT_EQ(rhs.rtp_timestamp(), value);
-}
-
-TEST(RtpPacketInfoTest, AudioLevel) {
-  const absl::optional<uint8_t> value = 31;
-
-  RtpPacketInfo lhs;
-  RtpPacketInfo rhs;
-
-  EXPECT_TRUE(lhs == rhs);
-  EXPECT_FALSE(lhs != rhs);
-
-  rhs.set_audio_level(value);
-  EXPECT_EQ(rhs.audio_level(), value);
-
-  EXPECT_FALSE(lhs == rhs);
-  EXPECT_TRUE(lhs != rhs);
-
-  lhs = rhs;
-
-  EXPECT_TRUE(lhs == rhs);
-  EXPECT_FALSE(lhs != rhs);
-
-  rhs = RtpPacketInfo();
-  EXPECT_NE(rhs.audio_level(), value);
-
-  rhs = RtpPacketInfo({}, {}, {}, value, {}, Timestamp::Zero());
-  EXPECT_EQ(rhs.audio_level(), value);
-}
-
-TEST(RtpPacketInfoTest, AbsoluteCaptureTime) {
-  const absl::optional<AbsoluteCaptureTime> value = AbsoluteCaptureTime{12, 34};
-
-  RtpPacketInfo lhs;
-  RtpPacketInfo rhs;
-
-  EXPECT_TRUE(lhs == rhs);
-  EXPECT_FALSE(lhs != rhs);
-
-  rhs.set_absolute_capture_time(value);
-  EXPECT_EQ(rhs.absolute_capture_time(), value);
-
-  EXPECT_FALSE(lhs == rhs);
-  EXPECT_TRUE(lhs != rhs);
-
-  lhs = rhs;
-
-  EXPECT_TRUE(lhs == rhs);
-  EXPECT_FALSE(lhs != rhs);
-
-  rhs = RtpPacketInfo();
-  EXPECT_NE(rhs.absolute_capture_time(), value);
-
-  rhs = RtpPacketInfo({}, {}, {}, {}, value, Timestamp::Zero());
-  EXPECT_EQ(rhs.absolute_capture_time(), value);
-}
-
-TEST(RtpPacketInfoTest, LocalCaptureClockOffset) {
-  RtpPacketInfo lhs;
-  RtpPacketInfo rhs;
-
-  EXPECT_TRUE(lhs == rhs);
-  EXPECT_FALSE(lhs != rhs);
-
-  const absl::optional<int64_t> value = 10;
-  rhs.set_local_capture_clock_offset(value);
-  EXPECT_EQ(rhs.local_capture_clock_offset(), value);
-
-  EXPECT_FALSE(lhs == rhs);
-  EXPECT_TRUE(lhs != rhs);
-
-  lhs = rhs;
-
-  EXPECT_TRUE(lhs == rhs);
-  EXPECT_FALSE(lhs != rhs);
-
-  // Default local capture clock offset is null.
-  rhs = RtpPacketInfo();
-  EXPECT_EQ(rhs.local_capture_clock_offset(), absl::nullopt);
-
-  // Default local capture clock offset is null.
-  rhs = RtpPacketInfo({}, {}, {}, {}, AbsoluteCaptureTime{12, 34},
-                      Timestamp::Zero());
-  EXPECT_EQ(rhs.local_capture_clock_offset(), absl::nullopt);
+  rhs = RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/kValue,
+                      /*receive_time=*/Timestamp::Zero());
+  EXPECT_EQ(rhs.rtp_timestamp(), kValue);
 }
 
 TEST(RtpPacketInfoTest, ReceiveTimeMs) {
-  const Timestamp timestamp = Timestamp::Micros(8868963877546349045LL);
+  constexpr Timestamp kValue = Timestamp::Micros(8868963877546349045LL);
 
   RtpPacketInfo lhs;
   RtpPacketInfo rhs;
@@ -187,8 +107,8 @@
   EXPECT_TRUE(lhs == rhs);
   EXPECT_FALSE(lhs != rhs);
 
-  rhs.set_receive_time(timestamp);
-  EXPECT_EQ(rhs.receive_time(), timestamp);
+  rhs.set_receive_time(kValue);
+  EXPECT_EQ(rhs.receive_time(), kValue);
 
   EXPECT_FALSE(lhs == rhs);
   EXPECT_TRUE(lhs != rhs);
@@ -199,10 +119,99 @@
   EXPECT_FALSE(lhs != rhs);
 
   rhs = RtpPacketInfo();
-  EXPECT_NE(rhs.receive_time(), timestamp);
+  EXPECT_NE(rhs.receive_time(), kValue);
 
-  rhs = RtpPacketInfo({}, {}, {}, {}, {}, timestamp);
-  EXPECT_EQ(rhs.receive_time(), timestamp);
+  rhs = RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                      /*receive_time=*/kValue);
+  EXPECT_EQ(rhs.receive_time(), kValue);
+}
+
+TEST(RtpPacketInfoTest, AudioLevel) {
+  constexpr absl::optional<uint8_t> kValue = 31;
+
+  RtpPacketInfo lhs;
+  RtpPacketInfo rhs;
+
+  EXPECT_TRUE(lhs == rhs);
+  EXPECT_FALSE(lhs != rhs);
+
+  rhs.set_audio_level(kValue);
+  EXPECT_EQ(rhs.audio_level(), kValue);
+
+  EXPECT_FALSE(lhs == rhs);
+  EXPECT_TRUE(lhs != rhs);
+
+  lhs = rhs;
+
+  EXPECT_TRUE(lhs == rhs);
+  EXPECT_FALSE(lhs != rhs);
+
+  rhs = RtpPacketInfo();
+  EXPECT_NE(rhs.audio_level(), kValue);
+
+  rhs = RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                      /*receive_time=*/Timestamp::Zero());
+  rhs.set_audio_level(kValue);
+  EXPECT_EQ(rhs.audio_level(), kValue);
+}
+
+TEST(RtpPacketInfoTest, AbsoluteCaptureTime) {
+  constexpr absl::optional<AbsoluteCaptureTime> kValue = AbsoluteCaptureTime{
+      .absolute_capture_timestamp = 12, .estimated_capture_clock_offset = 34};
+
+  RtpPacketInfo lhs;
+  RtpPacketInfo rhs;
+
+  EXPECT_TRUE(lhs == rhs);
+  EXPECT_FALSE(lhs != rhs);
+
+  rhs.set_absolute_capture_time(kValue);
+  EXPECT_EQ(rhs.absolute_capture_time(), kValue);
+
+  EXPECT_FALSE(lhs == rhs);
+  EXPECT_TRUE(lhs != rhs);
+
+  lhs = rhs;
+
+  EXPECT_TRUE(lhs == rhs);
+  EXPECT_FALSE(lhs != rhs);
+
+  rhs = RtpPacketInfo();
+  EXPECT_NE(rhs.absolute_capture_time(), kValue);
+
+  rhs = RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                      /*receive_time=*/Timestamp::Zero());
+  rhs.set_absolute_capture_time(kValue);
+  EXPECT_EQ(rhs.absolute_capture_time(), kValue);
+}
+
+TEST(RtpPacketInfoTest, LocalCaptureClockOffset) {
+  constexpr absl::optional<int64_t> kValue = 10;
+
+  RtpPacketInfo lhs;
+  RtpPacketInfo rhs;
+
+  EXPECT_TRUE(lhs == rhs);
+  EXPECT_FALSE(lhs != rhs);
+
+  rhs.set_local_capture_clock_offset(kValue);
+  EXPECT_EQ(rhs.local_capture_clock_offset(), kValue);
+
+  EXPECT_FALSE(lhs == rhs);
+  EXPECT_TRUE(lhs != rhs);
+
+  lhs = rhs;
+
+  EXPECT_TRUE(lhs == rhs);
+  EXPECT_FALSE(lhs != rhs);
+
+  rhs = RtpPacketInfo();
+  EXPECT_EQ(rhs.local_capture_clock_offset(), absl::nullopt);
+
+  rhs = RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                      /*receive_time=*/Timestamp::Zero());
+  rhs.set_local_capture_clock_offset(kValue);
+  EXPECT_EQ(rhs.local_capture_clock_offset(), kValue);
 }
 
 }  // namespace webrtc
diff --git a/api/rtp_packet_infos_unittest.cc b/api/rtp_packet_infos_unittest.cc
index e83358f..a90cfa0 100644
--- a/api/rtp_packet_infos_unittest.cc
+++ b/api/rtp_packet_infos_unittest.cc
@@ -27,12 +27,23 @@
 }  // namespace
 
 TEST(RtpPacketInfosTest, BasicFunctionality) {
-  RtpPacketInfo p0(123, {1, 2}, 89, 5, AbsoluteCaptureTime{45, 78},
-                   Timestamp::Millis(7));
-  RtpPacketInfo p1(456, {3, 4}, 89, 4, AbsoluteCaptureTime{13, 21},
-                   Timestamp::Millis(1));
-  RtpPacketInfo p2(789, {5, 6}, 88, 1, AbsoluteCaptureTime{99, 78},
-                   Timestamp::Millis(7));
+  RtpPacketInfo p0(/*ssrc=*/123, /*csrcs=*/{1, 2}, /*rtp_timestamp=*/89,
+                   /*receive_time=*/Timestamp::Millis(7));
+  p0.set_audio_level(5);
+  p0.set_absolute_capture_time(AbsoluteCaptureTime{
+      .absolute_capture_timestamp = 45, .estimated_capture_clock_offset = 78});
+
+  RtpPacketInfo p1(/*ssrc=*/456, /*csrcs=*/{3, 4}, /*rtp_timestamp=*/89,
+                   /*receive_time=*/Timestamp::Millis(1));
+  p1.set_audio_level(4);
+  p1.set_absolute_capture_time(AbsoluteCaptureTime{
+      .absolute_capture_timestamp = 13, .estimated_capture_clock_offset = 21});
+
+  RtpPacketInfo p2(/*ssrc=*/789, /*csrcs=*/{5, 6}, /*rtp_timestamp=*/88,
+                   /*receive_time=*/Timestamp::Millis(7));
+  p2.set_audio_level(1);
+  p2.set_absolute_capture_time(AbsoluteCaptureTime{
+      .absolute_capture_timestamp = 99, .estimated_capture_clock_offset = 78});
 
   RtpPacketInfos x({p0, p1, p2});
 
@@ -55,12 +66,23 @@
 }
 
 TEST(RtpPacketInfosTest, CopyShareData) {
-  RtpPacketInfo p0(123, {1, 2}, 89, 5, AbsoluteCaptureTime{45, 78},
-                   Timestamp::Millis(7));
-  RtpPacketInfo p1(456, {3, 4}, 89, 4, AbsoluteCaptureTime{13, 21},
-                   Timestamp::Millis(1));
-  RtpPacketInfo p2(789, {5, 6}, 88, 1, AbsoluteCaptureTime{99, 78},
-                   Timestamp::Millis(7));
+  RtpPacketInfo p0(/*ssrc=*/123, /*csrcs=*/{1, 2}, /*rtp_timestamp=*/89,
+                   /*receive_time=*/Timestamp::Millis(7));
+  p0.set_audio_level(5);
+  p0.set_absolute_capture_time(AbsoluteCaptureTime{
+      .absolute_capture_timestamp = 45, .estimated_capture_clock_offset = 78});
+
+  RtpPacketInfo p1(/*ssrc=*/456, /*csrcs=*/{3, 4}, /*rtp_timestamp=*/89,
+                   /*receive_time=*/Timestamp::Millis(1));
+  p1.set_audio_level(4);
+  p1.set_absolute_capture_time(AbsoluteCaptureTime{
+      .absolute_capture_timestamp = 13, .estimated_capture_clock_offset = 21});
+
+  RtpPacketInfo p2(/*ssrc=*/789, /*csrcs=*/{5, 6}, /*rtp_timestamp=*/88,
+                   /*receive_time=*/Timestamp::Millis(7));
+  p2.set_audio_level(1);
+  p2.set_absolute_capture_time(AbsoluteCaptureTime{
+      .absolute_capture_timestamp = 99, .estimated_capture_clock_offset = 78});
 
   RtpPacketInfos lhs({p0, p1, p2});
   RtpPacketInfos rhs = lhs;
diff --git a/modules/audio_coding/neteq/red_payload_splitter.cc b/modules/audio_coding/neteq/red_payload_splitter.cc
index 7438f25..cec9f2f 100644
--- a/modules/audio_coding/neteq/red_payload_splitter.cc
+++ b/modules/audio_coding/neteq/red_payload_splitter.cc
@@ -136,9 +136,9 @@
             /*ssrc=*/red_packet.packet_info.ssrc(),
             /*csrcs=*/std::vector<uint32_t>(),
             /*rtp_timestamp=*/new_packet.timestamp,
-            red_packet.packet_info.audio_level(),
-            /*absolute_capture_time=*/absl::nullopt,
             /*receive_time=*/red_packet.packet_info.receive_time());
+        new_packet.packet_info.set_audio_level(
+            red_packet.packet_info.audio_level());
         new_packets.push_front(std::move(new_packet));
         payload_ptr += payload_length;
       }
diff --git a/modules/audio_mixer/audio_mixer_impl_unittest.cc b/modules/audio_mixer/audio_mixer_impl_unittest.cc
index 20b7d29..e4b12a7 100644
--- a/modules/audio_mixer/audio_mixer_impl_unittest.cc
+++ b/modules/audio_mixer/audio_mixer_impl_unittest.cc
@@ -665,30 +665,29 @@
   const Timestamp kReceiveTime0 = Timestamp::Millis(10);
   const Timestamp kReceiveTime1 = Timestamp::Millis(20);
 
-  const RtpPacketInfo kPacketInfo0(kSsrc0, {kCsrc0, kCsrc1}, kRtpTimestamp0,
-                                   kAudioLevel0, absl::nullopt, kReceiveTime0);
-  const RtpPacketInfo kPacketInfo1(kSsrc1, {kCsrc2}, kRtpTimestamp1,
-                                   kAudioLevel1, absl::nullopt, kReceiveTime1);
-  const RtpPacketInfo kPacketInfo2(kSsrc2, {kCsrc3}, kRtpTimestamp1,
-                                   kAudioLevel2, absl::nullopt, kReceiveTime1);
+  RtpPacketInfo p0(kSsrc0, {kCsrc0, kCsrc1}, kRtpTimestamp0, kReceiveTime0);
+  p0.set_audio_level(kAudioLevel0);
+  RtpPacketInfo p1(kSsrc1, {kCsrc2}, kRtpTimestamp1, kReceiveTime1);
+  p1.set_audio_level(kAudioLevel1);
+  RtpPacketInfo p2(kSsrc2, {kCsrc3}, kRtpTimestamp1, kReceiveTime1);
+  p2.set_audio_level(kAudioLevel2);
 
   const auto mixer = AudioMixerImpl::Create();
 
   MockMixerAudioSource source;
-  source.set_packet_infos(RtpPacketInfos({kPacketInfo0}));
+  source.set_packet_infos(RtpPacketInfos({p0}));
   mixer->AddSource(&source);
   ResetFrame(source.fake_frame());
   mixer->Mix(1, &frame_for_mixing);
 
   MockMixerAudioSource other_source;
-  other_source.set_packet_infos(RtpPacketInfos({kPacketInfo1, kPacketInfo2}));
+  other_source.set_packet_infos(RtpPacketInfos({p1, p2}));
   ResetFrame(other_source.fake_frame());
   mixer->AddSource(&other_source);
 
   mixer->Mix(/*number_of_channels=*/1, &frame_for_mixing);
 
-  EXPECT_THAT(frame_for_mixing.packet_infos_,
-              UnorderedElementsAre(kPacketInfo0, kPacketInfo1, kPacketInfo2));
+  EXPECT_THAT(frame_for_mixing.packet_infos_, UnorderedElementsAre(p0, p1, p2));
 }
 
 TEST(AudioMixer, MixerShouldIncludeRtpPacketInfoFromMixedSourcesOnly) {
@@ -706,25 +705,23 @@
   const Timestamp kReceiveTime0 = Timestamp::Millis(10);
   const Timestamp kReceiveTime1 = Timestamp::Millis(20);
 
-  const RtpPacketInfo kPacketInfo0(kSsrc0, {kCsrc0, kCsrc1}, kRtpTimestamp0,
-                                   kAudioLevel0, absl::nullopt, kReceiveTime0);
-  const RtpPacketInfo kPacketInfo1(kSsrc1, {kCsrc2}, kRtpTimestamp1,
-                                   kAudioLevelMissing, absl::nullopt,
-                                   kReceiveTime1);
-  const RtpPacketInfo kPacketInfo2(kSsrc2, {kCsrc3}, kRtpTimestamp1,
-                                   kAudioLevelMissing, absl::nullopt,
-                                   kReceiveTime1);
+  RtpPacketInfo p0(kSsrc0, {kCsrc0, kCsrc1}, kRtpTimestamp0, kReceiveTime0);
+  p0.set_audio_level(kAudioLevel0);
+  RtpPacketInfo p1(kSsrc1, {kCsrc2}, kRtpTimestamp1, kReceiveTime1);
+  p1.set_audio_level(kAudioLevelMissing);
+  RtpPacketInfo p2(kSsrc2, {kCsrc3}, kRtpTimestamp1, kReceiveTime1);
+  p2.set_audio_level(kAudioLevelMissing);
 
   const auto mixer = AudioMixerImpl::Create(/*max_sources_to_mix=*/2);
 
   MockMixerAudioSource source1;
-  source1.set_packet_infos(RtpPacketInfos({kPacketInfo0}));
+  source1.set_packet_infos(RtpPacketInfos({p0}));
   mixer->AddSource(&source1);
   ResetFrame(source1.fake_frame());
   mixer->Mix(1, &frame_for_mixing);
 
   MockMixerAudioSource source2;
-  source2.set_packet_infos(RtpPacketInfos({kPacketInfo1}));
+  source2.set_packet_infos(RtpPacketInfos({p1}));
   ResetFrame(source2.fake_frame());
   mixer->AddSource(&source2);
 
@@ -732,15 +729,14 @@
   // We limit the number of sources to mix to 2 and set the third source's VAD
   // activity to kVadPassive so that it will not be added to the mix.
   MockMixerAudioSource source3;
-  source3.set_packet_infos(RtpPacketInfos({kPacketInfo2}));
+  source3.set_packet_infos(RtpPacketInfos({p2}));
   ResetFrame(source3.fake_frame());
   source3.fake_frame()->vad_activity_ = AudioFrame::kVadPassive;
   mixer->AddSource(&source3);
 
   mixer->Mix(/*number_of_channels=*/1, &frame_for_mixing);
 
-  EXPECT_THAT(frame_for_mixing.packet_infos_,
-              UnorderedElementsAre(kPacketInfo0, kPacketInfo1));
+  EXPECT_THAT(frame_for_mixing.packet_infos_, UnorderedElementsAre(p0, p1));
 }
 
 class HighOutputRateCalculator : public OutputRateCalculator {
diff --git a/modules/audio_mixer/frame_combiner_unittest.cc b/modules/audio_mixer/frame_combiner_unittest.cc
index fa1fef3..36bf3a0 100644
--- a/modules/audio_mixer/frame_combiner_unittest.cc
+++ b/modules/audio_mixer/frame_combiner_unittest.cc
@@ -21,6 +21,7 @@
 #include "api/array_view.h"
 #include "api/rtp_packet_info.h"
 #include "api/rtp_packet_infos.h"
+#include "api/units/timestamp.h"
 #include "audio/utility/audio_frame_operations.h"
 #include "modules/audio_mixer/gain_change_calculator.h"
 #include "modules/audio_mixer/sine_wave_generator.h"
@@ -69,18 +70,15 @@
 AudioFrame frame2;
 
 void SetUpFrames(int sample_rate_hz, int number_of_channels) {
-  RtpPacketInfo packet_info1(
-      /*ssrc=*/1001, /*csrcs=*/{}, /*rtp_timestamp=*/1000,
-      /*audio_level=*/absl::nullopt, /*absolute_capture_time=*/absl::nullopt,
-      /*receive_time_ms=*/1);
-  RtpPacketInfo packet_info2(
-      /*ssrc=*/4004, /*csrcs=*/{}, /*rtp_timestamp=*/1234,
-      /*audio_level=*/absl::nullopt, /*absolute_capture_time=*/absl::nullopt,
-      /*receive_time_ms=*/2);
-  RtpPacketInfo packet_info3(
-      /*ssrc=*/7007, /*csrcs=*/{}, /*rtp_timestamp=*/1333,
-      /*audio_level=*/absl::nullopt, /*absolute_capture_time=*/absl::nullopt,
-      /*receive_time_ms=*/2);
+  RtpPacketInfo packet_info1(/*ssrc=*/1001, /*csrcs=*/{},
+                             /*rtp_timestamp=*/1000,
+                             /*receive_time=*/Timestamp::Millis(1));
+  RtpPacketInfo packet_info2(/*ssrc=*/4004, /*csrcs=*/{},
+                             /*rtp_timestamp=*/1234,
+                             /*receive_time=*/Timestamp::Millis(2));
+  RtpPacketInfo packet_info3(/*ssrc=*/7007, /*csrcs=*/{},
+                             /*rtp_timestamp=*/1333,
+                             /*receive_time=*/Timestamp::Millis(2));
 
   frame1.packet_infos_ = RtpPacketInfos({packet_info1});
   frame2.packet_infos_ = RtpPacketInfos({packet_info2, packet_info3});
diff --git a/modules/rtp_rtcp/source/source_tracker_unittest.cc b/modules/rtp_rtcp/source/source_tracker_unittest.cc
index 4cd8ab8..e0440a0 100644
--- a/modules/rtp_rtcp/source/source_tracker_unittest.cc
+++ b/modules/rtp_rtcp/source/source_tracker_unittest.cc
@@ -108,10 +108,11 @@
 
     RtpPacketInfos::vector_type packet_infos;
     for (size_t i = 0; i < count; ++i) {
-      packet_infos.emplace_back(GenerateSsrc(), GenerateCsrcs(),
-                                GenerateRtpTimestamp(), GenerateAudioLevel(),
-                                GenerateAbsoluteCaptureTime(),
-                                GenerateReceiveTime());
+      packet_infos
+          .emplace_back(GenerateSsrc(), GenerateCsrcs(), GenerateRtpTimestamp(),
+                        GenerateReceiveTime())
+          .set_audio_level(GenerateAudioLevel())
+          .set_absolute_capture_time(GenerateAbsoluteCaptureTime());
     }
 
     return RtpPacketInfos(std::move(packet_infos));
@@ -260,10 +261,12 @@
   SourceTracker tracker(&clock);
 
   tracker.OnFrameDelivered(RtpPacketInfos(
-      {RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kAudioLevel0,
-                     kAbsoluteCaptureTime, kReceiveTime0),
-       RtpPacketInfo(kSsrc2, {kCsrcs2}, kRtpTimestamp1, kAudioLevel1,
-                     kAbsoluteCaptureTime, kReceiveTime1)}));
+      {RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kReceiveTime0)
+           .set_audio_level(kAudioLevel0)
+           .set_absolute_capture_time(kAbsoluteCaptureTime),
+       RtpPacketInfo(kSsrc2, {kCsrcs2}, kRtpTimestamp1, kReceiveTime1)
+           .set_audio_level(kAudioLevel1)
+           .set_absolute_capture_time(kAbsoluteCaptureTime)}));
 
   int64_t timestamp_ms = clock.TimeInMilliseconds();
   constexpr RtpSource::Extensions extensions0 = {
@@ -307,13 +310,17 @@
   SimulatedClock clock(1000000000000ULL);
   SourceTracker tracker(&clock);
 
-  tracker.OnFrameDelivered(RtpPacketInfos(
-      {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kAudioLevel0,
-                     kAbsoluteCaptureTime, kReceiveTime0),
-       RtpPacketInfo(kSsrc, {kCsrcs2}, kRtpTimestamp1, kAudioLevel1,
-                     kAbsoluteCaptureTime, kReceiveTime1),
-       RtpPacketInfo(kSsrc, {kCsrcs0}, kRtpTimestamp2, kAudioLevel2,
-                     kAbsoluteCaptureTime, kReceiveTime2)}));
+  tracker.OnFrameDelivered(RtpPacketInfos({
+      RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kReceiveTime0)
+          .set_audio_level(kAudioLevel0)
+          .set_absolute_capture_time(kAbsoluteCaptureTime),
+      RtpPacketInfo(kSsrc, {kCsrcs2}, kRtpTimestamp1, kReceiveTime1)
+          .set_audio_level(kAudioLevel1)
+          .set_absolute_capture_time(kAbsoluteCaptureTime),
+      RtpPacketInfo(kSsrc, {kCsrcs0}, kRtpTimestamp2, kReceiveTime2)
+          .set_audio_level(kAudioLevel2)
+          .set_absolute_capture_time(kAbsoluteCaptureTime),
+  }));
 
   int64_t timestamp_ms = clock.TimeInMilliseconds();
   constexpr RtpSource::Extensions extensions0 = {kAudioLevel0,
@@ -370,8 +377,9 @@
   SourceTracker tracker(&clock);
 
   tracker.OnFrameDelivered(RtpPacketInfos(
-      {RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kAudioLevel0,
-                     kAbsoluteCaptureTime0, kReceiveTime0)}));
+      {RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kReceiveTime0)
+           .set_audio_level(kAudioLevel0)
+           .set_absolute_capture_time(kAbsoluteCaptureTime0)}));
 
   int64_t timestamp_ms_0 = clock.TimeInMilliseconds();
   EXPECT_THAT(
@@ -387,8 +395,9 @@
 
   clock.AdvanceTimeMilliseconds(17);
   tracker.OnFrameDelivered(RtpPacketInfos(
-      {RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs2}, kRtpTimestamp1, kAudioLevel1,
-                     kAbsoluteCaptureTime1, kReceiveTime1)}));
+      {RtpPacketInfo(kSsrc1, {kCsrcs0, kCsrcs2}, kRtpTimestamp1, kReceiveTime1)
+           .set_audio_level(kAudioLevel1)
+           .set_absolute_capture_time(kAbsoluteCaptureTime1)}));
 
   int64_t timestamp_ms_1 = clock.TimeInMilliseconds();
 
@@ -405,9 +414,11 @@
 
   // Deliver more packets with update csrcs and a new ssrc.
   clock.AdvanceTimeMilliseconds(17);
+
   tracker.OnFrameDelivered(RtpPacketInfos(
-      {RtpPacketInfo(kSsrc2, {kCsrcs0}, kRtpTimestamp2, kAudioLevel2,
-                     kAbsoluteCaptureTime2, kReceiveTime2)}));
+      {RtpPacketInfo(kSsrc2, {kCsrcs0}, kRtpTimestamp2, kReceiveTime2)
+           .set_audio_level(kAudioLevel2)
+           .set_absolute_capture_time(kAbsoluteCaptureTime2)}));
 
   int64_t timestamp_ms_2 = clock.TimeInMilliseconds();
 
@@ -445,14 +456,16 @@
   SourceTracker tracker(&clock);
 
   tracker.OnFrameDelivered(RtpPacketInfos(
-      {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kAudioLevel0,
-                     kAbsoluteCaptureTime0, kReceiveTime0)}));
+      {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kReceiveTime0)
+           .set_audio_level(kAudioLevel0)
+           .set_absolute_capture_time(kAbsoluteCaptureTime0)}));
 
   clock.AdvanceTimeMilliseconds(17);
 
   tracker.OnFrameDelivered(RtpPacketInfos(
-      {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs2}, kRtpTimestamp1, kAudioLevel1,
-                     kAbsoluteCaptureTime1, kReceiveTime1)}));
+      {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs2}, kRtpTimestamp1, kReceiveTime1)
+           .set_audio_level(kAudioLevel1)
+           .set_absolute_capture_time(kAbsoluteCaptureTime1)}));
 
   int64_t timestamp_ms_1 = clock.TimeInMilliseconds();
 
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc
index 3220cc0..2396053 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc
@@ -72,8 +72,6 @@
       /*ssrc=*/1,
       /*csrcs=*/{},
       /*rtp_timestamp=*/frame.timestamp(),
-      /*audio_level=*/absl::nullopt,
-      /*absolute_capture_time=*/absl::nullopt,
       /*receive_time=*/Timestamp::Micros(frame.timestamp_us() + 10000)));
   image.SetPacketInfos(RtpPacketInfos(packet_infos));
   return image;
diff --git a/video/receive_statistics_proxy2_unittest.cc b/video/receive_statistics_proxy2_unittest.cc
index 45adff8..5061552 100644
--- a/video/receive_statistics_proxy2_unittest.cc
+++ b/video/receive_statistics_proxy2_unittest.cc
@@ -190,8 +190,8 @@
   // We set receive time fixed and increase the clock by 10ms
   // in the loop which will increase the processing delay by
   // 10/20/30ms respectively.
-  RtpPacketInfos::vector_type packet_infos = {
-      RtpPacketInfo({}, {}, {}, {}, {}, Now())};
+  RtpPacketInfos::vector_type packet_infos = {RtpPacketInfo(
+      /*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{}, /*receive_time=*/Now())};
   frame.set_packet_infos(RtpPacketInfos(packet_infos));
   for (int i = 1; i <= 3; ++i) {
     time_controller_.AdvanceTime(kProcessingDelay);
@@ -228,8 +228,8 @@
 
   // A single-packet frame will not increase total assembly time
   // and frames assembled.
-  RtpPacketInfos::vector_type single_packet_frame = {
-      RtpPacketInfo({}, {}, {}, {}, {}, Now())};
+  RtpPacketInfos::vector_type single_packet_frame = {RtpPacketInfo(
+      /*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{}, /*receive_time=*/Now())};
   frame.set_packet_infos(RtpPacketInfos(single_packet_frame));
   statistics_proxy_->OnDecodedFrame(frame, absl::nullopt, TimeDelta::Millis(1),
                                     VideoContentType::UNSPECIFIED);
@@ -243,9 +243,12 @@
 
   // In an ordered frame the first and last packet matter.
   RtpPacketInfos::vector_type ordered_frame = {
-      RtpPacketInfo({}, {}, {}, {}, {}, Now()),
-      RtpPacketInfo({}, {}, {}, {}, {}, Now() + kAssemblyTime),
-      RtpPacketInfo({}, {}, {}, {}, {}, Now() + 2 * kAssemblyTime),
+      RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                    /*receive_time=*/Now()),
+      RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                    /*receive_time=*/Now() + kAssemblyTime),
+      RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                    /*receive_time=*/Now() + 2 * kAssemblyTime),
   };
   frame.set_packet_infos(RtpPacketInfos(ordered_frame));
   statistics_proxy_->OnDecodedFrame(frame, 1u, TimeDelta::Millis(3),
@@ -264,9 +267,12 @@
 
   // "First" and "last" are in receive time, not sequence number.
   RtpPacketInfos::vector_type unordered_frame = {
-      RtpPacketInfo({}, {}, {}, {}, {}, Now() + 2 * kAssemblyTime),
-      RtpPacketInfo({}, {}, {}, {}, {}, Now()),
-      RtpPacketInfo({}, {}, {}, {}, {}, Now() + kAssemblyTime),
+      RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                    /*receive_time=*/Now() + 2 * kAssemblyTime),
+      RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                    /*receive_time=*/Now()),
+      RtpPacketInfo(/*ssrc=*/{}, /*csrcs=*/{}, /*rtp_timestamp=*/{},
+                    /*receive_time=*/Now() + kAssemblyTime),
   };
   frame.set_packet_infos(RtpPacketInfos(unordered_frame));
   statistics_proxy_->OnDecodedFrame(frame, 1u, TimeDelta::Millis(3),
diff --git a/video/rtp_video_stream_receiver2.cc b/video/rtp_video_stream_receiver2.cc
index 4748257..fb85766 100644
--- a/video/rtp_video_stream_receiver2.cc
+++ b/video/rtp_video_stream_receiver2.cc
@@ -507,15 +507,13 @@
 
   int64_t unwrapped_rtp_seq_num =
       rtp_seq_num_unwrapper_.Unwrap(rtp_packet.SequenceNumber());
-  auto& packet_info =
+
+  RtpPacketInfo& packet_info =
       packet_infos_
-          .emplace(
-              unwrapped_rtp_seq_num,
-              RtpPacketInfo(
-                  rtp_packet.Ssrc(), rtp_packet.Csrcs(), rtp_packet.Timestamp(),
-                  /*audio_level=*/absl::nullopt,
-                  rtp_packet.GetExtension<AbsoluteCaptureTimeExtension>(),
-                  /*receive_time_ms=*/clock_->CurrentTime()))
+          .emplace(unwrapped_rtp_seq_num,
+                   RtpPacketInfo(rtp_packet.Ssrc(), rtp_packet.Csrcs(),
+                                 rtp_packet.Timestamp(),
+                                 /*receive_time_ms=*/clock_->CurrentTime()))
           .first->second;
 
   // Try to extrapolate absolute capture time if it is missing.
@@ -525,7 +523,8 @@
                                                      packet_info.csrcs()),
           packet_info.rtp_timestamp(),
           // Assume frequency is the same one for all video frames.
-          kVideoPayloadTypeFrequency, packet_info.absolute_capture_time()));
+          kVideoPayloadTypeFrequency,
+          rtp_packet.GetExtension<AbsoluteCaptureTimeExtension>()));
 
   RTPVideoHeader& video_header = packet->video_header;
   video_header.rotation = kVideoRotation_0;