@@ -35,29 +35,39 @@ export function addHeaderExtensionSupport(
3535 direction : RtpHeaderExtensionDirection ;
3636 }
3737) : void {
38- if (
39- rtpCapabilities . headerExtensions ?. some (
40- exten =>
41- exten . kind === headerExtension . kind && exten . uri === headerExtension . uri
42- )
43- ) {
44- return ;
38+ let preferredId : number | undefined ;
39+
40+ // Look for an already existing header extension with same `uri`. Don't
41+ // try to match `kind` since all media sections in a Bundle SDP must share
42+ // same `id` in extensions with same `uri` (as per spec). So if we are
43+ // adding an audio extension and there is already a video extension with
44+ // same `uri`, then reuse its preferred `id`.
45+ const existingHeaderExtension = rtpCapabilities . headerExtensions ?. find (
46+ exten => exten . uri === headerExtension . uri
47+ ) ;
48+
49+ if ( existingHeaderExtension ) {
50+ if ( existingHeaderExtension . kind === headerExtension . kind ) {
51+ return ;
52+ } else {
53+ preferredId = existingHeaderExtension . preferredId ;
54+ }
4555 }
4656
4757 if ( ! rtpCapabilities . headerExtensions ) {
4858 rtpCapabilities . headerExtensions = [ ] ;
4959 }
5060
51- const setPreferredIds = new Set (
52- rtpCapabilities . headerExtensions
53- . filter ( exten => exten . uri !== headerExtension . uri )
54- . map ( exten => exten . preferredId )
55- ) ;
61+ if ( preferredId === undefined ) {
62+ preferredId = 1 ;
5663
57- let preferredId : number = 1 ;
64+ const setPreferredIds = new Set (
65+ rtpCapabilities . headerExtensions . map ( exten => exten . preferredId )
66+ ) ;
5867
59- while ( setPreferredIds . has ( preferredId ) ) {
60- ++ preferredId ;
68+ while ( setPreferredIds . has ( preferredId ) ) {
69+ ++ preferredId ;
70+ }
6171 }
6272
6373 const newHeaderExtension = {
0 commit comments