Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

TPCUtils.spec.js 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /* eslint-disable max-len */
  2. import { MockPeerConnection } from './MockClasses';
  3. import { TPCUtils } from './TPCUtils';
  4. const TEST_VIDEO_BITRATES = {
  5. low: 200000,
  6. standard: 700000,
  7. high: 2500000
  8. };
  9. describe('TPCUtils', () => {
  10. describe('ensureCorrectOrderOfSsrcs()', () => {
  11. const commonSdpLines = [
  12. 'v=0',
  13. 'o=- 814997227879783433 5 IN IP4 127.0.0.1',
  14. 's=-',
  15. 't=0 0',
  16. 'a=msid-semantic: WMS 0836cc8e-a7bb-47e9-affb-0599414bc56d',
  17. 'a=group:BUNDLE video',
  18. 'm=video 9 RTP/SAVPF 100 96',
  19. 'c=IN IP4 0.0.0.0',
  20. 'a=rtpmap:100 VP8/90000',
  21. 'a=fmtp:96 apt=100',
  22. 'a=rtcp:9 IN IP4 0.0.0.0',
  23. 'a=rtcp-fb:100 ccm fir',
  24. 'a=rtcp-fb:100 nack',
  25. 'a=rtcp-fb:100 nack pli',
  26. 'a=rtcp-fb:100 goog-remb',
  27. 'a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time',
  28. 'a=setup:passive',
  29. 'a=mid:video',
  30. 'a=sendrecv',
  31. 'a=ice-ufrag:adPg',
  32. 'a=ice-pwd:Xsr05Mq8S7CR44DAnusZE26F',
  33. 'a=fingerprint:sha-256 6A:39:DE:11:24:AD:2E:4E:63:D6:69:D3:85:05:53:C7:3C:38:A4:B7:91:74:C0:91:44:FC:94:63:7F:01:AB:A9'
  34. ];
  35. it('sort ssrcs associated with all FID ssrc-groups', () => {
  36. const pc = new MockPeerConnection();
  37. const tpcUtils = new TPCUtils(pc, TEST_VIDEO_BITRATES);
  38. const source = new RTCSessionDescription({
  39. type: 'offer',
  40. sdp: getSourceSdp()
  41. });
  42. const result = tpcUtils.ensureCorrectOrderOfSsrcs(source);
  43. expect(result.sdp).toBe(getExpectedSdp());
  44. /**
  45. * Test SDP with multiple FID groups
  46. */
  47. function getSourceSdp() {
  48. return `${[
  49. ...commonSdpLines,
  50. 'a=ssrc:1757014965 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  51. 'a=ssrc:1757014965 cname:peDGrDD6WsxUOki/',
  52. 'a=ssrc:1479742055 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  53. 'a=ssrc:1479742055 cname:peDGrDD6WsxUOki/',
  54. 'a=ssrc:1089111804 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  55. 'a=ssrc:1089111804 cname:peDGrDD6WsxUOki/',
  56. 'a=ssrc:855213044 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  57. 'a=ssrc:855213044 cname:peDGrDD6WsxUOki/',
  58. 'a=ssrc:984899560 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  59. 'a=ssrc:984899560 cname:peDGrDD6WsxUOki/',
  60. 'a=ssrc:2963867077 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  61. 'a=ssrc:2963867077 cname:peDGrDD6WsxUOki/',
  62. 'a=ssrc-group:FID 1757014965 984899560',
  63. 'a=ssrc-group:FID 1479742055 855213044',
  64. 'a=ssrc-group:FID 1089111804 2963867077',
  65. 'a=ssrc-group:SIM 1757014965 1479742055 1089111804',
  66. 'a=rtcp-mux'
  67. ].join('\r\n')}\r\n`;
  68. }
  69. /**
  70. * Expected SDP: all ssrc must be present and ordered
  71. */
  72. function getExpectedSdp() {
  73. return `${[
  74. ...commonSdpLines,
  75. 'a=ssrc:1757014965 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  76. 'a=ssrc:1757014965 cname:peDGrDD6WsxUOki/',
  77. 'a=ssrc:984899560 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  78. 'a=ssrc:984899560 cname:peDGrDD6WsxUOki/',
  79. 'a=ssrc:1479742055 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  80. 'a=ssrc:1479742055 cname:peDGrDD6WsxUOki/',
  81. 'a=ssrc:855213044 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  82. 'a=ssrc:855213044 cname:peDGrDD6WsxUOki/',
  83. 'a=ssrc:1089111804 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  84. 'a=ssrc:1089111804 cname:peDGrDD6WsxUOki/',
  85. 'a=ssrc:2963867077 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  86. 'a=ssrc:2963867077 cname:peDGrDD6WsxUOki/',
  87. 'a=ssrc-group:FID 1757014965 984899560',
  88. 'a=ssrc-group:FID 1479742055 855213044',
  89. 'a=ssrc-group:FID 1089111804 2963867077',
  90. 'a=ssrc-group:SIM 1757014965 1479742055 1089111804',
  91. 'a=rtcp-mux'
  92. ].join('\r\n')}\r\n`;
  93. }
  94. });
  95. it('sort ssrcs in case the first ssrc in the SIM group is not present at the top', () => {
  96. const pc = new MockPeerConnection();
  97. const tpcUtils = new TPCUtils(pc, TEST_VIDEO_BITRATES);
  98. const source = new RTCSessionDescription({
  99. type: 'offer',
  100. sdp: getSourceSdp()
  101. });
  102. const result = tpcUtils.ensureCorrectOrderOfSsrcs(source);
  103. expect(result.sdp).toBe(getExpectedSdp());
  104. /**
  105. * Test SDP with multiple FID groups where the first ssrc in the SIM group is not present at the top
  106. */
  107. function getSourceSdp() {
  108. return `${[
  109. ...commonSdpLines,
  110. 'a=ssrc:1479742055 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  111. 'a=ssrc:1479742055 cname:peDGrDD6WsxUOki/',
  112. 'a=ssrc:1757014965 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  113. 'a=ssrc:1757014965 cname:peDGrDD6WsxUOki/',
  114. 'a=ssrc:1089111804 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  115. 'a=ssrc:1089111804 cname:peDGrDD6WsxUOki/',
  116. 'a=ssrc:855213044 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  117. 'a=ssrc:855213044 cname:peDGrDD6WsxUOki/',
  118. 'a=ssrc:984899560 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  119. 'a=ssrc:984899560 cname:peDGrDD6WsxUOki/',
  120. 'a=ssrc:2963867077 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  121. 'a=ssrc:2963867077 cname:peDGrDD6WsxUOki/',
  122. 'a=ssrc-group:FID 1757014965 984899560',
  123. 'a=ssrc-group:FID 1479742055 855213044',
  124. 'a=ssrc-group:FID 1089111804 2963867077',
  125. 'a=ssrc-group:SIM 1757014965 1479742055 1089111804',
  126. 'a=rtcp-mux'
  127. ].join('\r\n')}\r\n`;
  128. }
  129. /**
  130. * Expected SDP: all ssrc must be present and ordered
  131. */
  132. function getExpectedSdp() {
  133. return `${[
  134. ...commonSdpLines,
  135. 'a=ssrc:1757014965 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  136. 'a=ssrc:1757014965 cname:peDGrDD6WsxUOki/',
  137. 'a=ssrc:984899560 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  138. 'a=ssrc:984899560 cname:peDGrDD6WsxUOki/',
  139. 'a=ssrc:1479742055 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  140. 'a=ssrc:1479742055 cname:peDGrDD6WsxUOki/',
  141. 'a=ssrc:855213044 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  142. 'a=ssrc:855213044 cname:peDGrDD6WsxUOki/',
  143. 'a=ssrc:1089111804 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  144. 'a=ssrc:1089111804 cname:peDGrDD6WsxUOki/',
  145. 'a=ssrc:2963867077 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  146. 'a=ssrc:2963867077 cname:peDGrDD6WsxUOki/',
  147. 'a=ssrc-group:FID 1757014965 984899560',
  148. 'a=ssrc-group:FID 1479742055 855213044',
  149. 'a=ssrc-group:FID 1089111804 2963867077',
  150. 'a=ssrc-group:SIM 1757014965 1479742055 1089111804',
  151. 'a=rtcp-mux'
  152. ].join('\r\n')}\r\n`;
  153. }
  154. });
  155. it('sort ssrcs in case there is a single FID group', () => {
  156. const pc = new MockPeerConnection();
  157. const tpcUtils = new TPCUtils(pc, TEST_VIDEO_BITRATES);
  158. const source = new RTCSessionDescription({
  159. type: 'offer',
  160. sdp: getSourceSdp()
  161. });
  162. const result = tpcUtils.ensureCorrectOrderOfSsrcs(source);
  163. expect(result.sdp).toBe(getExpectedSdp());
  164. /**
  165. * Test SDP with the single FID group
  166. */
  167. function getSourceSdp() {
  168. return `${[
  169. ...commonSdpLines,
  170. 'a=ssrc:984899560 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  171. 'a=ssrc:984899560 cname:peDGrDD6WsxUOki/',
  172. 'a=ssrc:1757014965 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  173. 'a=ssrc:1757014965 cname:peDGrDD6WsxUOki/',
  174. 'a=ssrc-group:FID 1757014965 984899560',
  175. 'a=rtcp-mux'
  176. ].join('\r\n')}\r\n`;
  177. }
  178. /**
  179. * Expected SDP: all ssrc must be present and ordered
  180. */
  181. function getExpectedSdp() {
  182. return `${[
  183. ...commonSdpLines,
  184. 'a=ssrc:1757014965 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  185. 'a=ssrc:1757014965 cname:peDGrDD6WsxUOki/',
  186. 'a=ssrc:984899560 msid:0836cc8e-a7bb-47e9-affb-0599414bc56d bdbd2c0a-7959-4578-8db5-9a6a1aec4ecf',
  187. 'a=ssrc:984899560 cname:peDGrDD6WsxUOki/',
  188. 'a=ssrc-group:FID 1757014965 984899560',
  189. 'a=rtcp-mux'
  190. ].join('\r\n')}\r\n`;
  191. }
  192. });
  193. });
  194. });