Reland "Add PT lookup function to JsepTransportController"

This reverts commit 0e3a3266afc50218747134bec7c40f1c6e82ab19.

Reason for revert: Ancestor CL fixed

Original change's description:
> Revert "Add PT lookup function to JsepTransportController"
>
> This reverts commit d178532ff9416f8b4272b9b8622afa9bab2ed558.
>
> Reason for revert: break pw-answer
>
> Original change's description:
> > Add PT lookup function to JsepTransportController
> >
> > Bug: webrtc:360058654
> > Change-Id: I9db58bf872f8659622e9f626fc21ce84993cfdfb
> > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/360143
> > Commit-Queue: Harald Alvestrand <hta@webrtc.org>
> > Reviewed-by: Florent Castelli <orphis@webrtc.org>
> > Cr-Commit-Position: refs/heads/main@{#42829}
>
> Bug: webrtc:360058654
> Change-Id: Ic082dd3e86ed11d05b65710463fa9e57715bf07a
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/360360
> Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
> Commit-Queue: Jonas Oreland <jonaso@google.com>
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#42832}

Bug: webrtc:360058654
Change-Id: Ice9c118f9a5d4e0fa2cff89f504a25b80ec625ef
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/360662
Reviewed-by: Florent Castelli <orphis@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#42853}
diff --git a/pc/jsep_transport.h b/pc/jsep_transport.h
index b2c7a75..3c14f13 100644
--- a/pc/jsep_transport.h
+++ b/pc/jsep_transport.h
@@ -242,6 +242,18 @@
                                       webrtc::SdpType type,
                                       const ContentInfo& content);
 
+  const webrtc::PayloadTypeRecorder& remote_payload_types() const {
+    return remote_payload_types_;
+  }
+  const webrtc::PayloadTypeRecorder& local_payload_types() const {
+    return local_payload_types_;
+  }
+  void CommitPayloadTypes() {
+    RTC_DCHECK_RUN_ON(network_thread_);
+    local_payload_types_.Commit();
+    remote_payload_types_.Commit();
+  }
+
  private:
   bool SetRtcpMux(bool enable, webrtc::SdpType type, ContentSource source);
 
diff --git a/pc/jsep_transport_collection.cc b/pc/jsep_transport_collection.cc
index b50d303..08ae513 100644
--- a/pc/jsep_transport_collection.cc
+++ b/pc/jsep_transport_collection.cc
@@ -306,6 +306,9 @@
   RTC_DCHECK_RUN_ON(&sequence_checker_);
   stable_mid_to_transport_ = mid_to_transport_;
   DestroyUnusedTransports();
+  for (auto& transport : jsep_transports_by_name_) {
+    transport.second->CommitPayloadTypes();
+  }
   RTC_DCHECK(IsConsistent());
 }
 
diff --git a/pc/jsep_transport_controller.cc b/pc/jsep_transport_controller.cc
index 5d6ac95..7ad8e2d 100644
--- a/pc/jsep_transport_controller.cc
+++ b/pc/jsep_transport_controller.cc
@@ -220,6 +220,29 @@
   return t->GetDtlsRole();
 }
 
+RTCErrorOr<webrtc::PayloadType> JsepTransportController::SuggestPayloadType(
+    const std::string& mid,
+    cricket::Codec codec) {
+  RTC_DCHECK_RUN_ON(network_thread_);
+  const cricket::JsepTransport* transport = GetJsepTransportForMid(mid);
+  if (transport) {
+    auto local_result =
+        transport->local_payload_types().LookupPayloadType(codec);
+    if (local_result.ok()) {
+      return local_result;
+    }
+    auto remote_result =
+        transport->remote_payload_types().LookupPayloadType(codec);
+    if (remote_result.ok()) {
+      return remote_result;
+    }
+    return payload_type_picker_.SuggestMapping(
+        codec, &transport->local_payload_types());
+  }
+  // If there is no transport, there are no exclusions.
+  return payload_type_picker_.SuggestMapping(codec, nullptr);
+}
+
 bool JsepTransportController::SetLocalCertificate(
     const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
   if (!network_thread_->IsCurrent()) {
diff --git a/pc/jsep_transport_controller.h b/pc/jsep_transport_controller.h
index 749fadd..c4275bd 100644
--- a/pc/jsep_transport_controller.h
+++ b/pc/jsep_transport_controller.h
@@ -235,6 +235,13 @@
   // Get negotiated role, if one has been negotiated.
   absl::optional<rtc::SSLRole> GetDtlsRole(const std::string& mid) const;
 
+  // Suggest a payload type for a given codec on a given media section.
+  // Media section is indicated by MID.
+  // The function will either return a PT already in use on the connection
+  // or a newly suggested one.
+  RTCErrorOr<PayloadType> SuggestPayloadType(const std::string& mid,
+                                             cricket::Codec codec);
+
   // TODO(deadbeef): GetStats isn't const because all the way down to
   // OpenSSLStreamAdapter, GetSslCipherSuite and GetDtlsSrtpCryptoSuite are not
   // const. Fix this.
diff --git a/pc/payload_type_picker.cc b/pc/payload_type_picker.cc
index a06e42c..8720b20 100644
--- a/pc/payload_type_picker.cc
+++ b/pc/payload_type_picker.cc
@@ -130,7 +130,7 @@
 
 RTCErrorOr<PayloadType> PayloadTypePicker::SuggestMapping(
     cricket::Codec codec,
-    PayloadTypeRecorder* excluder) {
+    const PayloadTypeRecorder* excluder) {
   // The first matching entry is returned, unless excluder
   // maps it to something different.
   for (auto entry : entries_) {
@@ -193,12 +193,12 @@
 }
 
 std::vector<std::pair<PayloadType, cricket::Codec>>
-PayloadTypeRecorder::GetMappings() {
+PayloadTypeRecorder::GetMappings() const {
   return std::vector<std::pair<PayloadType, cricket::Codec>>{};
 }
 
 RTCErrorOr<PayloadType> PayloadTypeRecorder::LookupPayloadType(
-    cricket::Codec codec) {
+    cricket::Codec codec) const {
   // Note that having multiple PTs mapping to the same codec is NOT an error.
   // In this case, we return the first found (not deterministic).
   auto result = std::find_if(
@@ -212,7 +212,7 @@
 }
 
 RTCErrorOr<cricket::Codec> PayloadTypeRecorder::LookupCodec(
-    PayloadType payload_type) {
+    PayloadType payload_type) const {
   auto result = payload_type_to_codec_.find(payload_type);
   if (result == payload_type_to_codec_.end()) {
     return RTCError(RTCErrorType::INVALID_PARAMETER, "No such payload type");
@@ -220,7 +220,7 @@
   return result->second;
 }
 
-void PayloadTypeRecorder::Checkpoint() {
+void PayloadTypeRecorder::Commit() {
   checkpoint_payload_type_to_codec_ = payload_type_to_codec_;
 }
 void PayloadTypeRecorder::Rollback() {
diff --git a/pc/payload_type_picker.h b/pc/payload_type_picker.h
index f299797..4726a31 100644
--- a/pc/payload_type_picker.h
+++ b/pc/payload_type_picker.h
@@ -42,7 +42,7 @@
   // Suggest a payload type for the codec.
   // If the excluder maps it to something different, don't suggest it.
   RTCErrorOr<PayloadType> SuggestMapping(cricket::Codec codec,
-                                         PayloadTypeRecorder* excluder);
+                                         const PayloadTypeRecorder* excluder);
   RTCError AddMapping(PayloadType payload_type, cricket::Codec codec);
 
  private:
@@ -67,12 +67,12 @@
       : suggester_(suggester) {}
 
   RTCError AddMapping(PayloadType payload_type, cricket::Codec codec);
-  std::vector<std::pair<PayloadType, cricket::Codec>> GetMappings();
-  RTCErrorOr<PayloadType> LookupPayloadType(cricket::Codec codec);
-  RTCErrorOr<cricket::Codec> LookupCodec(PayloadType payload_type);
+  std::vector<std::pair<PayloadType, cricket::Codec>> GetMappings() const;
+  RTCErrorOr<PayloadType> LookupPayloadType(cricket::Codec codec) const;
+  RTCErrorOr<cricket::Codec> LookupCodec(PayloadType payload_type) const;
   // Transaction support.
-  // Checkpoint() commits previous changes.
-  void Checkpoint();
+  // Commit() commits previous changes.
+  void Commit();
   // Rollback() rolls back to the previous checkpoint.
   void Rollback();
 
diff --git a/pc/payload_type_picker_unittest.cc b/pc/payload_type_picker_unittest.cc
index e97a2b0..71a3383 100644
--- a/pc/payload_type_picker_unittest.cc
+++ b/pc/payload_type_picker_unittest.cc
@@ -75,7 +75,7 @@
   cricket::Codec b_codec = cricket::CreateVideoCodec(0, "vp9");
   auto error = recorder.AddMapping(a_payload_type, a_codec);
   ASSERT_TRUE(error.ok());
-  recorder.Checkpoint();
+  recorder.Commit();
   ASSERT_TRUE(recorder.AddMapping(b_payload_type, b_codec).ok());
   {
     auto result = recorder.LookupCodec(a_payload_type);
@@ -99,7 +99,7 @@
   }
   ASSERT_TRUE(recorder.AddMapping(b_payload_type, b_codec).ok());
   // Rollback after a new checkpoint has no effect.
-  recorder.Checkpoint();
+  recorder.Commit();
   recorder.Rollback();
   {
     auto result = recorder.LookupCodec(b_payload_type);