зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
f9b9fbaf47
Коммит
9aba840cb7
|
@ -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 =
|
||||
|
|
Загрузка…
Ссылка в новой задаче