Bug 1225722 - Create JsepCodecDescription instances through factory methods. r=bwc

This is mainly to avoid repeating the default parameters throughout the tree.

Differential Revision: https://phabricator.services.mozilla.com/D136626
This commit is contained in:
Andreas Pehrson 2022-02-01 23:12:25 +00:00
Родитель f9b9fbaf47
Коммит 9aba840cb7
3 изменённых файлов: 151 добавлений и 124 удалений

Просмотреть файл

@ -163,6 +163,35 @@ class JsepAudioCodecDescription : public JsepCodecDescription {
JSEP_CODEC_CLONE(JsepAudioCodecDescription)
static UniquePtr<JsepAudioCodecDescription> CreateDefaultOpus() {
// Per jmspeex on IRC:
// For 32KHz sampling, 28 is ok, 32 is good, 40 should be really good
// quality. Note that 1-2Kbps will be wasted on a stereo Opus channel
// with mono input compared to configuring it for mono.
// If we reduce bitrate enough Opus will low-pass us; 16000 will kill a
// 9KHz tone. This should be adaptive when we're at the low-end of video
// bandwidth (say <100Kbps), and if we're audio-only, down to 8 or
// 12Kbps.
return MakeUnique<JsepAudioCodecDescription>("109", "opus", 48000, 2);
}
static UniquePtr<JsepAudioCodecDescription> CreateDefaultG722() {
return MakeUnique<JsepAudioCodecDescription>("9", "G722", 8000, 1);
}
static UniquePtr<JsepAudioCodecDescription> CreateDefaultPCMU() {
return MakeUnique<JsepAudioCodecDescription>("0", "PCMU", 8000, 1);
}
static UniquePtr<JsepAudioCodecDescription> CreateDefaultPCMA() {
return MakeUnique<JsepAudioCodecDescription>("8", "PCMA", 8000, 1);
}
static UniquePtr<JsepAudioCodecDescription> CreateDefaultTelephoneEvent() {
return MakeUnique<JsepAudioCodecDescription>("101", "telephone-event", 8000,
1);
}
SdpFmtpAttributeList::OpusParameters GetOpusParameters(
const std::string& pt, const SdpMediaSection& msection) const {
// Will contain defaults if nothing else
@ -296,6 +325,68 @@ class JsepVideoCodecDescription : public JsepCodecDescription {
SdpMediaSection::MediaType Type() const override { return type; }
static UniquePtr<JsepVideoCodecDescription> CreateDefaultVP8(bool aUseRtx) {
auto codec = MakeUnique<JsepVideoCodecDescription>("120", "VP8", 90000);
// Defaults for mandatory params
codec->mConstraints.maxFs = 12288; // Enough for 2048x1536
codec->mConstraints.maxFps = 60;
if (aUseRtx) {
codec->EnableRtx("124");
}
return codec;
}
static UniquePtr<JsepVideoCodecDescription> CreateDefaultVP9(bool aUseRtx) {
auto codec = MakeUnique<JsepVideoCodecDescription>("121", "VP9", 90000);
// Defaults for mandatory params
codec->mConstraints.maxFs = 12288; // Enough for 2048x1536
codec->mConstraints.maxFps = 60;
if (aUseRtx) {
codec->EnableRtx("125");
}
return codec;
}
static UniquePtr<JsepVideoCodecDescription> CreateDefaultH264_0(
bool aUseRtx) {
auto codec = MakeUnique<JsepVideoCodecDescription>("97", "H264", 90000);
codec->mPacketizationMode = 0;
// Defaults for mandatory params
codec->mProfileLevelId = 0x42E00D;
if (aUseRtx) {
codec->EnableRtx("98");
}
return codec;
}
static UniquePtr<JsepVideoCodecDescription> CreateDefaultH264_1(
bool aUseRtx) {
auto codec = MakeUnique<JsepVideoCodecDescription>("126", "H264", 90000);
codec->mPacketizationMode = 1;
// Defaults for mandatory params
codec->mProfileLevelId = 0x42E00D;
if (aUseRtx) {
codec->EnableRtx("127");
}
return codec;
}
static UniquePtr<JsepVideoCodecDescription> CreateDefaultUlpFec() {
return MakeUnique<JsepVideoCodecDescription>(
"123", // payload type
"ulpfec", // codec name
90000 // clock rate (match other video codecs)
);
}
static UniquePtr<JsepVideoCodecDescription> CreateDefaultRed() {
return MakeUnique<JsepVideoCodecDescription>(
"122", // payload type
"red", // codec name
90000 // clock rate (match other video codecs)
);
}
virtual void EnableTmmbr() {
// EnableTmmbr can be called multiple times due to multiple calls to
// PeerConnectionImpl::ConfigureJsepSessionCodecs
@ -895,6 +986,13 @@ class JsepApplicationCodecDescription : public JsepCodecDescription {
JSEP_CODEC_CLONE(JsepApplicationCodecDescription)
static UniquePtr<JsepApplicationCodecDescription> CreateDefault() {
return MakeUnique<JsepApplicationCodecDescription>(
"webrtc-datachannel", WEBRTC_DATACHANNEL_STREAMS_DEFAULT,
WEBRTC_DATACHANNEL_PORT_DEFAULT,
WEBRTC_DATACHANNEL_MAX_MESSAGE_SIZE_LOCAL);
}
// Override, uses sctpport or sctpmap instead of rtpmap
virtual bool Matches(const std::string& fmt,
const SdpMediaSection& remoteMsection) const override {

Просмотреть файл

@ -2054,91 +2054,33 @@ nsresult JsepSessionImpl::SetupIds() {
void JsepSessionImpl::SetupDefaultCodecs() {
// Supported audio codecs.
// Per jmspeex on IRC:
// For 32KHz sampling, 28 is ok, 32 is good, 40 should be really good
// quality. Note that 1-2Kbps will be wasted on a stereo Opus channel
// with mono input compared to configuring it for mono.
// If we reduce bitrate enough Opus will low-pass us; 16000 will kill a
// 9KHz tone. This should be adaptive when we're at the low-end of video
// bandwidth (say <100Kbps), and if we're audio-only, down to 8 or
// 12Kbps.
mSupportedCodecs.emplace_back(JsepAudioCodecDescription::CreateDefaultOpus());
mSupportedCodecs.emplace_back(JsepAudioCodecDescription::CreateDefaultG722());
mSupportedCodecs.emplace_back(JsepAudioCodecDescription::CreateDefaultPCMU());
mSupportedCodecs.emplace_back(JsepAudioCodecDescription::CreateDefaultPCMA());
mSupportedCodecs.emplace_back(
new JsepAudioCodecDescription("109", "opus", 48000, 2));
mSupportedCodecs.emplace_back(
new JsepAudioCodecDescription("9", "G722", 8000, 1));
mSupportedCodecs.emplace_back(
new JsepAudioCodecDescription("0", "PCMU", 8000, 1));
mSupportedCodecs.emplace_back(
new JsepAudioCodecDescription("8", "PCMA", 8000, 1));
mSupportedCodecs.emplace_back(
new JsepAudioCodecDescription("101", "telephone-event", 8000, 1));
JsepAudioCodecDescription::CreateDefaultTelephoneEvent());
bool useRtx =
mRtxIsAllowed &&
Preferences::GetBool("media.peerconnection.video.use_rtx", false);
// Supported video codecs.
// Note: order here implies priority for building offers!
UniquePtr<JsepVideoCodecDescription> vp8(
new JsepVideoCodecDescription("120", "VP8", 90000));
// Defaults for mandatory params
vp8->mConstraints.maxFs = 12288; // Enough for 2048x1536
vp8->mConstraints.maxFps = 60;
if (useRtx) {
vp8->EnableRtx("124");
}
mSupportedCodecs.push_back(std::move(vp8));
mSupportedCodecs.emplace_back(
JsepVideoCodecDescription::CreateDefaultVP8(useRtx));
mSupportedCodecs.emplace_back(
JsepVideoCodecDescription::CreateDefaultVP9(useRtx));
mSupportedCodecs.emplace_back(
JsepVideoCodecDescription::CreateDefaultH264_1(useRtx));
mSupportedCodecs.emplace_back(
JsepVideoCodecDescription::CreateDefaultH264_0(useRtx));
mSupportedCodecs.emplace_back(
JsepVideoCodecDescription::CreateDefaultUlpFec());
UniquePtr<JsepVideoCodecDescription> vp9(
new JsepVideoCodecDescription("121", "VP9", 90000));
// Defaults for mandatory params
vp9->mConstraints.maxFs = 12288; // Enough for 2048x1536
vp9->mConstraints.maxFps = 60;
if (useRtx) {
vp9->EnableRtx("125");
}
mSupportedCodecs.push_back(std::move(vp9));
mSupportedCodecs.emplace_back(
JsepApplicationCodecDescription::CreateDefault());
UniquePtr<JsepVideoCodecDescription> h264_1(
new JsepVideoCodecDescription("126", "H264", 90000));
h264_1->mPacketizationMode = 1;
// Defaults for mandatory params
h264_1->mProfileLevelId = 0x42E00D;
if (useRtx) {
h264_1->EnableRtx("127");
}
mSupportedCodecs.push_back(std::move(h264_1));
UniquePtr<JsepVideoCodecDescription> h264_0(
new JsepVideoCodecDescription("97", "H264", 90000));
h264_0->mPacketizationMode = 0;
// Defaults for mandatory params
h264_0->mProfileLevelId = 0x42E00D;
if (useRtx) {
h264_0->EnableRtx("98");
}
mSupportedCodecs.push_back(std::move(h264_0));
UniquePtr<JsepVideoCodecDescription> ulpfec(new JsepVideoCodecDescription(
"123", // payload type
"ulpfec", // codec name
90000 // clock rate (match other video codecs)
));
mSupportedCodecs.push_back(std::move(ulpfec));
mSupportedCodecs.emplace_back(new JsepApplicationCodecDescription(
"webrtc-datachannel", WEBRTC_DATACHANNEL_STREAMS_DEFAULT,
WEBRTC_DATACHANNEL_PORT_DEFAULT,
WEBRTC_DATACHANNEL_MAX_MESSAGE_SIZE_LOCAL));
UniquePtr<JsepVideoCodecDescription> red(new JsepVideoCodecDescription(
"122", // payload type
"red", // codec name
90000 // clock rate (match other video codecs)
));
auto red = JsepVideoCodecDescription::CreateDefaultRed();
// Update the redundant encodings for the RED codec with the supported
// codecs. Note: only uses the video codecs.
red->UpdateRedundantEncodings(mSupportedCodecs);

Просмотреть файл

@ -54,36 +54,25 @@ class JsepTrackTest : public JsepTrackTestBase {
bool addFecCodecs = false, bool preferRed = false,
bool addDtmfCodec = false) const {
std::vector<UniquePtr<JsepCodecDescription>> results;
results.emplace_back(new JsepAudioCodecDescription("1", "opus", 48000, 2));
results.emplace_back(new JsepAudioCodecDescription("9", "G722", 8000, 1));
results.emplace_back(JsepAudioCodecDescription::CreateDefaultOpus());
results.emplace_back(JsepAudioCodecDescription::CreateDefaultG722());
if (addDtmfCodec) {
results.emplace_back(
new JsepAudioCodecDescription("101", "telephone-event", 8000, 1));
JsepAudioCodecDescription::CreateDefaultTelephoneEvent());
}
if (addFecCodecs && preferRed) {
results.emplace_back(new JsepVideoCodecDescription("122", "red", 90000));
results.emplace_back(JsepVideoCodecDescription::CreateDefaultRed());
}
JsepVideoCodecDescription* vp8 =
new JsepVideoCodecDescription("120", "VP8", 90000);
vp8->mConstraints.maxFs = 12288;
vp8->mConstraints.maxFps = 60;
results.emplace_back(vp8);
JsepVideoCodecDescription* h264 =
new JsepVideoCodecDescription("126", "H264", 90000);
h264->mPacketizationMode = 1;
h264->mProfileLevelId = 0x42E00D;
results.emplace_back(h264);
results.emplace_back(JsepVideoCodecDescription::CreateDefaultVP8(false));
results.emplace_back(JsepVideoCodecDescription::CreateDefaultH264_1(false));
if (addFecCodecs) {
if (!preferRed) {
results.emplace_back(
new JsepVideoCodecDescription("122", "red", 90000));
results.emplace_back(JsepVideoCodecDescription::CreateDefaultRed());
}
results.emplace_back(
new JsepVideoCodecDescription("123", "ulpfec", 90000));
results.emplace_back(JsepVideoCodecDescription::CreateDefaultUlpFec());
}
results.emplace_back(new JsepApplicationCodecDescription(
@ -479,13 +468,13 @@ TEST_F(JsepTrackTest, AudioNegotiationOffererDtmf) {
UniquePtr<JsepAudioCodecDescription> track;
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 2, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 2, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendAns, 2, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvAns, 2, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 2, 1)));
ASSERT_EQ("9", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 2, 1)));
@ -517,13 +506,13 @@ TEST_F(JsepTrackTest, AudioNegotiationAnswererDtmf) {
UniquePtr<JsepAudioCodecDescription> track;
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 2, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 2, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendAns, 2, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvAns, 2, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 2, 1)));
ASSERT_EQ("9", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 2, 1)));
@ -555,13 +544,13 @@ TEST_F(JsepTrackTest, AudioNegotiationOffererAnswererDtmf) {
UniquePtr<JsepAudioCodecDescription> track;
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendAns, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvAns, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 3, 1)));
ASSERT_EQ("9", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 3, 1)));
@ -608,13 +597,13 @@ TEST_F(JsepTrackTest, AudioNegotiationDtmfOffererNoFmtpAnswererFmtp) {
UniquePtr<JsepAudioCodecDescription> track;
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendAns, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvAns, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 3, 1)));
ASSERT_EQ("9", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 3, 1)));
@ -661,13 +650,13 @@ TEST_F(JsepTrackTest, AudioNegotiationDtmfOffererFmtpAnswererNoFmtp) {
UniquePtr<JsepAudioCodecDescription> track;
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendAns, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvAns, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 3, 1)));
ASSERT_EQ("9", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 3, 1)));
@ -715,13 +704,13 @@ TEST_F(JsepTrackTest, AudioNegotiationDtmfOffererNoFmtpAnswererNoFmtp) {
UniquePtr<JsepAudioCodecDescription> track;
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendAns, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvAns, 3, 0)));
ASSERT_EQ("1", track->mDefaultPt);
ASSERT_EQ("109", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mSendOff, 3, 1)));
ASSERT_EQ("9", track->mDefaultPt);
ASSERT_TRUE((track = GetAudioCodec(mRecvOff, 3, 1)));
@ -918,11 +907,9 @@ TEST_F(JsepTrackTest, VideoNegotationOffererAnswererFECMismatch) {
TEST_F(JsepTrackTest, VideoNegotationOffererAnswererFECZeroVP9Codec) {
mOffCodecs = MakeCodecs(true);
JsepVideoCodecDescription* vp9 =
new JsepVideoCodecDescription("0", "VP9", 90000);
vp9->mConstraints.maxFs = 12288;
vp9->mConstraints.maxFps = 60;
mOffCodecs.emplace_back(vp9);
auto vp9 = JsepVideoCodecDescription::CreateDefaultVP9(false);
vp9->mDefaultPt = "0";
mOffCodecs.push_back(std::move(vp9));
ASSERT_EQ(8U, mOffCodecs.size());
JsepVideoCodecDescription& red =