Move ownership of PlayoutDelayOracle

Moved from RtpSender to RtpSenderVideo, since currently the
PlayoutDelay extension is used for video only, and configured via
RTPVideoHeader.

Bug: webrtc:7135
Change-Id: Idfcc90cefea83e40a4e79164d7914cdcd50e41fe
Reviewed-on: https://webrtc-review.googlesource.com/c/120357
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26484}
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
index b2b6e7c..7f42a62 100644
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/modules/rtp_rtcp/source/rtp_sender.cc
@@ -23,7 +23,6 @@
 #include "modules/remote_bitrate_estimator/test/bwe_test_logging.h"
 #include "modules/rtp_rtcp/include/rtp_cvo.h"
 #include "modules/rtp_rtcp/source/byte_io.h"
-#include "modules/rtp_rtcp/source/playout_delay_oracle.h"
 #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h"
 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
@@ -344,7 +343,6 @@
                                  const RTPVideoHeader* rtp_header,
                                  uint32_t* transport_frame_id_out,
                                  int64_t expected_retransmission_time_ms) {
-  uint32_t ssrc;
   uint16_t sequence_number;
   uint32_t rtp_timestamp;
   {
@@ -352,7 +350,6 @@
     rtc::CritScope lock(&send_critsect_);
     RTC_DCHECK(ssrc_);
 
-    ssrc = *ssrc_;
     sequence_number = sequence_number_;
     rtp_timestamp = timestamp_offset_ + capture_timestamp;
     if (transport_frame_id_out)
@@ -388,20 +385,6 @@
     if (frame_type == kEmptyFrame)
       return true;
 
-    if (rtp_header) {
-      // TODO(nisse): This way of using PlayoutDelayOracle is a bit awkward. The
-      // intended way to use it is to call PlayoutDelayToSend at the place where
-      // the extension is written into the packet, and OnSentPacket later, after
-      // the final allocation of the sequence number. But currently the
-      // extension is set in AllocatePacket, where the RTPVideoHeader isn't
-      // available, so it always calls PlayoutDelayToSend with {-1,-1}. Hence,
-      // we have to use OnSentPacket early, and record both contents of the
-      // extension and the sequence number.
-      playout_delay_oracle_.OnSentPacket(
-          sequence_number,
-          playout_delay_oracle_.PlayoutDelayToSend(rtp_header->playout_delay));
-    }
-
     result = video_->SendVideo(frame_type, payload_type, rtp_timestamp,
                                capture_time_ms, payload_data, payload_size,
                                fragmentation, rtp_header,
@@ -675,8 +658,7 @@
 
   for (const RTCPReportBlock& report_block : report_blocks) {
     if (ssrc == report_block.source_ssrc) {
-      playout_delay_oracle_.OnReceivedAck(
-          report_block.extended_highest_sequence_number);
+      video_->OnReceivedAck(report_block.extended_highest_sequence_number);
     }
   }
 }
@@ -1075,11 +1057,7 @@
   packet->ReserveExtension<AbsoluteSendTime>();
   packet->ReserveExtension<TransmissionOffset>();
   packet->ReserveExtension<TransportSequenceNumber>();
-  absl::optional<PlayoutDelay> playout_delay =
-      playout_delay_oracle_.PlayoutDelayToSend({-1, -1});
-  if (playout_delay) {
-    packet->SetExtension<PlayoutDelayLimits>(*playout_delay);
-  }
+
   if (!mid_.empty()) {
     // This is a no-op if the MID header extension is not registered.
     packet->SetExtension<RtpMid>(mid_);
diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h
index d0bc1c3..401a8ff 100644
--- a/modules/rtp_rtcp/source/rtp_sender.h
+++ b/modules/rtp_rtcp/source/rtp_sender.h
@@ -25,7 +25,6 @@
 #include "modules/rtp_rtcp/include/flexfec_sender.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "modules/rtp_rtcp/source/playout_delay_oracle.h"
 #include "modules/rtp_rtcp/source/rtp_packet_history.h"
 #include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
 #include "rtc_base/constructor_magic.h"
@@ -183,6 +182,7 @@
 
   absl::optional<uint32_t> FlexfecSsrc() const;
 
+  // Sends packet to |transport_| or to the pacer, depending on configuration.
   bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
                      StorageType storage,
                      RtpPacketSender::Priority priority);
@@ -239,6 +239,7 @@
   std::unique_ptr<RtpPacketToSend> BuildRtxPacket(
       const RtpPacketToSend& packet);
 
+  // Sends packet on to |transport_|, leaving the RTP module.
   bool SendPacketToNetwork(const RtpPacketToSend& packet,
                            const PacketOptions& options,
                            const PacedPacketInfo& pacing_info);
@@ -286,11 +287,6 @@
   RtpHeaderExtensionMap rtp_header_extension_map_
       RTC_GUARDED_BY(send_critsect_);
 
-  // Tracks the current request for playout delay limits from application
-  // and decides whether the current RTP frame should include the playout
-  // delay extension on header.
-  PlayoutDelayOracle playout_delay_oracle_;
-
   RtpPacketHistory packet_history_;
   // TODO(brandtr): Remove |flexfec_packet_history_| when the FlexfecSender
   // is hooked up to the PacedSender.
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc
index 60ffd32..92805f3 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -53,6 +53,7 @@
 }
 
 void AddRtpHeaderExtensions(const RTPVideoHeader& video_header,
+                            const absl::optional<PlayoutDelay>& playout_delay,
                             FrameType frame_type,
                             bool set_video_rotation,
                             bool set_color_space,
@@ -78,6 +79,10 @@
       video_header.video_timing.flags != VideoSendTiming::kInvalid)
     packet->SetExtension<VideoTimingExtension>(video_header.video_timing);
 
+  // If transmitted, add to all packets; ack logic depends on this.
+  if (playout_delay) {
+    packet->SetExtension<PlayoutDelayLimits>(*playout_delay);
+  }
   if (video_header.generic) {
     RtpGenericFrameDescriptor generic_descriptor;
     generic_descriptor.SetFirstPacketInSubFrame(first_packet);
@@ -378,6 +383,9 @@
   int32_t retransmission_settings;
   bool set_video_rotation;
   bool set_color_space = false;
+
+  const absl::optional<PlayoutDelay> playout_delay =
+      playout_delay_oracle_.PlayoutDelayToSend(video_header->playout_delay);
   {
     rtc::CritScope cs(&crit_);
     // According to
@@ -441,19 +449,18 @@
   auto middle_packet = absl::make_unique<RtpPacketToSend>(*single_packet);
   auto last_packet = absl::make_unique<RtpPacketToSend>(*single_packet);
   // Simplest way to estimate how much extensions would occupy is to set them.
-  AddRtpHeaderExtensions(*video_header, frame_type, set_video_rotation,
-                         set_color_space, /*first=*/true, /*last=*/true,
-                         single_packet.get());
-  AddRtpHeaderExtensions(*video_header, frame_type, set_video_rotation,
-                         set_color_space, /*first=*/true, /*last=*/false,
-                         first_packet.get());
-  AddRtpHeaderExtensions(*video_header, frame_type, set_video_rotation,
-                         set_color_space, /*first=*/false, /*last=*/false,
-                         middle_packet.get());
-  AddRtpHeaderExtensions(*video_header, frame_type, set_video_rotation,
-                         set_color_space, /*first=*/false, /*last=*/true,
-                         last_packet.get());
-
+  AddRtpHeaderExtensions(*video_header, playout_delay, frame_type,
+                         set_video_rotation, set_color_space, /*first=*/true,
+                         /*last=*/true, single_packet.get());
+  AddRtpHeaderExtensions(*video_header, playout_delay, frame_type,
+                         set_video_rotation, set_color_space, /*first=*/true,
+                         /*last=*/false, first_packet.get());
+  AddRtpHeaderExtensions(*video_header, playout_delay, frame_type,
+                         set_video_rotation, set_color_space, /*first=*/false,
+                         /*last=*/false, middle_packet.get());
+  AddRtpHeaderExtensions(*video_header, playout_delay, frame_type,
+                         set_video_rotation, set_color_space, /*first=*/false,
+                         /*last=*/true, last_packet.get());
   RTC_DCHECK_GT(packet_capacity, single_packet->headers_size());
   RTC_DCHECK_GT(packet_capacity, first_packet->headers_size());
   RTC_DCHECK_GT(packet_capacity, middle_packet->headers_size());
@@ -582,6 +589,10 @@
       return false;
     packetized_payload_size += packet->payload_size();
 
+    if (i == 0) {
+      playout_delay_oracle_.OnSentPacket(packet->SequenceNumber(),
+                                         playout_delay);
+    }
     // No FEC protection for upper temporal layers, if used.
     bool protect_packet = temporal_id == 0 || temporal_id == kNoTemporalIdx;
 
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.h b/modules/rtp_rtcp/source/rtp_sender_video.h
index ea5865b..bba549b 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video.h
+++ b/modules/rtp_rtcp/source/rtp_sender_video.h
@@ -19,6 +19,7 @@
 #include "common_types.h"  // NOLINT(build/include)
 #include "modules/rtp_rtcp/include/flexfec_sender.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
+#include "modules/rtp_rtcp/source/playout_delay_oracle.h"
 #include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
 #include "modules/rtp_rtcp/source/rtp_sender.h"
 #include "modules/rtp_rtcp/source/ulpfec_generator.h"
@@ -71,6 +72,10 @@
   uint32_t FecOverheadRate() const;
   uint32_t PacketizationOverheadBps() const;
 
+  void OnReceivedAck(int64_t extended_highest_sequence_number) {
+    playout_delay_oracle_.OnReceivedAck(extended_highest_sequence_number);
+  }
+
  protected:
   static uint8_t GetTemporalId(const RTPVideoHeader& header);
   StorageType GetStorageType(uint8_t temporal_id,
@@ -135,6 +140,10 @@
   VideoRotation last_rotation_ RTC_GUARDED_BY(crit_);
   absl::optional<ColorSpace> last_color_space_ RTC_GUARDED_BY(crit_);
   bool transmit_color_space_next_frame_ RTC_GUARDED_BY(crit_);
+  // Tracks the current request for playout delay limits from application
+  // and decides whether the current RTP frame should include the playout
+  // delay extension on header.
+  PlayoutDelayOracle playout_delay_oracle_;
 
   // RED/ULPFEC.
   int red_payload_type_ RTC_GUARDED_BY(crit_);