Refactor the GetPayloadTypesAndDefaultCodecs function

This is in preparation for moving the assignment of PT numbers
to a different place.

Bug: webrtc:42226302
Change-Id: I821f2b6b15eb9f9f3715714e2c2c220c5e5a219e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/352921
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42422}
This commit is contained in:
Harald Alvestrand 2024-05-31 15:15:51 +00:00 committed by WebRTC LUCI CQ
parent 135f781b94
commit 752a2b8afb

View File

@ -163,21 +163,15 @@ bool IsCodecValidForLowerRange(const Codec& codec) {
return false;
}
// This function will assign dynamic payload types (in the range [96, 127]
// and then [35, 63]) to the input codecs, and also add ULPFEC, RED, FlexFEC,
// and associated RTX codecs for recognized codecs (VP8, VP9, H264, and RED).
// It will also add default feedback params to the codecs.
// Get the default set of supported codecs.
// is_decoder_factory is needed to keep track of the implict assumption that any
// H264 decoder also supports constrained base line profile.
// Also, is_decoder_factory is used to decide whether FlexFEC video format
// should be advertised as supported.
// TODO(kron): Perhaps it is better to move the implicit knowledge to the place
// where codecs are negotiated.
template <class T>
std::vector<Codec> GetPayloadTypesAndDefaultCodecs(
std::vector<webrtc::SdpVideoFormat> GetDefaultSupportedFormats(
const T* factory,
bool is_decoder_factory,
bool include_rtx,
const webrtc::FieldTrialsView& trials) {
if (!factory) {
return {};
@ -190,11 +184,10 @@ std::vector<Codec> GetPayloadTypesAndDefaultCodecs(
}
if (supported_formats.empty())
return std::vector<Codec>();
return supported_formats;
supported_formats.push_back(webrtc::SdpVideoFormat(kRedCodecName));
supported_formats.push_back(webrtc::SdpVideoFormat(kUlpfecCodecName));
// flexfec-03 is always supported as receive codec and as send codec
// only if WebRTC-FlexFEC-03-Advertised is enabled
if (is_decoder_factory || IsEnabled(trials, "WebRTC-FlexFEC-03-Advertised")) {
@ -206,7 +199,17 @@ std::vector<Codec> GetPayloadTypesAndDefaultCodecs(
flexfec_format.parameters = {{kFlexfecFmtpRepairWindow, "10000000"}};
supported_formats.push_back(flexfec_format);
}
return supported_formats;
}
// This function will assign dynamic payload types (in the range [96, 127]
// and then [35, 63]) to the input codecs, and also add ULPFEC, RED, FlexFEC,
// and associated RTX codecs for recognized codecs (VP8, VP9, H264, and RED).
// It will also add default feedback params to the codecs.
std::vector<Codec> AssignPayloadTypesAndAddRtx(
const std::vector<webrtc::SdpVideoFormat>& supported_formats,
bool include_rtx,
const webrtc::FieldTrialsView& trials) {
// Due to interoperability issues with old Chrome/WebRTC versions that
// ignore the [35, 63] range prefer the lower range for new codecs.
static const int kFirstDynamicPayloadTypeLowerRange = 35;
@ -270,6 +273,20 @@ std::vector<Codec> GetPayloadTypesAndDefaultCodecs(
return output_codecs;
}
// TODO(kron): Perhaps it is better to move the implicit knowledge to the place
// where codecs are negotiated.
template <class T>
std::vector<Codec> GetPayloadTypesAndDefaultCodecs(
const T* factory,
bool is_decoder_factory,
bool include_rtx,
const webrtc::FieldTrialsView& trials) {
auto supported_formats =
GetDefaultSupportedFormats(factory, is_decoder_factory, trials);
return AssignPayloadTypesAndAddRtx(supported_formats, include_rtx, trials);
}
static std::string CodecVectorToString(const std::vector<Codec>& codecs) {
rtc::StringBuilder out;
out << "{";