diff --git a/go.mod b/go.mod index ea82e289..2d9d5399 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/google/uuid v1.3.0 github.com/pion/rtcp v1.2.9 github.com/pion/rtp v0.0.0-20230107162714-c3ea6851e25b - github.com/pion/sdp/v3 v3.0.5 + github.com/pion/sdp/v3 v3.0.6 github.com/stretchr/testify v1.7.1 golang.org/x/net v0.0.0-20220526153639-5463443f8c37 ) diff --git a/go.sum b/go.sum index ae4b8e6c..d1d461fb 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/pion/rtcp v1.2.9 h1:1ujStwg++IOLIEoOiIQ2s+qBuJ1VN81KW+9pMPsif+U= github.com/pion/rtcp v1.2.9/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo= github.com/pion/rtp v0.0.0-20230107162714-c3ea6851e25b h1:1+fosfmaXgaSehusvtDoH/DtpAnojUTHkqsfhmeDJ3I= github.com/pion/rtp v0.0.0-20230107162714-c3ea6851e25b/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= -github.com/pion/sdp/v3 v3.0.5 h1:ouvI7IgGl+V4CrqskVtr3AaTrPvPisEOxwgpdktctkU= -github.com/pion/sdp/v3 v3.0.5/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw= +github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw= +github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw= github.com/pkg/profile v1.4.0/go.mod h1:NWz/XGvpEW1FyYQ7fCx4dqYBLlfTcE+A9FLAkNKqjFE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/pkg/sdp/sdp.go b/pkg/sdp/sdp.go index 53a2754f..f88c48e8 100644 --- a/pkg/sdp/sdp.go +++ b/pkg/sdp/sdp.go @@ -62,10 +62,11 @@ func parsePort(value string) (int, error) { return port, nil } -func (s *SessionDescription) unmarshalVersion(value string) error { +func (s *SessionDescription) unmarshalProtocolVersion(value string) error { if value != "0" { return fmt.Errorf("invalid version") } + return nil } @@ -74,67 +75,57 @@ func (s *SessionDescription) unmarshalSessionName(value string) error { return nil } +// This is rewritten from scratch to guarantee compatibility with most RTSP +// implementations. func (s *SessionDescription) unmarshalOrigin(value string) error { - // special case for live reporter app - if value[:3] == "-0 " { + value = strings.TrimSpace(value) + + if strings.HasPrefix(value, "-0 ") { // live reporter app value = "- 0 " + value[3:] } - // find spaces from end to beginning, to support multiple spaces - // in the first field - fields := func() []string { - values := strings.Split(strings.TrimSpace(value), " ") - - // special case for some onvif2 cameras - if strings.Compare(values[len(values)-1], "IP4") == 0 { - values = append(values, "127.0.0.1") - } - - return append([]string{strings.Join(values[0:len(values)-5], " ")}, values[len(values)-5:]...) - }() - - if len(fields) != 6 { - return fmt.Errorf("%w `o=%v`", errSDPInvalidSyntax, fields) + i := strings.Index(value, " IN ") + if i < 0 { + return fmt.Errorf("%w `o=%v`", errSDPInvalidSyntax, value) } - var sessionID uint64 + fields := strings.SplitN(value[i+1:], " ", 3) + + s.Origin.NetworkType = "IN" + + s.Origin.AddressType = fields[1] + if i2 := indexOf(s.Origin.AddressType, []string{"IP4", "IP6"}); i2 == -1 { + return fmt.Errorf("%w `%v`", errSDPInvalidValue, s.Origin.AddressType) + } + + if len(fields) >= 3 { + s.Origin.UnicastAddress = fields[2] + } + + fields = strings.SplitN(value[:i], " ", 4) + var err error - switch { - case strings.HasPrefix(fields[1], "0x") || strings.HasPrefix(fields[1], "0X"): - sessionID, err = strconv.ParseUint(fields[1][2:], 16, 64) - case strings.ContainsAny(fields[1], "abcdefABCDEF"): - sessionID, err = strconv.ParseUint(fields[1], 16, 64) - default: - sessionID, err = strconv.ParseUint(fields[1], 10, 64) - } + s.Origin.SessionVersion, err = strconv.ParseUint(fields[len(fields)-1], 10, 64) if err != nil { - return fmt.Errorf("%w `%v`", errSDPInvalidNumericValue, fields[1]) + return fmt.Errorf("%w `%v`", errSDPInvalidNumericValue, fields[len(fields)-1]) } - sessionVersion, err := strconv.ParseUint(fields[2], 10, 64) - if err != nil { - return fmt.Errorf("%w `%v`", errSDPInvalidNumericValue, fields[2]) + if len(fields) >= 2 { + switch { + case strings.HasPrefix(fields[len(fields)-2], "0x"), strings.HasPrefix(fields[len(fields)-2], "0X"): + s.Origin.SessionID, err = strconv.ParseUint(fields[len(fields)-2][2:], 16, 64) + case strings.ContainsAny(fields[len(fields)-2], "abcdefABCDEF"): + s.Origin.SessionID, err = strconv.ParseUint(fields[len(fields)-2], 16, 64) + default: + s.Origin.SessionID, err = strconv.ParseUint(fields[len(fields)-2], 10, 64) + } + if err != nil { + return fmt.Errorf("%w `%v`", errSDPInvalidNumericValue, fields[len(fields)-2]) + } } - // Set according to currently registered with IANA - // https://tools.ietf.org/html/rfc4566#section-8.2.6 - if i := indexOf(fields[3], []string{"IN"}); i == -1 { - return fmt.Errorf("%w `%v`", errSDPInvalidValue, fields[3]) - } - - // Set according to currently registered with IANA - // https://tools.ietf.org/html/rfc4566#section-8.2.7 - if i := indexOf(fields[4], []string{"IP4", "IP6"}); i == -1 { - return fmt.Errorf("%w `%v`", errSDPInvalidValue, fields[3]) - } - - s.Origin = psdp.Origin{ - Username: fields[0], - SessionID: sessionID, - SessionVersion: sessionVersion, - NetworkType: fields[3], - AddressType: fields[4], - UnicastAddress: fields[5], + if len(fields) >= 3 { + s.Origin.Username = strings.Join(fields[:len(fields)-2], " ") } return nil @@ -209,6 +200,7 @@ func (s *SessionDescription) unmarshalSessionConnectionInformation(value string) if err != nil { return fmt.Errorf("%w `c=%v`", errSDPInvalidSyntax, value) } + return nil } @@ -366,7 +358,7 @@ func parseTimeUnits(value string) (int64, error) { func (s *SessionDescription) unmarshalRepeatTimes(value string) error { fields := strings.Fields(value) if len(fields) < 3 { - return fmt.Errorf("%w `r=%v`", errSDPInvalidSyntax, fields) + return fmt.Errorf("%w `r=%v`", errSDPInvalidSyntax, value) } latestTimeDesc := &s.TimeDescriptions[len(s.TimeDescriptions)-1] @@ -503,20 +495,155 @@ func (s *SessionDescription) unmarshalMediaAttribute(value string) error { return nil } +type unmarshalState int + +const ( + stateInitial unmarshalState = iota + stateSession + stateMedia + stateTimeDescription +) + +func (s *SessionDescription) unmarshalSession(state *unmarshalState, key byte, val string) error { + switch key { + case 'o': + err := s.unmarshalOrigin(val) + if err != nil { + return err + } + + case 's': + err := s.unmarshalSessionName(val) + if err != nil { + return err + } + + case 'i': + err := s.unmarshalSessionInformation(val) + if err != nil { + return err + } + + case 'u': + err := s.unmarshalURI(val) + if err != nil { + return err + } + + case 'e': + err := s.unmarshalEmail(val) + if err != nil { + return err + } + + case 'p': + err := s.unmarshalPhone(val) + if err != nil { + return err + } + + case 'c': + err := s.unmarshalSessionConnectionInformation(val) + if err != nil { + return err + } + + case 'b': + err := s.unmarshalSessionBandwidth(val) + if err != nil { + return err + } + + case 'z': + err := s.unmarshalTimeZones(val) + if err != nil { + return err + } + + case 'k': + err := s.unmarshalSessionEncryptionKey(val) + if err != nil { + return err + } + + case 'a': + err := s.unmarshalSessionAttribute(val) + if err != nil { + return err + } + + case 't': + err := s.unmarshalTiming(val) + if err != nil { + return err + } + *state = stateTimeDescription + + case 'm': + err := s.unmarshalMediaDescription(val) + if err != nil { + return err + } + *state = stateMedia + + default: + return fmt.Errorf("invalid key: %c", key) + } + + return nil +} + +func (s *SessionDescription) unmarshalMedia(key byte, val string) error { + switch key { + case 'm': + err := s.unmarshalMediaDescription(val) + if err != nil { + return err + } + + case 'i': + err := s.unmarshalMediaTitle(val) + if err != nil { + return err + } + + case 'c': + err := s.unmarshalMediaConnectionInformation(val) + if err != nil { + return err + } + + case 'b': + err := s.unmarshalMediaBandwidth(val) + if err != nil { + return err + } + + case 'k': + err := s.unmarshalMediaEncryptionKey(val) + if err != nil { + return err + } + + case 'a': + err := s.unmarshalMediaAttribute(val) + if err != nil { + return err + } + + default: + return fmt.Errorf("invalid key: %c", key) + } + + return nil +} + // Unmarshal decodes a SessionDescription. // This is rewritten from scratch to guarantee compatibility with most RTSP // implementations. func (s *SessionDescription) Unmarshal(byts []byte) error { str := string(byts) - type stateVal int - - const ( - stateInitial stateVal = iota - stateSession - stateMedia - ) - state := stateInitial for _, line := range strings.Split(strings.ReplaceAll(str, "\r", ""), "\n") { @@ -535,9 +662,9 @@ func (s *SessionDescription) Unmarshal(byts []byte) error { case stateInitial: switch key { case 'v': - err := s.unmarshalVersion(val) + err := s.unmarshalProtocolVersion(val) if err != nil { - return fmt.Errorf("%s (%s)", err, line) + return err } state = stateSession @@ -546,136 +673,31 @@ func (s *SessionDescription) Unmarshal(byts []byte) error { } case stateSession: - switch key { - case 'o': - err := s.unmarshalOrigin(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 's': - err := s.unmarshalSessionName(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'i': - err := s.unmarshalSessionInformation(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'u': - err := s.unmarshalURI(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'e': - err := s.unmarshalEmail(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'p': - err := s.unmarshalPhone(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'c': - err := s.unmarshalSessionConnectionInformation(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'b': - err := s.unmarshalSessionBandwidth(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'z': - err := s.unmarshalTimeZones(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'k': - err := s.unmarshalSessionEncryptionKey(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'a': - err := s.unmarshalSessionAttribute(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 't': - err := s.unmarshalTiming(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'r': - err := s.unmarshalRepeatTimes(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'm': - err := s.unmarshalMediaDescription(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - state = stateMedia - - default: - return fmt.Errorf("invalid key: %c (%s)", key, line) + err := s.unmarshalSession(&state, key, val) + if err != nil { + return err } case stateMedia: + err := s.unmarshalMedia(key, val) + if err != nil { + return err + } + + case stateTimeDescription: switch key { - case 'm': - err := s.unmarshalMediaDescription(val) + case 'r': + err := s.unmarshalRepeatTimes(val) if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'i': - err := s.unmarshalMediaTitle(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'c': - err := s.unmarshalMediaConnectionInformation(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'b': - err := s.unmarshalMediaBandwidth(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'k': - err := s.unmarshalMediaEncryptionKey(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) - } - - case 'a': - err := s.unmarshalMediaAttribute(val) - if err != nil { - return fmt.Errorf("%s (%s)", err, line) + return err } default: - return fmt.Errorf("invalid key: %c (%s)", key, line) + state = stateSession + err := s.unmarshalSession(&state, key, val) + if err != nil { + return err + } } } } diff --git a/pkg/sdp/sdp_test.go b/pkg/sdp/sdp_test.go index 0f43d5d1..eebee2de 100644 --- a/pkg/sdp/sdp_test.go +++ b/pkg/sdp/sdp_test.go @@ -1,4 +1,6 @@ -//nolint:govet +//go:build go1.18 +// +build go1.18 + package sdp import ( @@ -43,7 +45,7 @@ var cases = []struct { return &v }(), TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{3034423619, 3042462419}, nil}, + {Timing: psdp.Timing{StartTime: 3034423619, StopTime: 3042462419}}, }, }, }, @@ -74,7 +76,7 @@ var cases = []struct { return &v }(), TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{3034423619, 3042462419}, nil}, + {Timing: psdp.Timing{StartTime: 3034423619, StopTime: 3042462419}}, }, }, }, @@ -109,7 +111,7 @@ var cases = []struct { return &v }(), TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{3034423619, 3042462419}, nil}, + {Timing: psdp.Timing{StartTime: 3034423619, StopTime: 3042462419}}, }, }, }, @@ -208,20 +210,29 @@ var cases = []struct { }, }, TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{2873397496, 2873404696}, nil}, - {psdp.Timing{3034423619, 3042462419}, []psdp.RepeatTime{{604800, 3600, []int64{0, 90000}}}}, + {Timing: psdp.Timing{StartTime: 2873397496, StopTime: 2873404696}}, + { + Timing: psdp.Timing{StartTime: 3034423619, StopTime: 3042462419}, + RepeatTimes: []psdp.RepeatTime{{Interval: 604800, Duration: 3600, Offsets: []int64{0, 90000}}}, + }, }, TimeZones: []psdp.TimeZone{ - {2882844526, -3600}, - {2898848070, 0}, + {AdjustmentTime: 2882844526, Offset: -3600}, + {AdjustmentTime: 2898848070}, }, EncryptionKey: func() *psdp.EncryptionKey { v := psdp.EncryptionKey("prompt") return &v }(), Attributes: []psdp.Attribute{ - {"candidate", "0 1 UDP 2113667327 203.0.113.1 54400 typ host"}, - {"recvonly", ""}, + { + Key: "candidate", + Value: "0 1 UDP 2113667327 203.0.113.1 54400 typ host", + }, + { + Key: "recvonly", + Value: "", + }, }, MediaDescriptions: []*psdp.MediaDescription{ { @@ -252,7 +263,9 @@ var cases = []struct { return &v }(), Attributes: []psdp.Attribute{ - {"sendrecv", ""}, + { + Key: "sendrecv", + }, }, }, { @@ -263,7 +276,10 @@ var cases = []struct { Formats: []string{"99"}, }, Attributes: []psdp.Attribute{ - {"rtpmap", "99 h263-1998/90000"}, + { + Key: "rtpmap", + Value: "99 h263-1998/90000", + }, }, }, }, @@ -317,12 +333,21 @@ var cases = []struct { }, SessionName: "RTSP Server", TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{0, 0}, nil}, + {Timing: psdp.Timing{StartTime: 0, StopTime: 0}}, }, Attributes: []psdp.Attribute{ - {"control", "*"}, - {"source-filter", " incl IN IP4 * 10.175.31.17"}, - {"range", "npt=0-"}, + { + Key: "control", + Value: "*", + }, + { + Key: "source-filter", + Value: " incl IN IP4 * 10.175.31.17", + }, + { + Key: "range", + Value: "npt=0-", + }, }, MediaDescriptions: []*psdp.MediaDescription{ { @@ -338,10 +363,22 @@ var cases = []struct { Address: &psdp.Address{Address: "0.0.0.0"}, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 H264/90000"}, - {"fmtp", "96 profile-level-id=4D001E; packetization-mode=1; sprop-parameter-sets=Z00AHpWoKAv+VA==,aO48gA=="}, - {"control", "?ctype=video"}, - {"recvonly", ""}, + { + Key: "rtpmap", + Value: "96 H264/90000", + }, + { + Key: "fmtp", + Value: "96 profile-level-id=4D001E; packetization-mode=1; sprop-parameter-sets=Z00AHpWoKAv+VA==,aO48gA==", + }, + { + Key: "control", + Value: "?ctype=video", + }, + { + Key: "recvonly", + Value: "", + }, }, }, { @@ -352,9 +389,18 @@ var cases = []struct { Formats: []string{"106"}, }, Attributes: []psdp.Attribute{ - {"rtpmap", "106 vnd.onvif.metadata/90000"}, - {"control", "?ctype=app106"}, - {"sendonly", ""}, + { + Key: "rtpmap", + Value: "106 vnd.onvif.metadata/90000", + }, + { + Key: "control", + Value: "?ctype=app106", + }, + { + Key: "sendonly", + Value: "", + }, }, }, }, @@ -405,10 +451,19 @@ var cases = []struct { Formats: []string{"96"}, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 H265/90000"}, - {"fmtp", "96 sprop-vps=QAEMAf//AWAAAAMAsAAAAwAAAwB4FwJA; " + - "sprop-sps=QgEBAWAAAAMAsAAAAwAAAwB4oAKggC8c1YgXuRZFL/y5/E/qbgQEBAE=; sprop-pps=RAHAcvBTJA==;"}, - {"control", "streamid=0"}, + { + Key: "rtpmap", + Value: "96 H265/90000", + }, + { + Key: "fmtp", + Value: "96 sprop-vps=QAEMAf//AWAAAAMAsAAAAwAAAwB4FwJA; " + + "sprop-sps=QgEBAWAAAAMAsAAAAwAAAwB4oAKggC8c1YgXuRZFL/y5/E/qbgQEBAE=; sprop-pps=RAHAcvBTJA==;", + }, + { + Key: "control", + Value: "streamid=0", + }, }, }, { @@ -419,9 +474,18 @@ var cases = []struct { Formats: []string{"97"}, }, Attributes: []psdp.Attribute{ - {"rtpmap", "97 mpeg4-generic/44100/2"}, - {"fmtp", "97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210"}, - {"control", "streamid=1"}, + { + Key: "rtpmap", + Value: "97 mpeg4-generic/44100/2", + }, + { + Key: "fmtp", + Value: "97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210", + }, + { + Key: "control", + Value: "streamid=1", + }, }, }, }, @@ -463,10 +527,19 @@ var cases = []struct { Formats: []string{"96"}, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 H265/90000"}, - {"fmtp", "96 sprop-vps=QAEMAf//AWAAAAMAsAAAAwAAAwB4FwJA; " + - "sprop-sps=QgEBAWAAAAMAsAAAAwAAAwB4oAKggC8c1YgXuRZFL/y5/E/qbgQEBAE=; sprop-pps=RAHAcvBTJA==;"}, - {"control", "streamid=0"}, + { + Key: "rtpmap", + Value: "96 H265/90000", + }, + { + Key: "fmtp", + Value: "96 sprop-vps=QAEMAf//AWAAAAMAsAAAAwAAAwB4FwJA; " + + "sprop-sps=QgEBAWAAAAMAsAAAAwAAAwB4oAKggC8c1YgXuRZFL/y5/E/qbgQEBAE=; sprop-pps=RAHAcvBTJA==;", + }, + { + Key: "control", + Value: "streamid=0", + }, }, }, { @@ -477,9 +550,18 @@ var cases = []struct { Formats: []string{"97"}, }, Attributes: []psdp.Attribute{ - {"rtpmap", "97 mpeg4-generic/44100/2"}, - {"fmtp", "97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210"}, - {"control", "streamid=1"}, + { + Key: "rtpmap", + Value: "97 mpeg4-generic/44100/2", + }, + { + Key: "fmtp", + Value: "97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210", + }, + { + Key: "control", + Value: "streamid=1", + }, }, }, }, @@ -534,9 +616,12 @@ var cases = []struct { AddressType: "IP4", Address: &psdp.Address{Address: "0.0.0.0"}, }, - TimeDescriptions: []psdp.TimeDescription{{psdp.Timing{0, 0}, nil}}, + TimeDescriptions: []psdp.TimeDescription{{Timing: psdp.Timing{StartTime: 0, StopTime: 0}}}, Attributes: []psdp.Attribute{ - {"control", "*"}, + { + Key: "control", + Value: "*", + }, }, MediaDescriptions: []*psdp.MediaDescription{ { @@ -553,9 +638,18 @@ var cases = []struct { }, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 H264/90000"}, - {"fmtp", "96 packetization-mode=1; sprop-parameter-sets=J2QAHqxWgKA9pqAgIMBA,KO48sA==; profile-level-id=64001E"}, - {"control", "streamid=0"}, + { + Key: "rtpmap", + Value: "96 H264/90000", + }, + { + Key: "fmtp", + Value: "96 packetization-mode=1; sprop-parameter-sets=J2QAHqxWgKA9pqAgIMBA,KO48sA==; profile-level-id=64001E", + }, + { + Key: "control", + Value: "streamid=0", + }, }, }, { @@ -572,9 +666,18 @@ var cases = []struct { }, }, Attributes: []psdp.Attribute{ - {"rtpmap", "97 MPEG4-GENERIC/48000/1"}, - {"fmtp", "97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexLength=3;indexDeltaLength=3;config=118856E500"}, - {"control", "streamid=1"}, + { + Key: "rtpmap", + Value: "97 MPEG4-GENERIC/48000/1", + }, + { + Key: "fmtp", + Value: "97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexLength=3;indexDeltaLength=3;config=118856E500", + }, + { + Key: "control", + Value: "streamid=1", + }, }, }, }, @@ -623,9 +726,12 @@ var cases = []struct { AddressType: "IP4", Address: &psdp.Address{Address: "0.0.0.0"}, }, - TimeDescriptions: []psdp.TimeDescription{{psdp.Timing{0, 0}, nil}}, + TimeDescriptions: []psdp.TimeDescription{{Timing: psdp.Timing{StartTime: 0, StopTime: 0}}}, Attributes: []psdp.Attribute{ - {"range", "npt=now-"}, + { + Key: "range", + Value: "npt=now-", + }, }, MediaDescriptions: []*psdp.MediaDescription{ { @@ -636,12 +742,27 @@ var cases = []struct { Formats: []string{"105"}, }, Attributes: []psdp.Attribute{ - {"rtpmap", "105 H264/90000"}, - {"control", "trackID=1"}, - {"recvonly", ""}, - {"framerate", "25.0"}, - {"fmtp", "105 packetization-mode=1; profile-level-id=640028; " + - "sprop-parameter-sets=Z2QAKKwa0A8ARPy4CIAAAAMAgAAADLWgAtwAHJ173CPFCKg=,KO4ESSJAAAAAAAAAAA=="}, + { + Key: "rtpmap", + Value: "105 H264/90000", + }, + { + Key: "control", + Value: "trackID=1", + }, + { + Key: "recvonly", + Value: "", + }, + { + Key: "framerate", + Value: "25.0", + }, + { + Key: "fmtp", + Value: "105 packetization-mode=1; profile-level-id=640028; " + + "sprop-parameter-sets=Z2QAKKwa0A8ARPy4CIAAAAMAgAAADLWgAtwAHJ173CPFCKg=,KO4ESSJAAAAAAAAAAA==", + }, }, }, }, @@ -706,12 +827,21 @@ var cases = []struct { AddressType: "IP4", Address: &psdp.Address{Address: "0.0.0.0"}, }, - TimeDescriptions: []psdp.TimeDescription{{psdp.Timing{0, 0}, nil}}, + TimeDescriptions: []psdp.TimeDescription{{Timing: psdp.Timing{StartTime: 0, StopTime: 0}}}, Attributes: []psdp.Attribute{ - {"tool", "vlc 3.0.11"}, - {"recvonly", ""}, - {"type", "broadcast"}, - {"charset", "UTF-8"}, + { + Key: "tool", + Value: "vlc 3.0.11", + }, + {Key: "recvonly"}, + { + Key: "type", + Value: "broadcast", + }, + { + Key: "charset", + Value: "UTF-8", + }, }, MediaDescriptions: []*psdp.MediaDescription{ { @@ -727,9 +857,15 @@ var cases = []struct { }, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 mpeg4-generic/22050"}, - {"fmtp", "96 streamtype=5; profile-level-id=15; " + - "mode=AAC-hbr; config=1388; SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1;"}, + { + Key: "rtpmap", + Value: "96 mpeg4-generic/22050", + }, + { + Key: "fmtp", + Value: "96 streamtype=5; profile-level-id=15; " + + "mode=AAC-hbr; config=1388; SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1;", + }, }, }, { @@ -745,8 +881,14 @@ var cases = []struct { }, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 H264/90000"}, - {"fmtp", "96 packetization-mode=1;profile-level-id=640028;sprop-parameter-sets=J2QAKKwrQCgDzQDxImo=,KO4CXLA=;"}, + { + Key: "rtpmap", + Value: "96 H264/90000", + }, + { + Key: "fmtp", + Value: "96 packetization-mode=1;profile-level-id=640028;sprop-parameter-sets=J2QAKKwrQCgDzQDxImo=,KO4CXLA=;", + }, }, }, }, @@ -785,9 +927,12 @@ var cases = []struct { AddressType: "IP4", Address: &psdp.Address{Address: "239.3.1.142"}, }, - TimeDescriptions: []psdp.TimeDescription{{psdp.Timing{0, 0}, nil}}, + TimeDescriptions: []psdp.TimeDescription{{Timing: psdp.Timing{StartTime: 0, StopTime: 0}}}, Attributes: []psdp.Attribute{ - {"range", "clock=0-"}, + { + Key: "range", + Value: "clock=0-", + }, }, MediaDescriptions: []*psdp.MediaDescription{ { @@ -830,7 +975,7 @@ var cases = []struct { "b=AS:5000\r\n" + "a=control:rtsp://10.10.1.30:8554/onvif2/audio/trackID=1\r\n"), []byte("v=0\r\n" + - "o=RTSP 16381778200090761968 16381778200090839277 IN IP4 127.0.0.1\r\n" + + "o=RTSP 16381778200090761968 16381778200090839277 IN IP4 \r\n" + "s=RTSP Server\r\n" + "e=NONE\r\n" + "t=0 0\r\n" + @@ -856,17 +1001,20 @@ var cases = []struct { SessionVersion: 16381778200090839277, NetworkType: "IN", AddressType: "IP4", - UnicastAddress: "127.0.0.1", + UnicastAddress: "", }, SessionName: psdp.SessionName("RTSP Server"), EmailAddress: func() *psdp.EmailAddress { v := psdp.EmailAddress("NONE") return &v }(), - TimeDescriptions: []psdp.TimeDescription{{psdp.Timing{0, 0}, nil}}, + TimeDescriptions: []psdp.TimeDescription{{Timing: psdp.Timing{StartTime: 0, StopTime: 0}}}, Attributes: []psdp.Attribute{ - {"recvonly", ""}, - {"x-dimensions", "1920,1080"}, + {Key: "recvonly"}, + { + Key: "x-dimensions", + Value: "1920,1080", + }, }, MediaDescriptions: []*psdp.MediaDescription{ { @@ -888,11 +1036,26 @@ var cases = []struct { }, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 H264/90000"}, - {"fmtp", "96 packetization-mode=1;profile-level-id=64001e;sprop-parameter-sets=Z2QAHqwsaoMg5puAgICB,aO4xshs="}, - {"Media_header", "MEDIAINFO=494D4B48010100000400010000000000000000000000000000000000000000000000000000000000;"}, - {"appversion", "1.0"}, - {"control", "rtsp://10.10.1.30:8554/onvif2/audio/trackID=0"}, + { + Key: "rtpmap", + Value: "96 H264/90000", + }, + { + Key: "fmtp", + Value: "96 packetization-mode=1;profile-level-id=64001e;sprop-parameter-sets=Z2QAHqwsaoMg5puAgICB,aO4xshs=", + }, + { + Key: "Media_header", + Value: "MEDIAINFO=494D4B48010100000400010000000000000000000000000000000000000000000000000000000000;", + }, + { + Key: "appversion", + Value: "1.0", + }, + { + Key: "control", + Value: "rtsp://10.10.1.30:8554/onvif2/audio/trackID=0", + }, }, }, { @@ -914,8 +1077,14 @@ var cases = []struct { }, }, Attributes: []psdp.Attribute{ - {"rtpmap", "0 PCMU/8000/1"}, - {"control", "rtsp://10.10.1.30:8554/onvif2/audio/trackID=1"}, + { + Key: "rtpmap", + Value: "0 PCMU/8000/1", + }, + { + Key: "control", + Value: "rtsp://10.10.1.30:8554/onvif2/audio/trackID=1", + }, }, }, }, @@ -996,14 +1165,29 @@ var cases = []struct { Bandwidth: 104, }, }, - TimeDescriptions: []psdp.TimeDescription{{psdp.Timing{0, 0}, nil}}, + TimeDescriptions: []psdp.TimeDescription{{Timing: psdp.Timing{StartTime: 0, StopTime: 0}}}, Attributes: []psdp.Attribute{ - {"maxps", "1250"}, - {"control", "rtsp://61.135.88.175:554/refuse/unavailable_media.wmv/"}, - {"etag", "{CCEE392D-83DF-F4AA-130B-E8A05562CE63}"}, - {"range", "npt=3.000-6.185"}, - {"type", "notstridable"}, - {"recvonly", ""}, + { + Key: "maxps", + Value: "1250", + }, + { + Key: "control", + Value: "rtsp://61.135.88.175:554/refuse/unavailable_media.wmv/", + }, + { + Key: "etag", + Value: "{CCEE392D-83DF-F4AA-130B-E8A05562CE63}", + }, + { + Key: "range", + Value: "npt=3.000-6.185", + }, + { + Key: "type", + Value: "notstridable", + }, + {Key: "recvonly"}, }, MediaDescriptions: []*psdp.MediaDescription{ { @@ -1033,9 +1217,18 @@ var cases = []struct { }, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 x-asf-pf/1000"}, - {"control", "video"}, - {"stream", "1"}, + { + Key: "rtpmap", + Value: "96 x-asf-pf/1000", + }, + { + Key: "control", + Value: "video", + }, + { + Key: "stream", + Value: "1", + }, }, }, { @@ -1056,9 +1249,18 @@ var cases = []struct { }, }, Attributes: []psdp.Attribute{ - {"rtpmap", "96 x-wms-rtx/1000"}, - {"control", "rtx"}, - {"stream", "65536"}, + { + Key: "rtpmap", + Value: "96 x-wms-rtx/1000", + }, + { + Key: "control", + Value: "rtx", + }, + { + Key: "stream", + Value: "65536", + }, }, }, }, @@ -1223,7 +1425,7 @@ var cases = []struct { return &v }(), TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{3034423619, 3042462419}, nil}, + {Timing: psdp.Timing{StartTime: 3034423619, StopTime: 3042462419}}, }, }, }, @@ -1292,7 +1494,7 @@ var cases = []struct { return &v }(), TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{0, 0}, nil}, + {Timing: psdp.Timing{StartTime: 0, StopTime: 0}}, }, ConnectionInformation: &psdp.ConnectionInformation{ NetworkType: "IN", @@ -1419,7 +1621,7 @@ var cases = []struct { }, SessionName: "RTP session", TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{0, 0}, nil}, + {Timing: psdp.Timing{StartTime: 0, StopTime: 0}}, }, EmailAddress: func() *psdp.EmailAddress { e := psdp.EmailAddress("NONE") @@ -1489,7 +1691,7 @@ var cases = []struct { return &v }(), TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{3034423619, 3042462419}, nil}, + {Timing: psdp.Timing{StartTime: 3034423619, StopTime: 3042462419}}, }, }, }, @@ -1520,7 +1722,7 @@ var cases = []struct { return &v }(), TimeDescriptions: []psdp.TimeDescription{ - {psdp.Timing{3034423619, 3042462419}, nil}, + {Timing: psdp.Timing{StartTime: 3034423619, StopTime: 3042462419}}, }, }, }, @@ -1826,6 +2028,98 @@ var cases = []struct { }, }, }, + { + "onvif specification example", + []byte("v=0\r\n" + + "o= 2890842807 IN IP4 192.168.0.1\r\n" + + "s=RTSP Session with audiobackchannel\r\n" + + "m=video 0 RTP/AVP 26\r\n" + + "a=control:rtsp://192.168.0.1/video\r\n" + + "a=recvonly\r\n" + + "m=audio 0 RTP/AVP 0\r\n" + + "a=control:rtsp://192.168.0.1/audio\r\n" + + "a=recvonly\r\n" + + "m=audio 0 RTP/AVP 0\r\n" + + "a=control:rtsp://192.168.0.1/audioback\r\n" + + "a=rtpmap:0 PCMU/8000\r\n" + + "a=sendonly\r\n"), + []byte("v=0\r\n" + + "o= 0 2890842807 IN IP4 192.168.0.1\r\n" + + "s=RTSP Session with audiobackchannel\r\n" + + "m=video 0 RTP/AVP 26\r\n" + + "a=control:rtsp://192.168.0.1/video\r\n" + + "a=recvonly\r\n" + + "m=audio 0 RTP/AVP 0\r\n" + + "a=control:rtsp://192.168.0.1/audio\r\n" + + "a=recvonly\r\n" + + "m=audio 0 RTP/AVP 0\r\n" + + "a=control:rtsp://192.168.0.1/audioback\r\n" + + "a=rtpmap:0 PCMU/8000\r\n" + + "a=sendonly\r\n"), + SessionDescription{ + Origin: psdp.Origin{ + SessionVersion: 2890842807, + NetworkType: "IN", + AddressType: "IP4", + UnicastAddress: "192.168.0.1", + }, + SessionName: "RTSP Session with audiobackchannel", + MediaDescriptions: []*psdp.MediaDescription{ + { + MediaName: psdp.MediaName{ + Media: "video", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"26"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "control", + Value: "rtsp://192.168.0.1/video", + }, + { + Key: "recvonly", + }, + }, + }, + { + MediaName: psdp.MediaName{ + Media: "audio", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"0"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "control", + Value: "rtsp://192.168.0.1/audio", + }, + { + Key: "recvonly", + }, + }, + }, + { + MediaName: psdp.MediaName{ + Media: "audio", + Protos: []string{"RTP", "AVP"}, + Formats: []string{"0"}, + }, + Attributes: []psdp.Attribute{ + { + Key: "control", + Value: "rtsp://192.168.0.1/audioback", + }, + { + Key: "rtpmap", + Value: "0 PCMU/8000", + }, + { + Key: "sendonly", + }, + }, + }, + }, + }, + }, } func TestUnmarshal(t *testing.T) { @@ -1848,3 +2142,31 @@ func TestMarshal(t *testing.T) { }) } } + +func FuzzUnmarshal(f *testing.F) { + f.Add("v=0\r\n" + + "t=2873397496 2873404696\r\n" + + "t=3034423619 3042462419\r\n" + + "r=aa bb 0 90000\r\n") + + f.Add("v=0\r\n" + + "t=2873397496 2873404696\r\n" + + "t=3034423619 3042462419\r\n" + + "r=123 bb 0 90000\r\n") + + f.Add("v=0\r\n" + + "m=audio 49170 RTP/AVP 80000\r\n" + + "i=Vivamus a posuere nisl\r\n" + + "c=IN IP4 203.0.113.1\r\n" + + "b=X-YZ:128\r\n" + + "k=prompt\r\n" + + "a=sendrecv\r\n") + + f.Add("v=0\r\n" + + "o = IN \r\n") + + f.Fuzz(func(t *testing.T, b string) { + desc := SessionDescription{} + desc.Unmarshal([]byte(b)) + }) +} diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/00b7367f67caa34778492ab383233369474298be964fb340e898a8ca362bd55b b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/00b7367f67caa34778492ab383233369474298be964fb340e898a8ca362bd55b new file mode 100644 index 00000000..c61dd10d --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/00b7367f67caa34778492ab383233369474298be964fb340e898a8ca362bd55b @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nu=%\xf3\x96\x830") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/03519ee3f18985ba9bfdb3dba85ede6403c66c2d8199aa604d2c99eaeb67b60c b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/03519ee3f18985ba9bfdb3dba85ede6403c66c2d8199aa604d2c99eaeb67b60c new file mode 100644 index 00000000..64b94405 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/03519ee3f18985ba9bfdb3dba85ede6403c66c2d8199aa604d2c99eaeb67b60c @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nt=0 A") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/065f924441c602dd6734210d4527f645b1db6272b2f5522c784f224e86fdcd75 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/065f924441c602dd6734210d4527f645b1db6272b2f5522c784f224e86fdcd75 new file mode 100644 index 00000000..58ee4ecd --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/065f924441c602dd6734210d4527f645b1db6272b2f5522c784f224e86fdcd75 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nm=audio 70000 0 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/08f981cf6fba3921b17959f6d20de99ab7cf11c2eddf80bf4e4f34f4655aa1c6 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/08f981cf6fba3921b17959f6d20de99ab7cf11c2eddf80bf4e4f34f4655aa1c6 new file mode 100644 index 00000000..bbb18337 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/08f981cf6fba3921b17959f6d20de99ab7cf11c2eddf80bf4e4f34f4655aa1c6 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nc=0 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/2002c45c48216a92b410c748d2e23b77ebe81511066a1d0e9ebb0cf8cb3a7c0b b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/2002c45c48216a92b410c748d2e23b77ebe81511066a1d0e9ebb0cf8cb3a7c0b new file mode 100644 index 00000000..b8eac194 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/2002c45c48216a92b410c748d2e23b77ebe81511066a1d0e9ebb0cf8cb3a7c0b @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nm=0 0 0 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/2b4f825421f63eefecdf649f29ec49bedcaf1c99d73f4bba16b21b0aa278fdf4 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/2b4f825421f63eefecdf649f29ec49bedcaf1c99d73f4bba16b21b0aa278fdf4 new file mode 100644 index 00000000..8c2864aa --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/2b4f825421f63eefecdf649f29ec49bedcaf1c99d73f4bba16b21b0aa278fdf4 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nz=000") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/3c786d891daf8abec600622fafb32859ab26676a71a7e8bb4bd4354c0fa173b5 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/3c786d891daf8abec600622fafb32859ab26676a71a7e8bb4bd4354c0fa173b5 new file mode 100644 index 00000000..75280b54 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/3c786d891daf8abec600622fafb32859ab26676a71a7e8bb4bd4354c0fa173b5 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nm=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/3faa1126c9c504d5ea8bed06bc3657c6cb83c07c5420d954b5ad0ab4151f679c b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/3faa1126c9c504d5ea8bed06bc3657c6cb83c07c5420d954b5ad0ab4151f679c new file mode 100644 index 00000000..b2b86759 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/3faa1126c9c504d5ea8bed06bc3657c6cb83c07c5420d954b5ad0ab4151f679c @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nm=audio 0 AVP 0\nb=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/4264832a3fc0e06b579bb7479b0fd0241bd565034430fddf454b5e18a1ee8012 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/4264832a3fc0e06b579bb7479b0fd0241bd565034430fddf454b5e18a1ee8012 new file mode 100644 index 00000000..fa40bf6c --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/4264832a3fc0e06b579bb7479b0fd0241bd565034430fddf454b5e18a1ee8012 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nb=X-:") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/476741bf9be65c8674e8b3a9410b0a8637f137a8876f39be38d176ef4274ab2f b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/476741bf9be65c8674e8b3a9410b0a8637f137a8876f39be38d176ef4274ab2f new file mode 100644 index 00000000..3eeb98b0 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/476741bf9be65c8674e8b3a9410b0a8637f137a8876f39be38d176ef4274ab2f @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nc=IN 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/52ad1950491e9c098de2b44d1b5ddee32c5017d42bfe7a9a9544adab65105b24 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/52ad1950491e9c098de2b44d1b5ddee32c5017d42bfe7a9a9544adab65105b24 new file mode 100644 index 00000000..b5120c05 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/52ad1950491e9c098de2b44d1b5ddee32c5017d42bfe7a9a9544adab65105b24 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nz=0 m") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/5d59a5b388f85cdcd06fe082e49a7246d28ba107a6ceea9c17fa69cd5458d672 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/5d59a5b388f85cdcd06fe082e49a7246d28ba107a6ceea9c17fa69cd5458d672 new file mode 100644 index 00000000..66473cd3 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/5d59a5b388f85cdcd06fe082e49a7246d28ba107a6ceea9c17fa69cd5458d672 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nb=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/60ec2b3be3236b3546ee4faeb911f724eff7fa3ded86bf26006817b60264d68d b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/60ec2b3be3236b3546ee4faeb911f724eff7fa3ded86bf26006817b60264d68d new file mode 100644 index 00000000..7178a0be --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/60ec2b3be3236b3546ee4faeb911f724eff7fa3ded86bf26006817b60264d68d @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nm=audio A 0 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/6446b7fef734e527a82e3bf00f8f58aa4b931e5b89247a66c34bb4dd13d395d0 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/6446b7fef734e527a82e3bf00f8f58aa4b931e5b89247a66c34bb4dd13d395d0 new file mode 100644 index 00000000..4ddaba6d --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/6446b7fef734e527a82e3bf00f8f58aa4b931e5b89247a66c34bb4dd13d395d0 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nr=0 0 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/6cc0c8cb4e41deba9bfbb27a190dec79841d97c5a6dc2a3e36fcc5d447dce0e4 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/6cc0c8cb4e41deba9bfbb27a190dec79841d97c5a6dc2a3e36fcc5d447dce0e4 new file mode 100644 index 00000000..c9be896e --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/6cc0c8cb4e41deba9bfbb27a190dec79841d97c5a6dc2a3e36fcc5d447dce0e4 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nc=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/7df0c75aedba2111e86d1e5b4a4f43344a9d2b8ce4a55c4ae06feb4ee58a7696 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/7df0c75aedba2111e86d1e5b4a4f43344a9d2b8ce4a55c4ae06feb4ee58a7696 new file mode 100644 index 00000000..d722fdba --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/7df0c75aedba2111e86d1e5b4a4f43344a9d2b8ce4a55c4ae06feb4ee58a7696 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\no=A IN IP4") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/80fd9703c035f4d6129b30b6e6c875a56cbbe30d63955cb3ce6ac33c3847b9d0 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/80fd9703c035f4d6129b30b6e6c875a56cbbe30d63955cb3ce6ac33c3847b9d0 new file mode 100644 index 00000000..21055938 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/80fd9703c035f4d6129b30b6e6c875a56cbbe30d63955cb3ce6ac33c3847b9d0 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nm=audio 0 0 00") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/87f2b5d6c8f3a280c04377f6edd3f89390950570f3470ae000da33f9b798093a b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/87f2b5d6c8f3a280c04377f6edd3f89390950570f3470ae000da33f9b798093a new file mode 100644 index 00000000..a603f5ed --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/87f2b5d6c8f3a280c04377f6edd3f89390950570f3470ae000da33f9b798093a @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/994ea360fd5b04b05f26903e58a3a7ca3fa7f70b5a10d229a66c8a601014a42e b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/994ea360fd5b04b05f26903e58a3a7ca3fa7f70b5a10d229a66c8a601014a42e new file mode 100644 index 00000000..60440a02 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/994ea360fd5b04b05f26903e58a3a7ca3fa7f70b5a10d229a66c8a601014a42e @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nz=0 h") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/9c0e3b0d5fd22366272d52c7317b02b33b30b9a5f0275d2420416ef1651cc28a b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/9c0e3b0d5fd22366272d52c7317b02b33b30b9a5f0275d2420416ef1651cc28a new file mode 100644 index 00000000..5b4062a3 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/9c0e3b0d5fd22366272d52c7317b02b33b30b9a5f0275d2420416ef1651cc28a @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nb=:") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/a80207167af7d4226d9b7f5ab862a6070fb255e755802dd8ddc1979a5a189c3d b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/a80207167af7d4226d9b7f5ab862a6070fb255e755802dd8ddc1979a5a189c3d new file mode 100644 index 00000000..0e40215a --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/a80207167af7d4226d9b7f5ab862a6070fb255e755802dd8ddc1979a5a189c3d @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\no=0 IN 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/aaee534ad443bf39688356be0d6d805bfb3ff07ecdc2fb6cefb442916f3e4d0a b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/aaee534ad443bf39688356be0d6d805bfb3ff07ecdc2fb6cefb442916f3e4d0a new file mode 100644 index 00000000..9cb2e069 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/aaee534ad443bf39688356be0d6d805bfb3ff07ecdc2fb6cefb442916f3e4d0a @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nz=A 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/bc5976cc4b0e30b24c1cc20d9ffddc659d604bfa7026c7425194d27412c01626 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/bc5976cc4b0e30b24c1cc20d9ffddc659d604bfa7026c7425194d27412c01626 new file mode 100644 index 00000000..5558d607 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/bc5976cc4b0e30b24c1cc20d9ffddc659d604bfa7026c7425194d27412c01626 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nt=0 0\nr=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/c5f5115121fe869a569086cd89c76eab69306aa9c984e4993c2da1e5433601d8 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/c5f5115121fe869a569086cd89c76eab69306aa9c984e4993c2da1e5433601d8 new file mode 100644 index 00000000..32084ec5 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/c5f5115121fe869a569086cd89c76eab69306aa9c984e4993c2da1e5433601d8 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nz=0 A") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/c7bc9b94191851854f3be134ee2e3221781ca535c4821135009b59d37904ea05 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/c7bc9b94191851854f3be134ee2e3221781ca535c4821135009b59d37904ea05 new file mode 100644 index 00000000..d18e2be6 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/c7bc9b94191851854f3be134ee2e3221781ca535c4821135009b59d37904ea05 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nt=0 0\nr=0 0 A") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/cd16eadb08821cf9c8dfd53b3b05ea14b16a99e083f00ce924a4ac444c43174f b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/cd16eadb08821cf9c8dfd53b3b05ea14b16a99e083f00ce924a4ac444c43174f new file mode 100644 index 00000000..3ea061d7 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/cd16eadb08821cf9c8dfd53b3b05ea14b16a99e083f00ce924a4ac444c43174f @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nz=0 d") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/ce9e77c2282dee1830cb6fdec078272c9609782ffa2fe200cb56c8fbf74c5b19 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/ce9e77c2282dee1830cb6fdec078272c9609782ffa2fe200cb56c8fbf74c5b19 new file mode 100644 index 00000000..6df32e7b --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/ce9e77c2282dee1830cb6fdec078272c9609782ffa2fe200cb56c8fbf74c5b19 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\no=X 0 IN IP4") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e18bdc6ecb544ea3ba5d903e817b98dff5e4de5ebb4a9fba3218b16958efdad0 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e18bdc6ecb544ea3ba5d903e817b98dff5e4de5ebb4a9fba3218b16958efdad0 new file mode 100644 index 00000000..8eb655ea --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e18bdc6ecb544ea3ba5d903e817b98dff5e4de5ebb4a9fba3218b16958efdad0 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nm=audio 0 AVP 0\nc=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e42f80c258804c025ea169f0d895e923f43cb55b1b6437f05dd7d995b264430e b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e42f80c258804c025ea169f0d895e923f43cb55b1b6437f05dd7d995b264430e new file mode 100644 index 00000000..0045691c --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e42f80c258804c025ea169f0d895e923f43cb55b1b6437f05dd7d995b264430e @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nt=A 0") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e5f5f1dfefaee7a9d77a43c895b6f38c3f79b8ec6d0ef348d3f5720173d8f386 b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e5f5f1dfefaee7a9d77a43c895b6f38c3f79b8ec6d0ef348d3f5720173d8f386 new file mode 100644 index 00000000..8c786325 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/e5f5f1dfefaee7a9d77a43c895b6f38c3f79b8ec6d0ef348d3f5720173d8f386 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nt=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/f07494b4db71ff0c7fb955449347267346836e32012a220bba1a8dc9037e9a1a b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/f07494b4db71ff0c7fb955449347267346836e32012a220bba1a8dc9037e9a1a new file mode 100644 index 00000000..6901b7ad --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/f07494b4db71ff0c7fb955449347267346836e32012a220bba1a8dc9037e9a1a @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\no=") diff --git a/pkg/sdp/testdata/fuzz/FuzzUnmarshal/f44c28a484b8646af37536ba998a671b1a42a8f2e367c7ebccc7236f7e68ed7e b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/f44c28a484b8646af37536ba998a671b1a42a8f2e367c7ebccc7236f7e68ed7e new file mode 100644 index 00000000..5b8b2981 --- /dev/null +++ b/pkg/sdp/testdata/fuzz/FuzzUnmarshal/f44c28a484b8646af37536ba998a671b1a42a8f2e367c7ebccc7236f7e68ed7e @@ -0,0 +1,2 @@ +go test fuzz v1 +string("v=0\nm=audio 0/ 0 0") diff --git a/serverconn.go b/serverconn.go index 49e3aa64..960c3168 100644 --- a/serverconn.go +++ b/serverconn.go @@ -25,6 +25,18 @@ func getSessionID(header base.Header) string { return "" } +func filterMedias(medias media.Medias, streamMedias map[*media.Media]*serverStreamMedia) media.Medias { + copy := make(media.Medias, len(medias)) + for i, medi := range medias { + copy[i] = &media.Media{ + Type: medi.Type, + Formats: medi.Formats, + Control: "mediaUUID=" + streamMedias[medi].uuid.String(), + } + } + return copy +} + type readReq struct { req *base.Request res chan error @@ -378,17 +390,8 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { } } - mediasCopy := make(media.Medias, len(stream.medias)) - for i, medi := range stream.medias { - mediasCopy[i] = &media.Media{ - Type: medi.Type, - Formats: medi.Formats, - Control: "mediaUUID=" + stream.streamMedias[medi].uuid.String(), - } - } - if stream != nil { - byts, _ := mediasCopy.Marshal(multicast).Marshal() + byts, _ := filterMedias(stream.medias, stream.streamMedias).Marshal(multicast).Marshal() res.Body = byts } }