RtpTransportControllerSend: Restrict pacer outstanding data update

`TransportFeedbackAdapter` return NULL indicates outstanding data is
unchanged. This CL excludes outgoing retransmitted packets, rtcp packets
and invalid transport feedbacks to wakeup pacer.

Bug: webrtc:13417
Change-Id: Ie94956232c13cd548bb7038b5ce76617756fb207
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/238741
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35485}
diff --git a/call/rtp_transport_controller_send.cc b/call/rtp_transport_controller_send.cc
index 11c299c..c9388e4 100644
--- a/call/rtp_transport_controller_send.cc
+++ b/call/rtp_transport_controller_send.cc
@@ -420,10 +420,16 @@
     RTC_DCHECK_RUN_ON(&task_queue_);
     absl::optional<SentPacket> packet_msg =
         transport_feedback_adapter_.ProcessSentPacket(sent_packet);
-    pacer()->UpdateOutstandingData(
-        transport_feedback_adapter_.GetOutstandingData());
-    if (packet_msg && controller_)
-      PostUpdates(controller_->OnSentPacket(*packet_msg));
+    if (packet_msg) {
+      // Only update outstanding data in pacer if:
+      // 1. Packet feadback is used.
+      // 2. The packet has not yet received an acknowledgement.
+      // 3. It is not a retransmission of an earlier packet.
+      pacer()->UpdateOutstandingData(
+          transport_feedback_adapter_.GetOutstandingData());
+      if (controller_)
+        PostUpdates(controller_->OnSentPacket(*packet_msg));
+    }
   });
 }
 
@@ -574,11 +580,15 @@
     absl::optional<TransportPacketsFeedback> feedback_msg =
         transport_feedback_adapter_.ProcessTransportFeedback(feedback,
                                                              feedback_time);
-    if (feedback_msg && controller_) {
-      PostUpdates(controller_->OnTransportPacketsFeedback(*feedback_msg));
+    if (feedback_msg) {
+      if (controller_)
+        PostUpdates(controller_->OnTransportPacketsFeedback(*feedback_msg));
+
+      // Only update outstanding data in pacer if any packet is first time
+      // acked.
+      pacer()->UpdateOutstandingData(
+          transport_feedback_adapter_.GetOutstandingData());
     }
-    pacer()->UpdateOutstandingData(
-        transport_feedback_adapter_.GetOutstandingData());
   });
 }