Skip to content

Commit 697ed4f

Browse files
committed
update.
1 parent a265861 commit 697ed4f

File tree

5 files changed

+98
-99
lines changed

5 files changed

+98
-99
lines changed

examples/b2bua/b2bua/call.go

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -218,31 +218,3 @@ func (b *B2BCall) BridgeMediaStream() error {
218218
})
219219
return nil
220220
}
221-
222-
type TransportType string
223-
224-
const (
225-
TransportTypeSIP TransportType = "SIP"
226-
TransportTypeRTC TransportType = "WebRTC"
227-
TransportTypeUnknown TransportType = "Unknown"
228-
)
229-
230-
type Transport interface {
231-
Init(config CallConfig) error
232-
Close() error
233-
CreateOffer() (*Desc, error)
234-
OnAnswer(desc *Desc) error
235-
OnOffer(sdp *Desc) error
236-
CreateAnswer() (*Desc, error)
237-
Type() TransportType
238-
239-
OnRtpPacket(rtpHandler func(trackType TrackType, payload []byte))
240-
OnRtcpPacket(rtcpHandler func(trackType TrackType, payload []byte))
241-
242-
OnRequestKeyFrame(func())
243-
244-
WriteRTP(trackType TrackType, payload []byte) (int, error)
245-
WriteRTCP(trackType TrackType, payload []byte) (int, error)
246-
247-
RequestKeyFrame() error
248-
}

examples/b2bua/b2bua/transport.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package b2bua
2+
3+
type TransportType string
4+
5+
const (
6+
TransportTypeSIP TransportType = "SIP"
7+
TransportTypeRTC TransportType = "WebRTC"
8+
)
9+
10+
type Transport interface {
11+
Init(config CallConfig) error
12+
Close() error
13+
CreateOffer() (*Desc, error)
14+
OnAnswer(desc *Desc) error
15+
OnOffer(sdp *Desc) error
16+
CreateAnswer() (*Desc, error)
17+
Type() TransportType
18+
19+
OnRtpPacket(rtpHandler func(trackType TrackType, payload []byte))
20+
OnRtcpPacket(rtcpHandler func(trackType TrackType, payload []byte))
21+
22+
OnRequestKeyFrame(func())
23+
24+
WriteRTP(trackType TrackType, payload []byte) (int, error)
25+
WriteRTCP(trackType TrackType, payload []byte) (int, error)
26+
27+
RequestKeyFrame() error
28+
}

examples/b2bua/b2bua/udp.go

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -92,29 +92,23 @@ func (c *UdpTansport) Init(config CallConfig) error {
9292
var medias []*sdp.Media
9393

9494
for _, trackInfo := range c.trackInfos {
95-
udpPort, err := NewUdpPort(trackInfo.TrackType, config.ExternalRtpAddress)
95+
96+
var rAddr *net.UDPAddr = nil
97+
var rRtcpAddr *net.UDPAddr = nil
98+
if trackInfo.Connection != nil {
99+
rAddr, _ = net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", trackInfo.Connection.Address, trackInfo.Port))
100+
rRtcpAddr, _ = net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", trackInfo.Connection.Address, trackInfo.RtcpPort))
101+
}
102+
103+
udpPort, err := NewUdpPort(trackInfo.TrackType, rAddr, rRtcpAddr, config.ExternalRtpAddress)
96104
if err != nil {
97105
return err
98106
}
99107
udpPort.Init()
100-
udpPort.OnRtpPacketReceived(c.onRtpPacket)
101-
udpPort.OnRtcpPacketReceived(c.onRtcpPacket)
108+
udpPort.OnRtpPacket(c.onRtpPacket)
109+
udpPort.OnRtcpPacket(c.onRtcpPacket)
102110
c.ports[trackInfo.TrackType] = udpPort
103111

104-
if trackInfo.Connection != nil {
105-
rtpAddr := fmt.Sprintf("%s:%d", trackInfo.Connection.Address, trackInfo.Port)
106-
raddr, err := net.ResolveUDPAddr("udp", rtpAddr)
107-
if err == nil {
108-
udpPort.SetRemoteAddress(raddr)
109-
}
110-
111-
rtcpAddr := fmt.Sprintf("%s:%d", trackInfo.Connection.Address, trackInfo.RtcpPort)
112-
rtcpRaddr, err := net.ResolveUDPAddr("udp", rtcpAddr)
113-
if err == nil {
114-
udpPort.SetRemoteRtcpAddress(rtcpRaddr)
115-
}
116-
}
117-
118112
media := &sdp.Media{}
119113
media.Type = string(trackInfo.TrackType)
120114
media.Port = udpPort.LocalPort()
@@ -304,14 +298,13 @@ func (c *UdpTansport) WriteRTP(trackType TrackType, packet []byte) (int, error)
304298
}
305299

306300
port := c.ports[trackType]
307-
raddr := port.GetRemoteRtpAddress()
308-
if raddr == nil {
309-
logger.Errorf("UdpTansport::WriteRTP: raddr is nil")
301+
302+
if port == nil {
303+
logger.Errorf("UdpTansport::WriteRTP: port is nil")
310304
return 0, nil
311305
}
312306

313-
logger.Debugf("UdpTansport::WriteRTP: %v, raddr %v", trackType, *raddr)
314-
return port.WriteRtpPacket(pktbuf, raddr)
307+
return port.WriteRtp(pktbuf)
315308
}
316309

317310
func (c *UdpTansport) WriteRTCP(trackType TrackType, packet []byte) (int, error) {
@@ -324,13 +317,13 @@ func (c *UdpTansport) WriteRTCP(trackType TrackType, packet []byte) (int, error)
324317
logger.Debugf("UdpTansport::WriteRTCP: %v read %d packets", trackType, len(pkts))
325318

326319
port := c.ports[trackType]
327-
raddr := port.GetRemoteRtcpAddress()
328-
if raddr == nil {
329-
logger.Errorf("UdpTansport::WriteRTP: raddr is nil")
330-
raddr = port.GetRemoteRtpAddress()
320+
321+
if port == nil {
322+
logger.Errorf("UdpTansport::WriteRTCP: port is nil")
323+
return 0, nil
331324
}
332-
logger.Debugf("UdpTansport::WriteRTCP: %v read %d packets, raddr %v", trackType, len(pkts), *raddr)
333-
return port.WriteRtcpPacket(packet, raddr)
325+
326+
return port.WriteRtcp(packet)
334327
}
335328

336329
func (c *UdpTansport) Type() TransportType {

examples/b2bua/b2bua/udp_port.go

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,26 @@ import (
99
"github.com/cloudwebrtc/go-sip-ua/pkg/utils"
1010
)
1111

12-
// UdpPort .
1312
type UdpPort struct {
14-
udpConns []*net.UDPConn
15-
closed utils.AtomicBool
16-
ctx context.Context
17-
cancel context.CancelFunc
18-
onRtpPacketCallback func(trackType TrackType, packet []byte, raddr net.Addr) error
19-
onRtcpPacketCallback func(trackType TrackType, packet []byte, raddr net.Addr) error
20-
mutex sync.Mutex
21-
trackType TrackType
22-
externalRtpAddress string
23-
rAddr *net.UDPAddr
24-
rRtcpAddr *net.UDPAddr
13+
udpConns []*net.UDPConn
14+
closed utils.AtomicBool
15+
ctx context.Context
16+
cancel context.CancelFunc
17+
handleRtpPacket func(trackType TrackType, packet []byte, raddr net.Addr) error
18+
handleRtcpPacket func(trackType TrackType, packet []byte, raddr net.Addr) error
19+
mutex sync.Mutex
20+
trackType TrackType
21+
externalRtpAddress string
22+
rAddr *net.UDPAddr
23+
rRtcpAddr *net.UDPAddr
2524
}
2625

27-
func NewUdpPort(trackType TrackType, externalRtpAddress string) (*UdpPort, error) {
26+
func NewUdpPort(trackType TrackType, rAddr, rRtcpAddr *net.UDPAddr, externalRtpAddress string) (*UdpPort, error) {
2827
c := &UdpPort{
2928
trackType: trackType,
3029
externalRtpAddress: externalRtpAddress,
30+
rAddr: rAddr,
31+
rRtcpAddr: rRtcpAddr,
3132
}
3233
c.ctx, c.cancel = context.WithCancel(context.TODO())
3334
c.closed.Set(false)
@@ -38,6 +39,7 @@ func (c *UdpPort) Init() error {
3839
lAddr := &net.UDPAddr{IP: net.ParseIP("0.0.0.0"), Port: 0}
3940
lRtcpAddr := &net.UDPAddr{IP: net.ParseIP("0.0.0.0"), Port: 0}
4041

42+
// TODO: set port range from config
4143
rtpConns, err := ListenRTPInPortRange(4000, 5000, "udp", lAddr, lRtcpAddr)
4244
if err != nil {
4345
logger.Errorf("ListenUDP: err => %v", err)
@@ -50,17 +52,17 @@ func (c *UdpPort) Init() error {
5052
c.mutex.Lock()
5153
defer c.mutex.Unlock()
5254
c.rAddr = raddr.(*net.UDPAddr)
53-
if c.onRtpPacketCallback != nil {
54-
c.onRtpPacketCallback(c.trackType, packet, raddr)
55+
if c.handleRtpPacket != nil {
56+
c.handleRtpPacket(c.trackType, packet, raddr)
5557
}
5658
})
5759

5860
go c.loop(rtpConns[1], func(packet []byte, raddr net.Addr) {
5961
c.mutex.Lock()
6062
defer c.mutex.Unlock()
6163
c.rRtcpAddr = raddr.(*net.UDPAddr)
62-
if c.onRtcpPacketCallback != nil {
63-
c.onRtcpPacketCallback(c.trackType, packet, raddr)
64+
if c.handleRtcpPacket != nil {
65+
c.handleRtcpPacket(c.trackType, packet, raddr)
6466
}
6567
})
6668

@@ -84,17 +86,6 @@ func (c *UdpPort) SetRemoteRtcpAddress(raddr *net.UDPAddr) {
8486
c.rRtcpAddr = raddr
8587
}
8688

87-
func (c *UdpPort) GetRemoteRtpAddress() *net.UDPAddr {
88-
return c.rAddr
89-
}
90-
91-
func (c *UdpPort) GetRemoteRtcpAddress() *net.UDPAddr {
92-
if c.rRtcpAddr == nil {
93-
return c.rAddr
94-
}
95-
return c.rRtcpAddr
96-
}
97-
9889
func (c *UdpPort) Close() {
9990
c.mutex.Lock()
10091
defer c.mutex.Unlock()
@@ -111,36 +102,54 @@ func (c *UdpPort) Close() {
111102

112103
}
113104

114-
func (c *UdpPort) OnRtpPacketReceived(callback func(trackType TrackType, packet []byte, raddr net.Addr) error) {
105+
func (c *UdpPort) OnRtpPacket(callback func(trackType TrackType, packet []byte, raddr net.Addr) error) {
115106
c.mutex.Lock()
116107
defer c.mutex.Unlock()
117-
c.onRtpPacketCallback = callback
108+
c.handleRtpPacket = callback
118109
}
119110

120-
func (c *UdpPort) OnRtcpPacketReceived(callback func(trackType TrackType, packet []byte, raddr net.Addr) error) {
111+
func (c *UdpPort) OnRtcpPacket(callback func(trackType TrackType, packet []byte, raddr net.Addr) error) {
121112
c.mutex.Lock()
122113
defer c.mutex.Unlock()
123-
c.onRtcpPacketCallback = callback
114+
c.handleRtcpPacket = callback
124115
}
125116

126-
func (c *UdpPort) WriteRtpPacket(data []byte, raddr net.Addr) (int, error) {
117+
func (c *UdpPort) WriteRtp(data []byte) (int, error) {
127118
if c.closed.Get() {
128119
return 0, fmt.Errorf("closed")
129120
}
130-
if c.udpConns != nil {
131-
return c.udpConns[0].WriteToUDP(data, raddr.(*net.UDPAddr))
121+
122+
if c.rAddr == nil {
123+
return 0, fmt.Errorf("rAddr is nil")
124+
}
125+
126+
if c.udpConns == nil {
127+
return 0, fmt.Errorf("udpConns is nil")
132128
}
133-
return 0, fmt.Errorf("udpConns is nil")
129+
130+
logger.Debugf("UdpPort::WriteRTP: raddr %v", c.rAddr)
131+
return c.udpConns[0].WriteToUDP(data, c.rAddr)
134132
}
135133

136-
func (c *UdpPort) WriteRtcpPacket(data []byte, raddr net.Addr) (int, error) {
134+
func (c *UdpPort) WriteRtcp(data []byte) (int, error) {
137135
if c.closed.Get() {
138136
return 0, fmt.Errorf("closed")
139137
}
140-
if c.udpConns != nil {
141-
return c.udpConns[1].WriteToUDP(data, raddr.(*net.UDPAddr))
138+
var addr *net.UDPAddr = c.rRtcpAddr
139+
140+
if addr == nil {
141+
addr = c.rRtcpAddr
142+
if addr == nil {
143+
return 0, fmt.Errorf("rRtcpAddr is nil")
144+
}
142145
}
143-
return 0, fmt.Errorf("udpConns is nil")
146+
147+
if c.udpConns == nil {
148+
return 0, fmt.Errorf("udpConns is nil")
149+
}
150+
151+
logger.Debugf("UdpPort::WriteRTCP: %d packets, raddr %v", len(data), addr)
152+
return c.udpConns[1].WriteToUDP(data, addr)
144153
}
145154

146155
func (c *UdpPort) loop(conn *net.UDPConn, onPacketReceived func(data []byte, raddr net.Addr)) {

examples/b2bua/b2bua/util.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -353,9 +353,6 @@ func HasWebRTCAttributes(attributes []*sdp.Attr) bool {
353353
}
354354

355355
func ParseTransportType(sdp *sdp.Session) TransportType {
356-
if sdp == nil {
357-
return TransportTypeUnknown
358-
}
359356
for _, m := range sdp.Media {
360357
// Proto: "UDP/TLS/RTP/SAVPF"
361358
if strings.Contains(m.Proto, "SAVPF") && HasWebRTCAttributes(m.Attributes) {

0 commit comments

Comments
 (0)