in src/js/utils.js [126:197]
export function transformSdp(sdp, sdpOptions) {
var sections = splitSections(sdp);
for (var i = 1; i < sections.length; i++) {
var mediaType = getKind(sections[i]);
var rtpParams = parseRtpParameters(sections[i]);
// a map from payload type (string) to codec object
var codecMap = rtpParams.codecs.reduce((map, codec) => {
map['' + codec.payloadType] = codec;
return map;
}, {});
sections[i] = splitLines(sections[i]).map(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(pt => !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 = 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" + 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(line => line !== null).join('\r\n');
}
return {
sdp: sections.map(section => section.trim()).join('\r\n') + '\r\n',
mLines: sections.length - 1 // first section is session description, the rest are media descriptions
};
}