Bug 1279049 - add sdp handling for audio FEC, r=jesup

MozReview-Commit-ID: J0ax8TnR3p8

--HG--
extra : transplant_source : %D5Y%15%E6%C3d%F5%BD%9B%D7%CC%BA%DA%DE%12.%88%DD%A1%5B
This commit is contained in:
Michael Froman 2016-06-08 16:24:23 -05:00
Родитель 0c62c74b9f
Коммит f1dd9b78e0
6 изменённых файлов: 29 добавлений и 8 удалений

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

@ -172,6 +172,7 @@ class JsepAudioCodecDescription : public JsepCodecDescription {
// We prefer to receive stereo, if available.
opusParams.stereo = 1;
}
opusParams.useInBandFec = mFECEnabled ? 1 : 0;
msection.SetFmtp(SdpFmtpAttributeList::Fmtp(mDefaultPt, opusParams));
}
}
@ -187,6 +188,10 @@ class JsepAudioCodecDescription : public JsepCodecDescription {
mMaxPlaybackRate = opusParams.maxplaybackrate;
mForceMono = !opusParams.stereo;
// draft-ietf-rtcweb-fec-03.txt section 4.2 says support for FEC
// at the received side is declarative and can be negotiated
// separately for either media direction.
mFECEnabled = opusParams.useInBandFec;
}
return true;

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

@ -876,7 +876,8 @@ class ConfigureCodec {
mVP8MaxFs(0),
mVP8MaxFr(0),
mUseTmmbr(false),
mUseRemb(false)
mUseRemb(false),
mUseAudioFec(false)
{
#ifdef MOZ_WEBRTC_OMX
// Check to see if what HW codecs are available (not in use) at this moment.
@ -945,13 +946,21 @@ class ConfigureCodec {
// REMB is enabled by default, but can be disabled from about:config
branch->GetBoolPref("media.navigator.video.use_remb", &mUseRemb);
branch->GetBoolPref("media.navigator.audio.use_fec", &mUseAudioFec);
}
void operator()(JsepCodecDescription* codec) const
{
switch (codec->mType) {
case SdpMediaSection::kAudio:
// Nothing to configure here, for now.
{
JsepAudioCodecDescription& audioCodec =
static_cast<JsepAudioCodecDescription&>(*codec);
if (audioCodec.mName == "opus") {
audioCodec.mFECEnabled = mUseAudioFec;
}
}
break;
case SdpMediaSection::kVideo:
{
@ -1016,6 +1025,7 @@ class ConfigureCodec {
int32_t mVP8MaxFr;
bool mUseTmmbr;
bool mUseRemb;
bool mUseAudioFec;
};
nsresult

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

@ -1243,11 +1243,13 @@ public:
{
public:
enum { kDefaultMaxPlaybackRate = 48000,
kDefaultStereo = 0 };
kDefaultStereo = 0,
kDefaultUseInBandFec = 0 };
OpusParameters() :
Parameters(SdpRtpmapAttributeList::kOpus),
maxplaybackrate(kDefaultMaxPlaybackRate),
stereo(kDefaultStereo)
stereo(kDefaultStereo),
useInBandFec(kDefaultUseInBandFec)
{}
Parameters*
@ -1259,12 +1261,14 @@ public:
void
Serialize(std::ostream& os) const override
{
os << "maxplaybackrate=" << maxplaybackrate << ";"
<< "stereo=" << stereo;
os << "maxplaybackrate=" << maxplaybackrate
<< ";stereo=" << stereo
<< ";useinbandfec=" << useInBandFec;
}
unsigned int maxplaybackrate;
unsigned int stereo;
unsigned int useInBandFec;
};
class Fmtp

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

@ -726,6 +726,7 @@ SipccSdpAttributeList::LoadFmtp(sdp_t* sdp, uint16_t level)
new SdpFmtpAttributeList::OpusParameters);
opusParameters->maxplaybackrate = fmtp->maxplaybackrate;
opusParameters->stereo = fmtp->stereo;
opusParameters->useInBandFec = fmtp->useinbandfec;
parameters.reset(opusParameters);
} break;
default: {

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

@ -1561,7 +1561,7 @@ const std::string kH264AudioVideoOffer =
"a=rtpmap:0 PCMU/8000" CRLF
"a=rtpmap:8 PCMA/8000" CRLF
"a=rtpmap:101 telephone-event/8000" CRLF
"a=fmtp:109 maxplaybackrate=32000;stereo=1" CRLF
"a=fmtp:109 maxplaybackrate=32000;stereo=1;useinbandfec=1" CRLF
"a=ice-ufrag:00000000" CRLF
"a=ice-pwd:0000000000000000000000000000000" CRLF
"a=sendonly" CRLF
@ -1623,6 +1623,7 @@ TEST_P(NewSdpTest, CheckFormatParameters) {
audio_format_params[0].parameters.get());
ASSERT_EQ(32000U, opus_parameters->maxplaybackrate);
ASSERT_EQ(1U, opus_parameters->stereo);
ASSERT_EQ(1U, opus_parameters->useInBandFec);
ASSERT_TRUE(mSdp->GetMediaSection(1).GetAttributeList().HasAttribute(
SdpAttribute::kFmtpAttribute));

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

@ -399,7 +399,7 @@ pref("media.navigator.video.default_fps",30);
pref("media.navigator.video.default_minfps",10);
pref("media.navigator.video.use_remb", true);
pref("media.navigator.video.use_tmmbr", true);
pref("media.navigator.audio.use_fec", true);
pref("media.webrtc.debug.trace_mask", 0);
pref("media.webrtc.debug.multi_log", false);