Files
webrtc/internal/sdp/util.go
Sean DuBois de2fb09778 Add support for receiving audio
Update gstreamer-receive to create pipelines for each input.

Currently we don't allow the user to pass in what codecs they support and we don't
take into account the offer. The API will need to be updated to catch
both these signaling errors. The user will pass a slice of support
codecs.
2018-07-01 02:04:47 -07:00

84 lines
2.2 KiB
Go

package sdp
import (
"math/rand"
"strconv"
"strings"
)
// BaseSessionDescription generates a default SDP response that is ice-lite, initiates the DTLS session and supports VP8, VP9 and Opus
func BaseSessionDescription(iceUsername, icePassword, fingerprint string, candidates []string) *SessionDescription {
addMediaCandidates := func(m *MediaDescription) *MediaDescription {
m.Attributes = append(m.Attributes, candidates...)
m.Attributes = append(m.Attributes, "end-of-candidates")
return m
}
audioMediaDescription := &MediaDescription{
MediaName: "audio 9 RTP/SAVPF 111",
ConnectionData: "IN IP4 127.0.0.1",
Attributes: []string{
"setup:active",
"mid:audio",
"sendrecv",
"ice-ufrag:" + iceUsername,
"ice-pwd:" + icePassword,
"ice-lite",
"fingerprint:sha-256 " + fingerprint,
"rtcp-mux",
"rtcp-rsize",
"rtpmap:111 opus/48000/2",
"fmtp:111 minptime=10;useinbandfec=1",
},
}
videoMediaDescription := &MediaDescription{
MediaName: "video 9 RTP/SAVPF 96 98",
ConnectionData: "IN IP4 127.0.0.1",
Attributes: []string{
"setup:active",
"mid:video",
"sendrecv",
"ice-ufrag:" + iceUsername,
"ice-pwd:" + icePassword,
"ice-lite",
"fingerprint:sha-256 " + fingerprint,
"rtcp-mux",
"rtcp-rsize",
"rtpmap:96 VP8/90000",
"rtpmap:98 VP9/90000",
},
}
sessionID := strconv.FormatUint(uint64(rand.Uint32())<<32+uint64(rand.Uint32()), 10)
return &SessionDescription{
ProtocolVersion: 0,
Origin: "pion-webrtc " + sessionID + " 2 IN IP4 0.0.0.0",
SessionName: "-",
Timing: []string{"0 0"},
Attributes: []string{
"group:BUNDLE audio video",
"msid-semantic: WMS",
},
MediaDescriptions: []*MediaDescription{
addMediaCandidates(audioMediaDescription),
addMediaCandidates(videoMediaDescription),
},
}
}
func GetCodecForPayloadType(payloadType uint8, sd *SessionDescription) (ok bool, codec string) {
for _, m := range sd.MediaDescriptions {
for _, a := range m.Attributes {
if strings.Contains(a, "rtpmap:"+strconv.Itoa(int(payloadType))) {
split := strings.Split(a, " ")
if len(split) == 2 {
split := strings.Split(split[1], "/")
return true, split[0]
}
}
}
}
return false, ""
}