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}
This commit is contained in:
parent
e2869de9ef
commit
d178532ff9
@ -242,6 +242,18 @@ class JsepTransport {
|
||||
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);
|
||||
|
||||
|
||||
@ -306,6 +306,9 @@ void JsepTransportCollection::CommitTransports() {
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
@ -220,6 +220,29 @@ absl::optional<rtc::SSLRole> JsepTransportController::GetDtlsRole(
|
||||
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()) {
|
||||
|
||||
@ -235,6 +235,13 @@ class JsepTransportController : public sigslot::has_slots<> {
|
||||
// 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.
|
||||
|
||||
@ -130,7 +130,7 @@ PayloadTypePicker::PayloadTypePicker() {
|
||||
|
||||
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_) {
|
||||
@ -180,12 +180,12 @@ RTCError PayloadTypeRecorder::AddMapping(PayloadType payload_type,
|
||||
}
|
||||
|
||||
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(
|
||||
@ -199,7 +199,7 @@ RTCErrorOr<PayloadType> PayloadTypeRecorder::LookupPayloadType(
|
||||
}
|
||||
|
||||
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");
|
||||
@ -207,7 +207,7 @@ RTCErrorOr<cricket::Codec> PayloadTypeRecorder::LookupCodec(
|
||||
return result->second;
|
||||
}
|
||||
|
||||
void PayloadTypeRecorder::Checkpoint() {
|
||||
void PayloadTypeRecorder::Commit() {
|
||||
checkpoint_payload_type_to_codec_ = payload_type_to_codec_;
|
||||
}
|
||||
void PayloadTypeRecorder::Rollback() {
|
||||
|
||||
@ -42,7 +42,7 @@ class PayloadTypePicker {
|
||||
// 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 @@ class PayloadTypeRecorder {
|
||||
: 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();
|
||||
|
||||
|
||||
@ -58,7 +58,7 @@ TEST(PayloadTypePicker, RollbackAndCommit) {
|
||||
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);
|
||||
@ -82,7 +82,7 @@ TEST(PayloadTypePicker, RollbackAndCommit) {
|
||||
}
|
||||
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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user