forked from pion/webrtc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rtcicecandidate.go
143 lines (126 loc) · 3.88 KB
/
rtcicecandidate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package webrtc
import (
"errors"
"fmt"
"net"
"github.com/pions/sdp"
"github.com/pions/webrtc/pkg/ice"
)
// RTCIceCandidate represents a ice candidate
type RTCIceCandidate struct {
Foundation string `json:"foundation"`
Priority uint32 `json:"priority"`
IP string `json:"ip"`
Protocol RTCIceProtocol `json:"protocol"`
Port uint16 `json:"port"`
Typ RTCIceCandidateType `json:"type"`
Component uint16 `json:"component"`
RelatedAddress string `json:"relatedAddress"`
RelatedPort uint16 `json:"relatedPort"`
}
// Conversion for package sdp
func newRTCIceCandidateFromSDP(c sdp.ICECandidate) (RTCIceCandidate, error) {
typ, err := newRTCIceCandidateType(c.Typ)
if err != nil {
return RTCIceCandidate{}, err
}
protocol, err := newRTCIceProtocol(c.Protocol)
if err != nil {
return RTCIceCandidate{}, err
}
return RTCIceCandidate{
Foundation: c.Foundation,
Priority: c.Priority,
IP: c.IP,
Protocol: protocol,
Port: c.Port,
Component: c.Component,
Typ: typ,
RelatedAddress: c.RelatedAddress,
RelatedPort: c.RelatedPort,
}, nil
}
func (c RTCIceCandidate) toSDP() sdp.ICECandidate {
return sdp.ICECandidate{
Foundation: c.Foundation,
Priority: c.Priority,
IP: c.IP,
Protocol: c.Protocol.String(),
Port: c.Port,
Component: c.Component,
Typ: c.Typ.String(),
RelatedAddress: c.RelatedAddress,
RelatedPort: c.RelatedPort,
}
}
// Conversion for package ice
func newRTCIceCandidatesFromICE(iceCandidates []*ice.Candidate) ([]RTCIceCandidate, error) {
candidates := []RTCIceCandidate{}
for _, i := range iceCandidates {
c, err := newRTCIceCandidateFromICE(i)
if err != nil {
return nil, err
}
candidates = append(candidates, c)
}
return candidates, nil
}
func newRTCIceCandidateFromICE(i *ice.Candidate) (RTCIceCandidate, error) {
typ, err := convertTypeFromICE(i.Type)
if err != nil {
return RTCIceCandidate{}, err
}
protocol, err := newRTCIceProtocol(i.NetworkType.NetworkShort())
if err != nil {
return RTCIceCandidate{}, err
}
c := RTCIceCandidate{
Foundation: "foundation",
Priority: uint32(i.Priority()),
IP: i.IP.String(),
Protocol: protocol,
Port: uint16(i.Port),
Component: i.Component,
Typ: typ,
}
if i.RelatedAddress != nil {
c.RelatedAddress = i.RelatedAddress.Address
c.RelatedPort = uint16(i.RelatedAddress.Port)
}
return c, nil
}
func (c RTCIceCandidate) toICE() (*ice.Candidate, error) {
ip := net.ParseIP(c.IP)
if ip == nil {
return nil, errors.New("Failed to parse IP address")
}
switch c.Typ {
case RTCIceCandidateTypeHost:
return ice.NewCandidateHost(c.Protocol.String(), ip, int(c.Port), c.Component)
case RTCIceCandidateTypeSrflx:
return ice.NewCandidateServerReflexive(c.Protocol.String(), ip, int(c.Port), c.Component,
c.RelatedAddress, int(c.RelatedPort))
case RTCIceCandidateTypePrflx:
return ice.NewCandidatePeerReflexive(c.Protocol.String(), ip, int(c.Port), c.Component,
c.RelatedAddress, int(c.RelatedPort))
case RTCIceCandidateTypeRelay:
return ice.NewCandidateRelay(c.Protocol.String(), ip, int(c.Port), c.Component,
c.RelatedAddress, int(c.RelatedPort))
default:
return nil, fmt.Errorf("Unknown candidate type: %s", c.Typ)
}
}
func convertTypeFromICE(t ice.CandidateType) (RTCIceCandidateType, error) {
switch t {
case ice.CandidateTypeHost:
return RTCIceCandidateTypeHost, nil
case ice.CandidateTypeServerReflexive:
return RTCIceCandidateTypeSrflx, nil
case ice.CandidateTypePeerReflexive:
return RTCIceCandidateTypePrflx, nil
case ice.CandidateTypeRelay:
return RTCIceCandidateTypeRelay, nil
default:
return RTCIceCandidateType(t), fmt.Errorf("Unknown ICE candidate type: %s", t)
}
}