123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package sdp
- import (
- "fmt"
- "net/url"
- "strconv"
- "strings"
- )
- // Default ext values
- const (
- DefExtMapValueABSSendTime = 1
- DefExtMapValueTransportCC = 2
- DefExtMapValueSDESMid = 3
- DefExtMapValueSDESRTPStreamID = 4
- ABSSendTimeURI = "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"
- TransportCCURI = "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"
- SDESMidURI = "urn:ietf:params:rtp-hdrext:sdes:mid"
- SDESRTPStreamIDURI = "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"
- AudioLevelURI = "urn:ietf:params:rtp-hdrext:ssrc-audio-level"
- )
- // ExtMap represents the activation of a single RTP header extension
- type ExtMap struct {
- Value int
- Direction Direction
- URI *url.URL
- ExtAttr *string
- }
- // Clone converts this object to an Attribute
- func (e *ExtMap) Clone() Attribute {
- return Attribute{Key: "extmap", Value: e.string()}
- }
- // Unmarshal creates an Extmap from a string
- func (e *ExtMap) Unmarshal(raw string) error {
- parts := strings.SplitN(raw, ":", 2)
- if len(parts) != 2 {
- return fmt.Errorf("%w: %v", errSyntaxError, raw)
- }
- fields := strings.Fields(parts[1])
- if len(fields) < 2 {
- return fmt.Errorf("%w: %v", errSyntaxError, raw)
- }
- valdir := strings.Split(fields[0], "/")
- value, err := strconv.ParseInt(valdir[0], 10, 64)
- if (value < 1) || (value > 246) {
- return fmt.Errorf("%w: %v -- extmap key must be in the range 1-256", errSyntaxError, valdir[0])
- }
- if err != nil {
- return fmt.Errorf("%w: %v", errSyntaxError, valdir[0])
- }
- var direction Direction
- if len(valdir) == 2 {
- direction, err = NewDirection(valdir[1])
- if err != nil {
- return err
- }
- }
- uri, err := url.Parse(fields[1])
- if err != nil {
- return err
- }
- if len(fields) == 3 {
- tmp := fields[2]
- e.ExtAttr = &tmp
- }
- e.Value = int(value)
- e.Direction = direction
- e.URI = uri
- return nil
- }
- // Marshal creates a string from an ExtMap
- func (e *ExtMap) Marshal() string {
- return e.Name() + ":" + e.string()
- }
- func (e *ExtMap) string() string {
- output := fmt.Sprintf("%d", e.Value)
- dirstring := e.Direction.String()
- if dirstring != directionUnknownStr {
- output += "/" + dirstring
- }
- if e.URI != nil {
- output += " " + e.URI.String()
- }
- if e.ExtAttr != nil {
- output += " " + *e.ExtAttr
- }
- return output
- }
- // Name returns the constant name of this object
- func (e *ExtMap) Name() string {
- return "extmap"
- }
|