format: fix compatibility with some TP-Link cameras (#174)

https://github.com/aler9/rtsp-simple-server/issues/1267
This commit is contained in:
Alessandro Ros
2023-01-22 19:32:17 +01:00
committed by GitHub
parent f6438ed8d1
commit 82dac32f6e
2 changed files with 33 additions and 2 deletions

View File

@@ -54,6 +54,16 @@ type Format interface {
// Unmarshal decodes a format from a media description. // Unmarshal decodes a format from a media description.
func Unmarshal(md *psdp.MediaDescription, payloadTypeStr string) (Format, error) { func Unmarshal(md *psdp.MediaDescription, payloadTypeStr string) (Format, error) {
if payloadTypeStr == "smart/1/90000" {
attr, ok := md.Attribute("rtpmap")
if ok {
i := strings.Index(attr, " TP-LINK/90000")
if i >= 0 {
payloadTypeStr = attr[:i]
}
}
}
tmp, err := strconv.ParseInt(payloadTypeStr, 10, 8) tmp, err := strconv.ParseInt(payloadTypeStr, 10, 8)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -613,7 +613,7 @@ func TestNewFromMediaDescription(t *testing.T) {
}, },
}, },
{ {
"generic invalid rtpmap", "application invalid rtpmap",
&psdp.MediaDescription{ &psdp.MediaDescription{
MediaName: psdp.MediaName{ MediaName: psdp.MediaName{
Media: "application", Media: "application",
@@ -633,7 +633,7 @@ func TestNewFromMediaDescription(t *testing.T) {
}, },
}, },
{ {
"generic invalid rtpmap 2", "application invalid rtpmap 2",
&psdp.MediaDescription{ &psdp.MediaDescription{
MediaName: psdp.MediaName{ MediaName: psdp.MediaName{
Media: "application", Media: "application",
@@ -652,6 +652,27 @@ func TestNewFromMediaDescription(t *testing.T) {
RTPMap: "custom/aaa", RTPMap: "custom/aaa",
}, },
}, },
{
"application tp-link",
&psdp.MediaDescription{
MediaName: psdp.MediaName{
Media: "application",
Protos: []string{"RTP", "AVP"},
Formats: []string{"smart/1/90000"},
},
Attributes: []psdp.Attribute{
{
Key: "rtpmap",
Value: "95 TP-LINK/90000",
},
},
},
&Generic{
PayloadTyp: 95,
RTPMap: "TP-LINK/90000",
ClockRat: 90000,
},
},
} { } {
t.Run(ca.name, func(t *testing.T) { t.Run(ca.name, func(t *testing.T) {
format, err := Unmarshal(ca.md, ca.md.MediaName.Formats[0]) format, err := Unmarshal(ca.md, ca.md.MediaName.Formats[0])