mediasoup 3.19.0 → 3.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node/lib/Router.d.ts.map +1 -1
- package/node/lib/Router.js +2 -0
- package/node/lib/test/test-PipeTransport.js +18 -0
- package/package.json +6 -6
- package/worker/include/RTC/IceServer.hpp +9 -5
- package/worker/include/RTC/RtpRetransmissionBuffer.hpp +2 -0
- package/worker/include/RTC/TransportTuple.hpp +1 -1
- package/worker/src/RTC/IceServer.cpp +56 -37
- package/worker/src/RTC/RtpRetransmissionBuffer.cpp +1 -0
- package/worker/src/RTC/RtpStreamSend.cpp +3 -0
- package/worker/src/RTC/SvcConsumer.cpp +1 -4
- package/worker/src/RTC/TransportTuple.cpp +9 -9
- package/worker/test/src/RTC/TestRtpStreamSend.cpp +19 -16
package/node/lib/Router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EACX,MAAM,EACN,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,cAAc,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACX,SAAS,EAGT,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACX,eAAe,EACf,sBAAsB,EACtB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,KAAK,EACX,cAAc,EACd,qBAAqB,EACrB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAKhF,OAAO,KAAK,EACX,eAAe,EACf,sBAAsB,EACtB,MAAM,wBAAwB,CAAC;AAUhC,OAAO,KAAK,EACX,qBAAqB,EACrB,4BAA4B,EAC5B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EACX,kBAAkB,EAClB,yBAAyB,EACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EACX,eAAe,EACf,wBAAwB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAgBvC,MAAM,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,UAAU,GAAG;IACjB,eAAe,EAAE,eAAe,CAAC;CACjC,CAAC;AAIF,qBAAa,UAAU,CAAC,aAAa,SAAS,OAAO,GAAG,OAAO,CAC9D,SAAQ,oBAAoB,CAAC,YAAY,CACzC,YAAW,MAAM;;gBAwCL,EACX,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,OAAO,GACP,EAAE;QACF,QAAQ,EAAE,cAAc,CAAC;QACzB,IAAI,EAAE,UAAU,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,aAAa,CAAC;KACxB;IAaD,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,IAAI,OAAO,IAAI,aAAa,CAE3B;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,aAAa,EAEjC;IAED,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED;;;;OAIG;IACH,IAAI,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAEjD;IAED,KAAK,IAAI,IAAI;IA6Cb,YAAY,IAAI,IAAI;IAiCd,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAmB3B,qBAAqB,CAC1B,sBAAsB,SAAS,OAAO,GAAG,OAAO,EAC/C,EACD,YAAY,EACZ,WAAW,EACX,SAAS,EACT,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAiB,EACjB,SAAiB,EACjB,+BAAwC,EACxC,UAAkB,EAClB,cAAwC,EACxC,kBAA2B,EAC3B,kBAA2B,EAC3B,iBAAsB,EACtB,OAAO,GACP,EAAE,sBAAsB,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAC1D,eAAe,CAAC,sBAAsB,CAAC,CACvC;IAoNK,oBAAoB,CAAC,qBAAqB,SAAS,OAAO,GAAG,OAAO,EAAE,EAC3E,UAAU,EACV,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,OAAc,EACd,OAAe,EACf,UAAkB,EAClB,cAAwC,EACxC,kBAA2B,EAC3B,kBAA2B,EAC3B,UAAkB,EAClB,eAA2C,EAC3C,OAAO,GACP,EAAE,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,OAAO,CACxD,cAAc,CAAC,qBAAqB,CAAC,CACrC;IAuJK,mBAAmB,CAAC,oBAAoB,SAAS,OAAO,GAAG,OAAO,EAAE,EACzE,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,UAAkB,EAClB,cAAwC,EACxC,kBAA8B,EAC9B,kBAA8B,EAC9B,SAAiB,EACjB,UAAkB,EAClB,OAAO,GACP,EAAE,oBAAoB,CAAC,oBAAoB,CAAC,GAAG,OAAO,CACtD,aAAa,CAAC,oBAAoB,CAAC,CACnC;IA6HK,qBAAqB,CAAC,sBAAsB,SAAS,OAAO,GAAG,OAAO,EAC3E,EACC,cAAuB,EACvB,OAAO,GACP,GAAE,sBAAsB,CAAC,sBAAsB,CAE/C,GACC,OAAO,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;IAuF7C,YAAY,CAAC,EAClB,UAAU,EACV,cAAc,EACd,MAAM,EACN,MAAa,EACb,UAAU,EACV,QAAQ,EACR,UAAiB,EACjB,cAAwC,EACxC,SAAiB,EACjB,UAAkB,GAClB,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"}
|
package/node/lib/Router.js
CHANGED
|
@@ -644,6 +644,8 @@ class RouterImpl extends enhancedEvents_1.EnhancedEventEmitter {
|
|
|
644
644
|
}
|
|
645
645
|
}
|
|
646
646
|
else {
|
|
647
|
+
// NOTE: This cannot happen since it's guaranteed that producer or
|
|
648
|
+
// dataProducer exists, but TypeScript is not that smart.
|
|
647
649
|
throw new Error('internal error');
|
|
648
650
|
}
|
|
649
651
|
}
|
|
@@ -929,3 +929,21 @@ test('router.pipeToRouter() called in two Routers passing one to each other as a
|
|
|
929
929
|
expect(pipeTransportsA.size).toBe(0);
|
|
930
930
|
expect(pipeTransportsB.size).toBe(0);
|
|
931
931
|
}, 2000);
|
|
932
|
+
test('router.pipeToRouter() with neither producerId nor dataProducerId fails', async () => {
|
|
933
|
+
const router1bis = await ctx.worker1.createRouter({
|
|
934
|
+
mediaCodecs: ctx.mediaCodecs,
|
|
935
|
+
});
|
|
936
|
+
await expect(ctx.router1.pipeToRouter({
|
|
937
|
+
router: router1bis,
|
|
938
|
+
})).rejects.toThrow(Error);
|
|
939
|
+
}, 2000);
|
|
940
|
+
test('router.pipeToRouter() with both producerId and dataProducerId fails', async () => {
|
|
941
|
+
const router1bis = await ctx.worker1.createRouter({
|
|
942
|
+
mediaCodecs: ctx.mediaCodecs,
|
|
943
|
+
});
|
|
944
|
+
await expect(ctx.router1.pipeToRouter({
|
|
945
|
+
producerId: '1234',
|
|
946
|
+
dataProducerId: '5678',
|
|
947
|
+
router: router1bis,
|
|
948
|
+
})).rejects.toThrow(Error);
|
|
949
|
+
}, 2000);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mediasoup",
|
|
3
|
-
"version": "3.19.
|
|
3
|
+
"version": "3.19.2",
|
|
4
4
|
"description": "Cutting Edge WebRTC Video Conferencing",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Iñaki Baz Castillo <ibc@aliax.net> (https://inakibaz.me)",
|
|
@@ -100,17 +100,17 @@
|
|
|
100
100
|
"tar": "^7.4.3"
|
|
101
101
|
},
|
|
102
102
|
"devDependencies": {
|
|
103
|
-
"@eslint/js": "^9.
|
|
103
|
+
"@eslint/js": "^9.35.0",
|
|
104
104
|
"@octokit/rest": "^22.0.0",
|
|
105
105
|
"@types/debug": "^4.1.12",
|
|
106
106
|
"@types/jest": "^30.0.0",
|
|
107
|
-
"@types/node": "^24.3.
|
|
108
|
-
"eslint": "^9.
|
|
107
|
+
"@types/node": "^24.3.1",
|
|
108
|
+
"eslint": "^9.35.0",
|
|
109
109
|
"eslint-config-prettier": "^10.1.8",
|
|
110
110
|
"eslint-plugin-jest": "^29.0.1",
|
|
111
111
|
"eslint-plugin-prettier": "^5.5.4",
|
|
112
112
|
"globals": "^16.3.0",
|
|
113
|
-
"jest": "^30.1.
|
|
113
|
+
"jest": "^30.1.3",
|
|
114
114
|
"marked": "^16.2.1",
|
|
115
115
|
"open-cli": "^8.0.0",
|
|
116
116
|
"pick-port": "^2.1.2",
|
|
@@ -118,6 +118,6 @@
|
|
|
118
118
|
"sctp": "^1.0.0",
|
|
119
119
|
"ts-jest": "^29.4.1",
|
|
120
120
|
"typescript": "^5.9.2",
|
|
121
|
-
"typescript-eslint": "^8.
|
|
121
|
+
"typescript-eslint": "^8.42.0"
|
|
122
122
|
}
|
|
123
123
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
#include "handles/TimerHandle.hpp"
|
|
10
10
|
#include <list>
|
|
11
11
|
#include <string>
|
|
12
|
+
#include <unordered_map>
|
|
12
13
|
|
|
13
14
|
namespace RTC
|
|
14
15
|
{
|
|
@@ -23,10 +24,6 @@ namespace RTC
|
|
|
23
24
|
DISCONNECTED,
|
|
24
25
|
};
|
|
25
26
|
|
|
26
|
-
public:
|
|
27
|
-
static IceState RoleFromFbs(FBS::WebRtcTransport::IceState state);
|
|
28
|
-
static FBS::WebRtcTransport::IceState IceStateToFbs(IceState state);
|
|
29
|
-
|
|
30
27
|
public:
|
|
31
28
|
class Listener
|
|
32
29
|
{
|
|
@@ -54,6 +51,13 @@ namespace RTC
|
|
|
54
51
|
virtual void OnIceServerDisconnected(const RTC::IceServer* iceServer) = 0;
|
|
55
52
|
};
|
|
56
53
|
|
|
54
|
+
public:
|
|
55
|
+
static const std::string& IceStateToString(IceState iceState);
|
|
56
|
+
static FBS::WebRtcTransport::IceState IceStateToFbs(IceState state);
|
|
57
|
+
|
|
58
|
+
private:
|
|
59
|
+
static std::unordered_map<IceState, std::string> iceStateToString;
|
|
60
|
+
|
|
57
61
|
public:
|
|
58
62
|
IceServer(
|
|
59
63
|
Listener* listener,
|
|
@@ -63,6 +67,7 @@ namespace RTC
|
|
|
63
67
|
~IceServer() override;
|
|
64
68
|
|
|
65
69
|
public:
|
|
70
|
+
void Dump(int indentation = 0) const;
|
|
66
71
|
void ProcessStunPacket(RTC::StunPacket* packet, RTC::TransportTuple* tuple);
|
|
67
72
|
const std::string& GetUsernameFragment() const
|
|
68
73
|
{
|
|
@@ -138,7 +143,6 @@ namespace RTC
|
|
|
138
143
|
std::list<RTC::TransportTuple> tuples;
|
|
139
144
|
RTC::TransportTuple* selectedTuple{ nullptr };
|
|
140
145
|
TimerHandle* consentCheckTimer{ nullptr };
|
|
141
|
-
uint64_t lastConsentRequestReceivedAtMs{ 0u };
|
|
142
146
|
bool isRemovingTuples{ false };
|
|
143
147
|
};
|
|
144
148
|
} // namespace RTC
|
|
@@ -30,6 +30,8 @@ namespace RTC
|
|
|
30
30
|
uint16_t sequenceNumber{ 0u };
|
|
31
31
|
// Correct timestamp since original packet may not have the same.
|
|
32
32
|
uint32_t timestamp{ 0u };
|
|
33
|
+
// Correct marker bit since original packet may not have the same.
|
|
34
|
+
bool marker{ false };
|
|
33
35
|
// Last time this packet was resent.
|
|
34
36
|
uint64_t resentAtMs{ 0u };
|
|
35
37
|
// Number of times this packet was resent.
|
|
@@ -15,37 +15,31 @@ namespace RTC
|
|
|
15
15
|
static constexpr uint8_t ConsentCheckMinTimeoutSec{ 10u };
|
|
16
16
|
static constexpr uint8_t ConsentCheckMaxTimeoutSec{ 60u };
|
|
17
17
|
|
|
18
|
-
/* Class
|
|
19
|
-
IceServer::IceState IceStateFromFbs(FBS::WebRtcTransport::IceState state)
|
|
20
|
-
{
|
|
21
|
-
switch (state)
|
|
22
|
-
{
|
|
23
|
-
case FBS::WebRtcTransport::IceState::NEW:
|
|
24
|
-
{
|
|
25
|
-
return IceServer::IceState::NEW;
|
|
26
|
-
}
|
|
18
|
+
/* Class variables. */
|
|
27
19
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
// clang-format off
|
|
21
|
+
std::unordered_map<IceServer::IceState, std::string> IceServer::iceStateToString =
|
|
22
|
+
{
|
|
23
|
+
{ IceServer::IceState::NEW, "new" },
|
|
24
|
+
{ IceServer::IceState::CONNECTED, "connected" },
|
|
25
|
+
{ IceServer::IceState::COMPLETED, "completed" },
|
|
26
|
+
{ IceServer::IceState::DISCONNECTED, "disconnected" },
|
|
27
|
+
};
|
|
28
|
+
// clang-format on
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
{
|
|
35
|
-
return IceServer::IceState::COMPLETED;
|
|
36
|
-
}
|
|
30
|
+
/* Class methods. */
|
|
37
31
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
32
|
+
const std::string& IceServer::IceStateToString(IceState iceState)
|
|
33
|
+
{
|
|
34
|
+
MS_TRACE();
|
|
42
35
|
|
|
43
|
-
|
|
44
|
-
}
|
|
36
|
+
return IceServer::iceStateToString.at(iceState);
|
|
45
37
|
}
|
|
46
38
|
|
|
47
39
|
FBS::WebRtcTransport::IceState IceServer::IceStateToFbs(IceServer::IceState state)
|
|
48
40
|
{
|
|
41
|
+
MS_TRACE();
|
|
42
|
+
|
|
49
43
|
switch (state)
|
|
50
44
|
{
|
|
51
45
|
case IceServer::IceState::NEW:
|
|
@@ -152,6 +146,27 @@ namespace RTC
|
|
|
152
146
|
this->consentCheckTimer = nullptr;
|
|
153
147
|
}
|
|
154
148
|
|
|
149
|
+
void IceServer::Dump(int indentation) const
|
|
150
|
+
{
|
|
151
|
+
MS_TRACE();
|
|
152
|
+
|
|
153
|
+
MS_DUMP_CLEAN(indentation, "<IceServer>");
|
|
154
|
+
MS_DUMP_CLEAN(indentation, " state: %s", IceServer::IceStateToString(this->state).c_str());
|
|
155
|
+
MS_DUMP_CLEAN(indentation, " tuples:");
|
|
156
|
+
for (const auto& tuple : this->tuples)
|
|
157
|
+
{
|
|
158
|
+
tuple.Dump(indentation + 2);
|
|
159
|
+
}
|
|
160
|
+
if (this->selectedTuple)
|
|
161
|
+
{
|
|
162
|
+
MS_DUMP_CLEAN(indentation, " selected tuple:");
|
|
163
|
+
this->selectedTuple->Dump(indentation + 2);
|
|
164
|
+
}
|
|
165
|
+
MS_DUMP_CLEAN(indentation, " consent timeout (ms): %" PRIu16, this->consentTimeoutMs);
|
|
166
|
+
MS_DUMP_CLEAN(indentation, " remote nomination: %" PRIu32, this->remoteNomination);
|
|
167
|
+
MS_DUMP_CLEAN(indentation, "</IceServer>");
|
|
168
|
+
}
|
|
169
|
+
|
|
155
170
|
void IceServer::ProcessStunPacket(RTC::StunPacket* packet, RTC::TransportTuple* tuple)
|
|
156
171
|
{
|
|
157
172
|
MS_TRACE();
|
|
@@ -587,9 +602,10 @@ namespace RTC
|
|
|
587
602
|
else
|
|
588
603
|
{
|
|
589
604
|
// Store the tuple.
|
|
590
|
-
auto* storedTuple
|
|
605
|
+
auto* storedTuple = AddTuple(tuple);
|
|
606
|
+
const auto isNewNomination = hasNomination && nomination > this->remoteNomination;
|
|
591
607
|
|
|
592
|
-
if (
|
|
608
|
+
if (isNewNomination || !hasNomination)
|
|
593
609
|
{
|
|
594
610
|
MS_DEBUG_TAG(
|
|
595
611
|
ice,
|
|
@@ -606,7 +622,7 @@ namespace RTC
|
|
|
606
622
|
SetSelectedTuple(storedTuple);
|
|
607
623
|
|
|
608
624
|
// Update nomination.
|
|
609
|
-
if (
|
|
625
|
+
if (isNewNomination)
|
|
610
626
|
{
|
|
611
627
|
this->remoteNomination = nomination;
|
|
612
628
|
}
|
|
@@ -649,9 +665,10 @@ namespace RTC
|
|
|
649
665
|
else
|
|
650
666
|
{
|
|
651
667
|
// Store the tuple.
|
|
652
|
-
auto* storedTuple
|
|
668
|
+
auto* storedTuple = AddTuple(tuple);
|
|
669
|
+
const auto isNewNomination = hasNomination && nomination > this->remoteNomination;
|
|
653
670
|
|
|
654
|
-
if (
|
|
671
|
+
if (isNewNomination || !hasNomination)
|
|
655
672
|
{
|
|
656
673
|
MS_DEBUG_TAG(
|
|
657
674
|
ice,
|
|
@@ -668,7 +685,7 @@ namespace RTC
|
|
|
668
685
|
SetSelectedTuple(storedTuple);
|
|
669
686
|
|
|
670
687
|
// Update nomination.
|
|
671
|
-
if (
|
|
688
|
+
if (isNewNomination)
|
|
672
689
|
{
|
|
673
690
|
this->remoteNomination = nomination;
|
|
674
691
|
}
|
|
@@ -705,9 +722,10 @@ namespace RTC
|
|
|
705
722
|
nomination);
|
|
706
723
|
|
|
707
724
|
// Store the tuple.
|
|
708
|
-
auto* storedTuple
|
|
725
|
+
auto* storedTuple = AddTuple(tuple);
|
|
726
|
+
const auto isNewNomination = hasNomination && nomination > this->remoteNomination;
|
|
709
727
|
|
|
710
|
-
if (
|
|
728
|
+
if (isNewNomination || !hasNomination)
|
|
711
729
|
{
|
|
712
730
|
// Update state.
|
|
713
731
|
this->state = IceState::COMPLETED;
|
|
@@ -716,7 +734,7 @@ namespace RTC
|
|
|
716
734
|
SetSelectedTuple(storedTuple);
|
|
717
735
|
|
|
718
736
|
// Update nomination.
|
|
719
|
-
if (
|
|
737
|
+
if (isNewNomination)
|
|
720
738
|
{
|
|
721
739
|
this->remoteNomination = nomination;
|
|
722
740
|
}
|
|
@@ -745,17 +763,18 @@ namespace RTC
|
|
|
745
763
|
else
|
|
746
764
|
{
|
|
747
765
|
// Store the tuple.
|
|
748
|
-
auto* storedTuple
|
|
766
|
+
auto* storedTuple = AddTuple(tuple);
|
|
767
|
+
const auto isNewNomination = hasNomination && nomination > this->remoteNomination;
|
|
749
768
|
|
|
750
|
-
// When in completed state,
|
|
751
|
-
// nomination.
|
|
752
|
-
if (
|
|
769
|
+
// When in completed state, update selected tuple if there is ICE
|
|
770
|
+
// nomination or useCandidate.
|
|
771
|
+
if (isNewNomination || hasUseCandidate)
|
|
753
772
|
{
|
|
754
773
|
// Mark it as selected tuple.
|
|
755
774
|
SetSelectedTuple(storedTuple);
|
|
756
775
|
|
|
757
776
|
// Update nomination.
|
|
758
|
-
if (
|
|
777
|
+
if (isNewNomination)
|
|
759
778
|
{
|
|
760
779
|
this->remoteNomination = nomination;
|
|
761
780
|
}
|
|
@@ -173,12 +173,14 @@ namespace RTC
|
|
|
173
173
|
auto origSsrc = packet->GetSsrc();
|
|
174
174
|
auto origSeq = packet->GetSequenceNumber();
|
|
175
175
|
auto origTimestamp = packet->GetTimestamp();
|
|
176
|
+
auto origMarker = packet->HasMarker();
|
|
176
177
|
std::string origMid;
|
|
177
178
|
|
|
178
179
|
// Put correct info into the packet.
|
|
179
180
|
packet->SetSsrc(item->ssrc);
|
|
180
181
|
packet->SetSequenceNumber(item->sequenceNumber);
|
|
181
182
|
packet->SetTimestamp(item->timestamp);
|
|
183
|
+
packet->SetMarker(item->marker);
|
|
182
184
|
|
|
183
185
|
if (item->encoder != nullptr)
|
|
184
186
|
{
|
|
@@ -237,6 +239,7 @@ namespace RTC
|
|
|
237
239
|
packet->SetSsrc(origSsrc);
|
|
238
240
|
packet->SetSequenceNumber(origSeq);
|
|
239
241
|
packet->SetTimestamp(origTimestamp);
|
|
242
|
+
packet->SetMarker(origMarker);
|
|
240
243
|
}
|
|
241
244
|
}
|
|
242
245
|
|
|
@@ -90,11 +90,11 @@ namespace RTC
|
|
|
90
90
|
protocol);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
void TransportTuple::Dump() const
|
|
93
|
+
void TransportTuple::Dump(int indentation) const
|
|
94
94
|
{
|
|
95
95
|
MS_TRACE();
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
MS_DUMP_CLEAN(indentation, "<TransportTuple>");
|
|
98
98
|
|
|
99
99
|
int family;
|
|
100
100
|
std::string ip;
|
|
@@ -102,32 +102,32 @@ namespace RTC
|
|
|
102
102
|
|
|
103
103
|
Utils::IP::GetAddressInfo(GetLocalAddress(), family, ip, port);
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
MS_DUMP_CLEAN(indentation, " localIp: %s", ip.c_str());
|
|
106
|
+
MS_DUMP_CLEAN(indentation, " localPort: %" PRIu16, port);
|
|
107
107
|
|
|
108
108
|
Utils::IP::GetAddressInfo(GetRemoteAddress(), family, ip, port);
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
MS_DUMP_CLEAN(indentation, " remoteIp: %s", ip.c_str());
|
|
111
|
+
MS_DUMP_CLEAN(indentation, " remotePort: %" PRIu16, port);
|
|
112
112
|
|
|
113
113
|
switch (GetProtocol())
|
|
114
114
|
{
|
|
115
115
|
case Protocol::UDP:
|
|
116
116
|
{
|
|
117
|
-
|
|
117
|
+
MS_DUMP_CLEAN(indentation, " protocol: udp");
|
|
118
118
|
|
|
119
119
|
break;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
case Protocol::TCP:
|
|
123
123
|
{
|
|
124
|
-
|
|
124
|
+
MS_DUMP_CLEAN(indentation, " protocol: tcp");
|
|
125
125
|
|
|
126
126
|
break;
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
MS_DUMP_CLEAN(indentation, "</TransportTuple>");
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
void TransportTuple::GenerateHash()
|
|
@@ -44,11 +44,12 @@ static void SendRtpPacket(std::vector<std::pair<RtpStreamSend*, uint32_t>> strea
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
static void CheckRtxPacket(RtpPacket*
|
|
47
|
+
static void CheckRtxPacket(RtpPacket* rtxPacket, RtpPacket* origPacket)
|
|
48
48
|
{
|
|
49
|
-
REQUIRE(
|
|
50
|
-
REQUIRE(
|
|
51
|
-
REQUIRE(
|
|
49
|
+
REQUIRE(rtxPacket);
|
|
50
|
+
REQUIRE(rtxPacket->GetSequenceNumber() == origPacket->GetSequenceNumber());
|
|
51
|
+
REQUIRE(rtxPacket->GetTimestamp() == origPacket->GetTimestamp());
|
|
52
|
+
REQUIRE(rtxPacket->HasMarker() == origPacket->HasMarker());
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
@@ -94,12 +95,14 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
94
95
|
auto packet1(CreateRtpPacket(rtpBuffer1, sizeof(rtpBuffer1), 21006, 1533790901));
|
|
95
96
|
// packet2 [pt:123, seq:21007, timestamp:1533790901]
|
|
96
97
|
auto packet2(CreateRtpPacket(rtpBuffer2, sizeof(rtpBuffer2), 21007, 1533790901));
|
|
98
|
+
packet2->SetMarker(true);
|
|
97
99
|
// packet3 [pt:123, seq:21008, timestamp:1533793871]
|
|
98
100
|
auto packet3(CreateRtpPacket(rtpBuffer3, sizeof(rtpBuffer3), 21008, 1533793871));
|
|
99
101
|
// packet4 [pt:123, seq:21009, timestamp:1533793871]
|
|
100
102
|
auto packet4(CreateRtpPacket(rtpBuffer4, sizeof(rtpBuffer4), 21009, 1533793871));
|
|
101
103
|
// packet5 [pt:123, seq:21010, timestamp:1533796931]
|
|
102
104
|
auto packet5(CreateRtpPacket(rtpBuffer5, sizeof(rtpBuffer5), 21010, 1533796931));
|
|
105
|
+
packet5->SetMarker(true);
|
|
103
106
|
|
|
104
107
|
// Create a RtpStreamSend instance.
|
|
105
108
|
TestRtpStreamListener testRtpStreamListener;
|
|
@@ -144,11 +147,11 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
144
147
|
|
|
145
148
|
testRtpStreamListener.retransmittedPackets.clear();
|
|
146
149
|
|
|
147
|
-
CheckRtxPacket(rtxPacket1, packet1
|
|
148
|
-
CheckRtxPacket(rtxPacket2, packet2
|
|
149
|
-
CheckRtxPacket(rtxPacket3, packet3
|
|
150
|
-
CheckRtxPacket(rtxPacket4, packet4
|
|
151
|
-
CheckRtxPacket(rtxPacket5, packet5
|
|
150
|
+
CheckRtxPacket(rtxPacket1, packet1.get());
|
|
151
|
+
CheckRtxPacket(rtxPacket2, packet2.get());
|
|
152
|
+
CheckRtxPacket(rtxPacket3, packet3.get());
|
|
153
|
+
CheckRtxPacket(rtxPacket4, packet4.get());
|
|
154
|
+
CheckRtxPacket(rtxPacket5, packet5.get());
|
|
152
155
|
}
|
|
153
156
|
|
|
154
157
|
SECTION("receive NACK and get zero retransmitted packets if useNack is not set")
|
|
@@ -306,8 +309,8 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
306
309
|
|
|
307
310
|
testRtpStreamListener1.retransmittedPackets.clear();
|
|
308
311
|
|
|
309
|
-
CheckRtxPacket(rtxPacket1, packet1
|
|
310
|
-
CheckRtxPacket(rtxPacket2, packet2
|
|
312
|
+
CheckRtxPacket(rtxPacket1, packet1.get());
|
|
313
|
+
CheckRtxPacket(rtxPacket2, packet2.get());
|
|
311
314
|
|
|
312
315
|
// Process the NACK packet on stream2.
|
|
313
316
|
stream2->ReceiveNack(&nackPacket);
|
|
@@ -319,8 +322,8 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
319
322
|
|
|
320
323
|
testRtpStreamListener2.retransmittedPackets.clear();
|
|
321
324
|
|
|
322
|
-
CheckRtxPacket(rtxPacket1, packet1
|
|
323
|
-
CheckRtxPacket(rtxPacket2, packet2
|
|
325
|
+
CheckRtxPacket(rtxPacket1, packet1.get());
|
|
326
|
+
CheckRtxPacket(rtxPacket2, packet2.get());
|
|
324
327
|
}
|
|
325
328
|
|
|
326
329
|
SECTION("retransmitted packets are correctly encoded")
|
|
@@ -531,8 +534,8 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
531
534
|
|
|
532
535
|
testRtpStreamListener.retransmittedPackets.clear();
|
|
533
536
|
|
|
534
|
-
CheckRtxPacket(rtxPacket1, packet1
|
|
535
|
-
CheckRtxPacket(rtxPacket2, packet2
|
|
537
|
+
CheckRtxPacket(rtxPacket1, packet1.get());
|
|
538
|
+
CheckRtxPacket(rtxPacket2, packet2.get());
|
|
536
539
|
}
|
|
537
540
|
|
|
538
541
|
SECTION("packets don't get retransmitted if MaxRetransmissionDelayForVideoMs is exceeded")
|
|
@@ -585,7 +588,7 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
585
588
|
|
|
586
589
|
testRtpStreamListener.retransmittedPackets.clear();
|
|
587
590
|
|
|
588
|
-
CheckRtxPacket(rtxPacket2, packet2
|
|
591
|
+
CheckRtxPacket(rtxPacket2, packet2.get());
|
|
589
592
|
}
|
|
590
593
|
|
|
591
594
|
SECTION("packets get removed from the retransmission buffer if seq number of the stream is reset")
|