diff --git a/codecinfo.go b/codecinfo.go index 6633cb0..01c35b6 100644 --- a/codecinfo.go +++ b/codecinfo.go @@ -1,6 +1,7 @@ package sdp import ( + "strconv" "strings" ) @@ -10,9 +11,10 @@ type CodecInfo struct { rtx int params map[string]string rtcpfbs []*RTCPFeedbackInfo + rate int } -func NewCodecInfo(codec string, payload int) *CodecInfo { +func NewCodecInfo(codec string, payload int, rate int) *CodecInfo { codecInfo := &CodecInfo{ codec: codec, @@ -20,6 +22,7 @@ func NewCodecInfo(codec string, payload int) *CodecInfo { rtx: 0, params: map[string]string{}, rtcpfbs: []*RTCPFeedbackInfo{}, + rate: rate, } return codecInfo @@ -33,6 +36,7 @@ func (c *CodecInfo) Clone() *CodecInfo { rtx: c.rtx, params: make(map[string]string), rtcpfbs: []*RTCPFeedbackInfo{}, + rate: c.rate, } for key, param := range c.params { @@ -72,6 +76,14 @@ func (c *CodecInfo) GetCodec() string { return c.codec } +func (c *CodecInfo) GetRate() int { + return c.rate +} + +func (c *CodecInfo) SetRate(rate int) { + c.rate = rate +} + func (c *CodecInfo) GetParam(key string) string { if c.HasParam(key) { return c.params[key] @@ -121,8 +133,13 @@ func CodecMapFromNames(names []string, rtx bool, rtcpfbs []*RTCPFeedbackInfo) ma for _, name := range names { var pt int + var rate int params := strings.Split(name, ";") - codecName := strings.TrimSpace(strings.ToLower(params[0])) + encoding := strings.Split(params[0], "/") + codecName := strings.TrimSpace(strings.ToLower(encoding[0])) + if len(encoding) == 2 { + rate, _ = strconv.Atoi(encoding[1]) + } if codecName == "pcmu" { pt = 0 } else if codecName == "pcma" { @@ -132,7 +149,7 @@ func CodecMapFromNames(names []string, rtx bool, rtcpfbs []*RTCPFeedbackInfo) ma pt = basePt } - codec := NewCodecInfo(codecName, pt) + codec := NewCodecInfo(codecName, pt, rate) if rtx && codecName != "ulpfec" && codecName != "flexfec-03" && codecName != "red" { basePt++ diff --git a/mediainfo.go b/mediainfo.go index a3ec737..ba46486 100644 --- a/mediainfo.go +++ b/mediainfo.go @@ -308,6 +308,7 @@ func (m *MediaInfo) AnswerCapability(cap *Capability) *MediaInfo { if cloned.HasRTX() { cloned.SetRTX(codec.GetRTX()) } + cloned.SetRate(codec.GetRate()) cloned.AddParams(codec.GetParams()) answer.AddCodec(cloned) } diff --git a/sdpinfo.go b/sdpinfo.go index 084af7f..6eb88c1 100644 --- a/sdpinfo.go +++ b/sdpinfo.go @@ -385,14 +385,14 @@ func (s *SDPInfo) String() string { mediaMap.Rtp = append(mediaMap.Rtp, &transform.RtpStruct{ Payload: codec.GetPayload(), Codec: codec.GetCodec(), - Rate: 48000, + Rate: codec.GetRate(), Encoding: 2, }) } else { mediaMap.Rtp = append(mediaMap.Rtp, &transform.RtpStruct{ Payload: codec.GetPayload(), Codec: codec.GetCodec(), - Rate: 8000, + Rate: codec.GetRate(), }) } } @@ -865,6 +865,7 @@ func Parse(sdp string) (*SDPInfo, error) { payload := fmt.Payload codec := fmt.Codec + rate := fmt.Rate if "RED" == strings.ToUpper(codec) || "ULPFEC" == strings.ToUpper(codec) { continue @@ -893,7 +894,7 @@ func Parse(sdp string) (*SDPInfo, error) { apts[aptint] = payload } } else { - codecInfo := NewCodecInfo(codec, payload) + codecInfo := NewCodecInfo(codec, payload, rate) codecInfo.AddParams(params) mediaInfo.AddCodec(codecInfo) } diff --git a/sdpinfo_test.go b/sdpinfo_test.go index 3632e27..d593898 100644 --- a/sdpinfo_test.go +++ b/sdpinfo_test.go @@ -113,10 +113,10 @@ const sdpstr = "v=1\r\n" + var Capabilities = map[string]*Capability{ "audio": &Capability{ - Codecs: []string{"opus"}, + Codecs: []string{"opus/48000"}, }, "video": &Capability{ - Codecs: []string{"vp8"}, + Codecs: []string{"vp8/90000"}, Rtx: true, Rtcpfbs: []*RtcpFeedback{ &RtcpFeedback{