rtptransceiver_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. //go:build !js
  4. // +build !js
  5. package webrtc
  6. import (
  7. "strings"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func Test_RTPTransceiver_SetCodecPreferences(t *testing.T) {
  12. me := &MediaEngine{}
  13. api := NewAPI(WithMediaEngine(me))
  14. assert.NoError(t, me.RegisterDefaultCodecs())
  15. me.pushCodecs(me.videoCodecs, RTPCodecTypeVideo)
  16. me.pushCodecs(me.audioCodecs, RTPCodecTypeAudio)
  17. tr := RTPTransceiver{kind: RTPCodecTypeVideo, api: api, codecs: me.videoCodecs}
  18. assert.EqualValues(t, me.videoCodecs, tr.getCodecs())
  19. failTestCases := [][]RTPCodecParameters{
  20. {
  21. {
  22. RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 2, "minptime=10;useinbandfec=1", nil},
  23. PayloadType: 111,
  24. },
  25. },
  26. {
  27. {
  28. RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
  29. PayloadType: 96,
  30. },
  31. {
  32. RTPCodecCapability: RTPCodecCapability{MimeTypeOpus, 48000, 2, "minptime=10;useinbandfec=1", nil},
  33. PayloadType: 111,
  34. },
  35. },
  36. }
  37. for _, testCase := range failTestCases {
  38. assert.ErrorIs(t, tr.SetCodecPreferences(testCase), errRTPTransceiverCodecUnsupported)
  39. }
  40. successTestCases := [][]RTPCodecParameters{
  41. {
  42. {
  43. RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
  44. PayloadType: 96,
  45. },
  46. },
  47. {
  48. {
  49. RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
  50. PayloadType: 96,
  51. },
  52. {
  53. RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=96", nil},
  54. PayloadType: 97,
  55. },
  56. {
  57. RTPCodecCapability: RTPCodecCapability{MimeTypeVP9, 90000, 0, "profile-id=0", nil},
  58. PayloadType: 98,
  59. },
  60. {
  61. RTPCodecCapability: RTPCodecCapability{"video/rtx", 90000, 0, "apt=98", nil},
  62. PayloadType: 99,
  63. },
  64. },
  65. }
  66. for _, testCase := range successTestCases {
  67. assert.NoError(t, tr.SetCodecPreferences(testCase))
  68. }
  69. assert.NoError(t, tr.SetCodecPreferences(nil))
  70. assert.NotEqual(t, 0, len(tr.getCodecs()))
  71. assert.NoError(t, tr.SetCodecPreferences([]RTPCodecParameters{}))
  72. assert.NotEqual(t, 0, len(tr.getCodecs()))
  73. }
  74. // Assert that SetCodecPreferences properly filters codecs and PayloadTypes are respected
  75. func Test_RTPTransceiver_SetCodecPreferences_PayloadType(t *testing.T) {
  76. testCodec := RTPCodecParameters{
  77. RTPCodecCapability: RTPCodecCapability{"video/testCodec", 90000, 0, "", nil},
  78. PayloadType: 50,
  79. }
  80. m := &MediaEngine{}
  81. assert.NoError(t, m.RegisterDefaultCodecs())
  82. offerPC, err := NewAPI(WithMediaEngine(m)).NewPeerConnection(Configuration{})
  83. assert.NoError(t, err)
  84. assert.NoError(t, m.RegisterCodec(testCodec, RTPCodecTypeVideo))
  85. answerPC, err := NewAPI(WithMediaEngine(m)).NewPeerConnection(Configuration{})
  86. assert.NoError(t, err)
  87. _, err = offerPC.AddTransceiverFromKind(RTPCodecTypeVideo)
  88. assert.NoError(t, err)
  89. answerTransceiver, err := answerPC.AddTransceiverFromKind(RTPCodecTypeVideo)
  90. assert.NoError(t, err)
  91. assert.NoError(t, answerTransceiver.SetCodecPreferences([]RTPCodecParameters{
  92. testCodec,
  93. {
  94. RTPCodecCapability: RTPCodecCapability{MimeTypeVP8, 90000, 0, "", nil},
  95. PayloadType: 51,
  96. },
  97. }))
  98. offer, err := offerPC.CreateOffer(nil)
  99. assert.NoError(t, err)
  100. assert.NoError(t, offerPC.SetLocalDescription(offer))
  101. assert.NoError(t, answerPC.SetRemoteDescription(offer))
  102. answer, err := answerPC.CreateAnswer(nil)
  103. assert.NoError(t, err)
  104. // VP8 with proper PayloadType
  105. assert.NotEqual(t, -1, strings.Index(answer.SDP, "a=rtpmap:51 VP8/90000"))
  106. // testCodec is ignored since offerer doesn't support
  107. assert.Equal(t, -1, strings.Index(answer.SDP, "testCodec"))
  108. closePairNow(t, offerPC, answerPC)
  109. }