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. // We prefer to receive stereo, if available.
opusParams.stereo = 1; opusParams.stereo = 1;
} }
opusParams.useInBandFec = mFECEnabled ? 1 : 0;
msection.SetFmtp(SdpFmtpAttributeList::Fmtp(mDefaultPt, opusParams)); msection.SetFmtp(SdpFmtpAttributeList::Fmtp(mDefaultPt, opusParams));
} }
} }
@ -187,6 +188,10 @@ class JsepAudioCodecDescription : public JsepCodecDescription {
mMaxPlaybackRate = opusParams.maxplaybackrate; mMaxPlaybackRate = opusParams.maxplaybackrate;
mForceMono = !opusParams.stereo; 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; return true;

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

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

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

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

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

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

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

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

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

@ -399,7 +399,7 @@ pref("media.navigator.video.default_fps",30);
pref("media.navigator.video.default_minfps",10); pref("media.navigator.video.default_minfps",10);
pref("media.navigator.video.use_remb", true); pref("media.navigator.video.use_remb", true);
pref("media.navigator.video.use_tmmbr", 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.trace_mask", 0);
pref("media.webrtc.debug.multi_log", false); pref("media.webrtc.debug.multi_log", false);