function maybePreferH264SendCodec(sdp) {
var sdpLines = sdp.split('\r\n');
var mLineIndex = findLine(sdpLines, 'm=', 'video');
if (mLineIndex === null) {
throw new Error('No |m=video| line found in the sdp.');
}
var payload = getCodecPayloadType(sdpLines, 'h264');
if (payload === null) {
console.log("H264 is not available on this target.");
return sdp;
}
sdpLines[mLineIndex] = setDefaultCodec(sdpLines[mLineIndex], payload);
sdp = sdpLines.join('\r\n');
return sdp;
}
function findLine(sdpLines, prefix, substr) {
for (var i = 0; i < sdpLines.length; ++i) {
if (sdpLines[i].indexOf(prefix) === 0) {
if (!substr ||
sdpLines[i].toLowerCase().indexOf(substr.toLowerCase()) !== -1) {
return i;
}
}
}
return null;
}
function getCodecPayloadType(sdpLines, codec) {
var index = findLine(sdpLines, 'a=rtpmap', codec);
if (index === null)
return null;
var pattern = new RegExp('a=rtpmap:(\\d+) [a-zA-Z0-9-]+\\/\\d+');
var result = sdpLines[index].match(pattern);
return (result && result.length === 2) ? result[1] : null;
}
function setDefaultCodec(mLine, payload) {
var elements = mLine.split(' ');
var newLine = elements.slice(0, 3);
newLine.push(payload);
for (var i = 3; i < elements.length; i++) {
if (elements[i] !== payload) {
newLine.push(elements[i]);
}
}
return newLine.join(' ');
}