in release/connect-rtc.js [12007:12084]
function transformSdp(sdp, sdpOptions) {
var sections = (0, _sdp.splitSections)(sdp);
for (var i = 1; i < sections.length; i++) {
var mediaType = (0, _sdp.getKind)(sections[i]);
var rtpParams = (0, _sdp.parseRtpParameters)(sections[i]);
// a map from payload type (string) to codec object
var codecMap = rtpParams.codecs.reduce(function (map, codec) {
map['' + codec.payloadType] = codec;
return map;
}, {});
sections[i] = (0, _sdp.splitLines)(sections[i]).map(function (line) {
if (line.startsWith('m=')) {
// modify m= line if SdpOptions#forceCodec specifies codec for current media type
if (sdpOptions.forceCodec[mediaType]) {
var targetCodecPts = Object.keys(codecMap).filter(function (pt) {
return !sdpOptions._shouldDeleteCodec(mediaType, codecMap[pt].name);
});
return (/.*RTP\/S?AVPF? /.exec(line) + targetCodecPts.join(' ')
);
} else {
return line;
}
} else if (line.startsWith('a=rtpmap:')) {
var rtpMap = (0, _sdp.parseRtpMap)(line);
var currentCodec = codecMap[rtpMap.payloadType];
// remove this codec if SdpOptions#forceCodec specifies a different codec for current media type
if (sdpOptions._shouldDeleteCodec(mediaType, currentCodec.name)) {
return null;
}
// append a=fmtp line immediately if current codec is OPUS (to explicitly specify OPUS parameters)
if (currentCodec.name.toUpperCase() === 'OPUS') {
currentCodec.parameters.usedtx = sdpOptions.enableOpusDtx ? "1" : "0";
// generate fmtp line immediately after rtpmap line, and remove original fmtp line once we see it
return (line + "\r\n" + (0, _sdp.writeFmtp)(currentCodec)).trim();
} else {
return line;
}
} else if (line.startsWith('a=fmtp:')) {
var pt = line.substring('a=fmtp:'.length, line.indexOf(' '));
var currentCodec = codecMap[pt]; // eslint-disable-line no-redeclare
// remove this codec if SdpOptions#forceCodec specifies a different codec for current media type
if (sdpOptions._shouldDeleteCodec(mediaType, currentCodec.name)) {
return null;
}
if (currentCodec.name.toUpperCase() === 'OPUS') {
// this is a line for OPUS, remove it because FMTP line is already generated when rtpmap line is processed
return null;
} else {
return line;
}
} else if (line.startsWith('a=rtcp-fb:')) {
var pt = line.substring(line.indexOf(':') + 1, line.indexOf(' ')); // eslint-disable-line no-redeclare
var currentCodec = codecMap[pt]; // eslint-disable-line no-redeclare
// remove this codec if SdpOptions#forceCodec specifies a different codec for current media type
if (sdpOptions._shouldDeleteCodec(mediaType, currentCodec.name)) {
return null;
} else {
return line;
}
} else {
return line;
}
}).filter(function (line) {
return line !== null;
}).join('\r\n');
}
return {
sdp: sections.map(function (section) {
return section.trim();
}).join('\r\n') + '\r\n',
mLines: sections.length - 1 // first section is session description, the rest are media descriptions
};
}