From abbf180b1bc05110f9c678c33e8608789c6f41d0 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Thu, 6 Apr 2023 17:31:32 +0300 Subject: [PATCH] Fix Reolink Doorbell bug with SDP --- pkg/rtsp/helpers.go | 15 ++++++------ pkg/rtsp/rtsp_test.go | 54 +++++++++---------------------------------- 2 files changed, 18 insertions(+), 51 deletions(-) diff --git a/pkg/rtsp/helpers.go b/pkg/rtsp/helpers.go index 09b0057a..726e4c80 100644 --- a/pkg/rtsp/helpers.go +++ b/pkg/rtsp/helpers.go @@ -5,6 +5,7 @@ import ( "github.com/AlexxIT/go2rtc/pkg/core" "github.com/pion/rtcp" "github.com/pion/sdp/v3" + "io" "net/url" "regexp" "strconv" @@ -23,12 +24,6 @@ s=- t=0 0` func UnmarshalSDP(rawSDP []byte) ([]*core.Media, error) { - // fix bug from Reolink Doorbell - if i := bytes.Index(rawSDP, []byte("a=sendonlym=")); i > 0 { - rawSDP = append(rawSDP[:i+11], rawSDP[i+10:]...) - rawSDP[i+10] = '\n' - } - sd := &sdp.SessionDescription{} if err := sd.Unmarshal(rawSDP); err != nil { // fix multiple `s=` https://github.com/AlexxIT/WebRTC/issues/417 @@ -38,10 +33,14 @@ func UnmarshalSDP(rawSDP []byte) ([]*core.Media, error) { // fix SDP header for some cameras if i := bytes.Index(rawSDP, []byte("\nm=")); i > 0 { rawSDP = append([]byte(sdpHeader), rawSDP[i:]...) - sd = &sdp.SessionDescription{} - err = sd.Unmarshal(rawSDP) } + if err == io.EOF { + rawSDP = append(rawSDP, '\n') + } + + sd = &sdp.SessionDescription{} + err = sd.Unmarshal(rawSDP) if err != nil { return nil, err } diff --git a/pkg/rtsp/rtsp_test.go b/pkg/rtsp/rtsp_test.go index 5306220f..4e79e9f5 100644 --- a/pkg/rtsp/rtsp_test.go +++ b/pkg/rtsp/rtsp_test.go @@ -1,10 +1,7 @@ package rtsp import ( - "github.com/AlexxIT/go2rtc/pkg/core" - "github.com/AlexxIT/go2rtc/pkg/h264" "github.com/stretchr/testify/assert" - "strings" "testing" ) @@ -79,63 +76,34 @@ a=fmtp:96 packetization-mode=1;profile-level-id=64001F;sprop-parameter-sets=Z0IA func TestBugSDP3(t *testing.T) { s := `v=0 -o=- 1675775048103026 1 IN IP4 192.168.1.123 +o=- 1680614126554766 1 IN IP4 192.168.0.3 s=Session streamed by "preview" t=0 0 -a=tool:LIVE555 Streaming Media v2020.08.12 +a=tool:BC Streaming Media v202210012022.10.01 a=type:broadcast a=control:* -a=range:npt=0- +a=range:npt=now- a=x-qt-text-nam:Session streamed by "preview" m=video 0 RTP/AVP 96 c=IN IP4 0.0.0.0 b=AS:8192 a=rtpmap:96 H264/90000 +a=range:npt=now- a=fmtp:96 packetization-mode=1;profile-level-id=640033;sprop-parameter-sets=Z2QAM6wVFKAoAPGQ,aO48sA== a=recvonly a=control:track1 -m=audio 0 RTP/AVP 8 -a=control:track2 -a=rtpmap:8 PCMA/8000 -a=sendonlym=audio 0 RTP/AVP 98 +m=audio 0 RTP/AVP 97 c=IN IP4 0.0.0.0 b=AS:8192 -a=rtpmap:98 MPEG4-GENERIC/16000 -a=fmtp:98 streamtype=5;profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1408; +a=rtpmap:97 MPEG4-GENERIC/16000 +a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1408; a=recvonly +a=control:track2 +m=audio 0 RTP/AVP 8 a=control:track3 -` +a=rtpmap:8 PCMA/8000 +a=sendonly` medias, err := UnmarshalSDP([]byte(s)) assert.Nil(t, err) assert.Len(t, medias, 3) } - -func TestBugSDP4(t *testing.T) { - s := `v=0 -o=- 1676583297494652 1676583297494652 IN IP4 192.168.1.58 -s=Media Presentation -e=NONE -b=AS:5050 -t=0 0 -a=control:rtsp://192.168.1.58:554/h264_stream/ -m=video 0 RTP/AVP 96 -b=AS:5000 -a=control:rtsp://192.168.1.58:554/h264_stream/trackID=1 -a=rtpmap:96 H265/90000 -a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets= -a=Media_header:MEDIAINFO=494D4B48010100000400050000000000000000000000000000000000000000000000000000000000; -a=appversion:1.0 -` - s = strings.ReplaceAll(s, "\n", "\r\n") - medias, err := UnmarshalSDP([]byte(s)) - assert.Nil(t, err) - - codec := medias[0].Codecs[0] - assert.Equal(t, core.CodecH264, codec.Name) - - sps, _ := h264.GetParameterSet(codec.FmtpLine) - assert.Nil(t, sps) - - profile := h264.GetProfileLevelID(codec.FmtpLine) - assert.Equal(t, "420029", profile) -}