From dc3b5f4e57f45cbb05e44394f61198c1cb90b403 Mon Sep 17 00:00:00 2001 From: Alessandro Ros Date: Sun, 25 Aug 2024 22:27:51 +0200 Subject: [PATCH] webrtc: fix 'duplicate payload type' error in read page (#3543) (#3679) --- internal/servers/webrtc/read_index.html | 99 +++++++++++++++---------- 1 file changed, 60 insertions(+), 39 deletions(-) diff --git a/internal/servers/webrtc/read_index.html b/internal/servers/webrtc/read_index.html index 427073f9..e2c34029 100644 --- a/internal/servers/webrtc/read_index.html +++ b/internal/servers/webrtc/read_index.html @@ -108,16 +108,28 @@ const parseOffer = (sdp) => { return ret; }; +const findFreePayloadType = (firstLine) => { + const payloadTypes = firstLine.split(' ').slice(3); + for (let i = 96; i <= 127; i++) { + if (!payloadTypes.includes(i.toString())) { + return i.toString(); + } + } + throw Error('unable to find a free payload type'); +}; + const enableStereoPcmau = (section) => { let lines = section.split('\r\n'); - lines[0] += ' 118'; - lines.splice(lines.length - 1, 0, 'a=rtpmap:118 PCMU/8000/2'); - lines.splice(lines.length - 1, 0, 'a=rtcp-fb:118 transport-cc'); + let payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} PCMU/8000/2`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); - lines[0] += ' 119'; - lines.splice(lines.length - 1, 0, 'a=rtpmap:119 PCMA/8000/2'); - lines.splice(lines.length - 1, 0, 'a=rtcp-fb:119 transport-cc'); + payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} PCMA/8000/2`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); return lines.join('\r\n'); }; @@ -125,35 +137,41 @@ const enableStereoPcmau = (section) => { const enableMultichannelOpus = (section) => { let lines = section.split('\r\n'); - lines[0] += " 112"; - lines.splice(lines.length - 1, 0, "a=rtpmap:112 multiopus/48000/3"); - lines.splice(lines.length - 1, 0, "a=fmtp:112 channel_mapping=0,2,1;num_streams=2;coupled_streams=1"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:112 transport-cc"); + let payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} multiopus/48000/3`); + lines.splice(lines.length - 1, 0, `a=fmtp:${payloadType} channel_mapping=0,2,1;num_streams=2;coupled_streams=1`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); - lines[0] += " 113"; - lines.splice(lines.length - 1, 0, "a=rtpmap:113 multiopus/48000/4"); - lines.splice(lines.length - 1, 0, "a=fmtp:113 channel_mapping=0,1,2,3;num_streams=2;coupled_streams=2"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:113 transport-cc"); + payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} multiopus/48000/4`); + lines.splice(lines.length - 1, 0, `a=fmtp:${payloadType} channel_mapping=0,1,2,3;num_streams=2;coupled_streams=2`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); - lines[0] += " 114"; - lines.splice(lines.length - 1, 0, "a=rtpmap:114 multiopus/48000/5"); - lines.splice(lines.length - 1, 0, "a=fmtp:114 channel_mapping=0,4,1,2,3;num_streams=3;coupled_streams=2"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:114 transport-cc"); + payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} multiopus/48000/5`); + lines.splice(lines.length - 1, 0, `a=fmtp:${payloadType} channel_mapping=0,4,1,2,3;num_streams=3;coupled_streams=2`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); - lines[0] += " 115"; - lines.splice(lines.length - 1, 0, "a=rtpmap:115 multiopus/48000/6"); - lines.splice(lines.length - 1, 0, "a=fmtp:115 channel_mapping=0,4,1,2,3,5;num_streams=4;coupled_streams=2"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:115 transport-cc"); + payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} multiopus/48000/6`); + lines.splice(lines.length - 1, 0, `a=fmtp:${payloadType} channel_mapping=0,4,1,2,3,5;num_streams=4;coupled_streams=2`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); - lines[0] += " 116"; - lines.splice(lines.length - 1, 0, "a=rtpmap:116 multiopus/48000/7"); - lines.splice(lines.length - 1, 0, "a=fmtp:116 channel_mapping=0,4,1,2,3,5,6;num_streams=4;coupled_streams=4"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:116 transport-cc"); + payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} multiopus/48000/7`); + lines.splice(lines.length - 1, 0, `a=fmtp:${payloadType} channel_mapping=0,4,1,2,3,5,6;num_streams=4;coupled_streams=4`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); - lines[0] += " 117"; - lines.splice(lines.length - 1, 0, "a=rtpmap:117 multiopus/48000/8"); - lines.splice(lines.length - 1, 0, "a=fmtp:117 channel_mapping=0,6,1,4,5,2,3,7;num_streams=5;coupled_streams=4"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:117 transport-cc"); + payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} multiopus/48000/8`); + lines.splice(lines.length - 1, 0, `a=fmtp:${payloadType} channel_mapping=0,6,1,4,5,2,3,7;num_streams=5;coupled_streams=4`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); return lines.join('\r\n'); }; @@ -161,17 +179,20 @@ const enableMultichannelOpus = (section) => { const enableL16 = (section) => { let lines = section.split('\r\n'); - lines[0] += " 120"; - lines.splice(lines.length - 1, 0, "a=rtpmap:120 L16/8000/2"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:120 transport-cc"); + let payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} L16/8000/2`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); - lines[0] += " 121"; - lines.splice(lines.length - 1, 0, "a=rtpmap:121 L16/16000/2"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:121 transport-cc"); + payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} L16/16000/2`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); - lines[0] += " 122"; - lines.splice(lines.length - 1, 0, "a=rtpmap:122 L16/48000/2"); - lines.splice(lines.length - 1, 0, "a=rtcp-fb:122 transport-cc"); + payloadType = findFreePayloadType(lines[0]); + lines[0] += ` ${payloadType}`; + lines.splice(lines.length - 1, 0, `a=rtpmap:${payloadType} L16/48000/2`); + lines.splice(lines.length - 1, 0, `a=rtcp-fb:${payloadType} transport-cc`); return lines.join('\r\n'); };