111 lines
2.3 KiB
Go
111 lines
2.3 KiB
Go
|
package sdp
|
||
|
|
||
|
import (
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Information describes the "i=" field which provides textual information
|
||
|
// about the session.
|
||
|
type Information string
|
||
|
|
||
|
func (i Information) String() string {
|
||
|
return string(i)
|
||
|
}
|
||
|
|
||
|
// ConnectionInformation defines the representation for the "c=" field
|
||
|
// containing connection data.
|
||
|
type ConnectionInformation struct {
|
||
|
NetworkType string
|
||
|
AddressType string
|
||
|
Address *Address
|
||
|
}
|
||
|
|
||
|
func (c ConnectionInformation) String() string {
|
||
|
parts := []string{c.NetworkType, c.AddressType}
|
||
|
if c.Address != nil && c.Address.String() != "" {
|
||
|
parts = append(parts, c.Address.String())
|
||
|
}
|
||
|
return strings.Join(parts, " ")
|
||
|
}
|
||
|
|
||
|
// Address desribes a structured address token from within the "c=" field.
|
||
|
type Address struct {
|
||
|
Address string
|
||
|
TTL *int
|
||
|
Range *int
|
||
|
}
|
||
|
|
||
|
func (c *Address) String() string {
|
||
|
var parts []string
|
||
|
parts = append(parts, c.Address)
|
||
|
if c.TTL != nil {
|
||
|
parts = append(parts, strconv.Itoa(*c.TTL))
|
||
|
}
|
||
|
|
||
|
if c.Range != nil {
|
||
|
parts = append(parts, strconv.Itoa(*c.Range))
|
||
|
}
|
||
|
|
||
|
return strings.Join(parts, "/")
|
||
|
}
|
||
|
|
||
|
// Bandwidth describes an optional field which denotes the proposed bandwidth
|
||
|
// to be used by the session or media.
|
||
|
type Bandwidth struct {
|
||
|
Experimental bool
|
||
|
Type string
|
||
|
Bandwidth uint64
|
||
|
}
|
||
|
|
||
|
func (b Bandwidth) String() string {
|
||
|
var output string
|
||
|
if b.Experimental {
|
||
|
output += "X-"
|
||
|
}
|
||
|
output += b.Type + ":" + strconv.FormatUint(b.Bandwidth, 10)
|
||
|
return output
|
||
|
}
|
||
|
|
||
|
// EncryptionKey describes the "k=" which conveys encryption key information.
|
||
|
type EncryptionKey string
|
||
|
|
||
|
func (s EncryptionKey) String() string {
|
||
|
return string(s)
|
||
|
}
|
||
|
|
||
|
// Attribute describes the "a=" field which represents the primary means for
|
||
|
// extending SDP.
|
||
|
type Attribute struct {
|
||
|
Key string
|
||
|
Value string
|
||
|
}
|
||
|
|
||
|
// NewPropertyAttribute constructs a new attribute
|
||
|
func NewPropertyAttribute(key string) Attribute {
|
||
|
return Attribute{
|
||
|
Key: key,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// NewAttribute constructs a new attribute
|
||
|
func NewAttribute(key, value string) Attribute {
|
||
|
return Attribute{
|
||
|
Key: key,
|
||
|
Value: value,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (a Attribute) String() string {
|
||
|
output := a.Key
|
||
|
if len(a.Value) > 0 {
|
||
|
output += ":" + a.Value
|
||
|
}
|
||
|
return output
|
||
|
}
|
||
|
|
||
|
// IsICECandidate returns true if the attribute key equals "candidate".
|
||
|
func (a Attribute) IsICECandidate() bool {
|
||
|
return a.Key == "candidate"
|
||
|
}
|