You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LocalSdpMunger.spec.js 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import * as transform from 'sdp-transform';
  2. import { MockPeerConnection } from '../RTC/MockClasses';
  3. import LocalSdpMunger from './LocalSdpMunger';
  4. import { default as SampleSdpStrings } from './SampleSdpStrings';
  5. /**
  6. * Returns the associated ssrc lines for a given media type.
  7. *
  8. * @param {RTCSessionDescription} desc
  9. * @param {string} mediaType
  10. * @returns
  11. */
  12. function getSsrcLines(desc, mediaType) {
  13. const mline = desc.media.find(m => m.type === mediaType);
  14. return mline.ssrcs ?? [];
  15. }
  16. describe('TransformSdpsForUnifiedPlan', () => {
  17. let localSdpMunger;
  18. const tpc = new MockPeerConnection('1', true);
  19. const localEndpointId = 'sRdpsdg';
  20. beforeEach(() => {
  21. localSdpMunger = new LocalSdpMunger(tpc, localEndpointId);
  22. });
  23. describe('StripSsrcs', () => {
  24. describe('should strip label and mslabel from an sdp with msid', () => {
  25. let audioSsrcs, videoSsrcs;
  26. const transformStreamIdentifiers = () => {
  27. const sdpStr = transform.write(SampleSdpStrings.simulcastSdp);
  28. const desc = new RTCSessionDescription({
  29. type: 'offer',
  30. sdp: sdpStr
  31. });
  32. const ssrcMap = new Map();
  33. ssrcMap.set('sRdpsdg-v0', {
  34. ssrcs: [ 1757014965, 1479742055, 1089111804 ],
  35. msid: 'sRdpsdg-video-0',
  36. groups: [ {
  37. semantics: 'SIM',
  38. ssrcs: [ 1757014965, 1479742055, 1089111804 ] } ]
  39. });
  40. ssrcMap.set('sRdpsdg-a0', {
  41. ssrcs: [ 124723944 ],
  42. msid: 'sRdpsdg-audio-0'
  43. });
  44. const transformedDesc = localSdpMunger.transformStreamIdentifiers(desc, ssrcMap);
  45. const newSdp = transform.parse(transformedDesc.sdp);
  46. audioSsrcs = getSsrcLines(newSdp, 'audio');
  47. videoSsrcs = getSsrcLines(newSdp, 'video');
  48. };
  49. it('with source name signaling enabled (injected source name)', () => {
  50. transformStreamIdentifiers();
  51. expect(audioSsrcs.length).toEqual(2 + 1 /* injected source name */);
  52. expect(videoSsrcs.length).toEqual(6 + 3 /* injected source name into each ssrc */);
  53. });
  54. });
  55. });
  56. describe('addMsids', () => {
  57. it('should add endpointId to msid', () => {
  58. const sdpStr = transform.write(SampleSdpStrings.firefoxSdp);
  59. const desc = new RTCSessionDescription({
  60. type: 'offer',
  61. sdp: sdpStr
  62. });
  63. const ssrcMap = new Map();
  64. ssrcMap.set('sRdpsdg-v0', {
  65. ssrcs: [ 984899560 ],
  66. msid: 'sRdpsdg-video-0'
  67. });
  68. ssrcMap.set('sRdpsdg-a0', {
  69. ssrcs: [ 124723944 ],
  70. msid: 'sRdpsdg-audio-0'
  71. });
  72. const transformedDesc = localSdpMunger.transformStreamIdentifiers(desc, ssrcMap);
  73. const newSdp = transform.parse(transformedDesc.sdp);
  74. const videoSsrcs = getSsrcLines(newSdp, 'video');
  75. for (const ssrcLine of videoSsrcs) {
  76. if (ssrcLine.attribute === 'msid') {
  77. const msid = ssrcLine.value;
  78. expect(msid)
  79. .toBe(`${localEndpointId}-video-0-${tpc.id} bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf-${tpc.id}`);
  80. }
  81. }
  82. });
  83. it('should add missing msid', () => {
  84. // P2P case only.
  85. localSdpMunger.tpc.isP2P = true;
  86. const sdpStr = transform.write(SampleSdpStrings.firefoxP2pSdp);
  87. const desc = new RTCSessionDescription({
  88. type: 'offer',
  89. sdp: sdpStr
  90. });
  91. const ssrcMap = new Map();
  92. ssrcMap.set('sRdpsdg-v0', {
  93. ssrcs: [ 984899560 ],
  94. msid: 'sRdpsdg-video-0'
  95. });
  96. ssrcMap.set('sRdpsdg-a0', {
  97. ssrcs: [ 124723944 ],
  98. msid: 'sRdpsdg-audio-0'
  99. });
  100. const transformedDesc = localSdpMunger.transformStreamIdentifiers(desc, ssrcMap);
  101. const newSdp = transform.parse(transformedDesc.sdp);
  102. const videoSsrcs = getSsrcLines(newSdp, 'video');
  103. const msidExists = videoSsrcs.find(s => s.attribute === 'msid');
  104. expect(msidExists).toBeDefined();
  105. });
  106. });
  107. });
  108. describe('Transform msids for source-name signaling', () => {
  109. const tpc = new MockPeerConnection('1', false);
  110. const localEndpointId = 'sRdpsdg';
  111. const localSdpMunger = new LocalSdpMunger(tpc, localEndpointId);
  112. let audioMsid, audioMsidLine, videoMsid, videoMsidLine;
  113. const transformStreamIdentifiers = () => {
  114. const sdpStr = transform.write(SampleSdpStrings.simulcastRtxSdp);
  115. const desc = new RTCSessionDescription({
  116. type: 'offer',
  117. sdp: sdpStr
  118. });
  119. const ssrcMap = new Map();
  120. ssrcMap.set('sRdpsdg-v0', {
  121. ssrcs: [ 1757014965, 984899560, 1479742055, 855213044, 1089111804, 2963867077 ],
  122. msid: 'sRdpsdg-video-0'
  123. });
  124. ssrcMap.set('sRdpsdg-a0', {
  125. ssrcs: [ 124723944 ],
  126. msid: 'sRdpsdg-audio-0'
  127. });
  128. const transformedDesc = localSdpMunger.transformStreamIdentifiers(desc, ssrcMap);
  129. const newSdp = transform.parse(transformedDesc.sdp);
  130. audioMsidLine = getSsrcLines(newSdp, 'audio').find(ssrc => ssrc.attribute === 'msid')?.value;
  131. audioMsid = audioMsidLine.split(' ')[0];
  132. videoMsidLine = getSsrcLines(newSdp, 'video').find(ssrc => ssrc.attribute === 'msid')?.value;
  133. videoMsid = videoMsidLine.split(' ')[0];
  134. };
  135. it('should transform', () => {
  136. transformStreamIdentifiers();
  137. expect(audioMsid).toBe('sRdpsdg-audio-0-1');
  138. expect(videoMsid).toBe('sRdpsdg-video-0-1');
  139. });
  140. });