function transformSdp()

in monitoring-stack-cdk/resources/frontend/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
        };
    }