package rtsp import ( "github.com/AlexxIT/go2rtc/pkg/h264" "github.com/AlexxIT/go2rtc/pkg/streamer" "github.com/stretchr/testify/assert" "strings" "testing" ) func TestURLParse(t *testing.T) { // https://github.com/AlexxIT/WebRTC/issues/395 base := "rtsp://::ffff:192.168.1.123/onvif/profile.1/" u, err := urlParse(base) assert.Empty(t, err) assert.Equal(t, "::ffff:192.168.1.123:", u.Host) // https://github.com/AlexxIT/go2rtc/issues/208 base = "rtsp://rtsp://turret2-cam.lan:554/stream1/" u, err = urlParse(base) assert.Empty(t, err) assert.Equal(t, "turret2-cam.lan:554", u.Host) } func TestBugSDP1(t *testing.T) { // https://github.com/AlexxIT/WebRTC/issues/417 s := `v=0 o=- 91674849066 1 IN IP4 192.168.1.123 s=RtspServer i=live t=0 0 a=control:* a=range:npt=0- m=video 0 RTP/AVP 96 c=IN IP4 0.0.0.0 s=RtspServer i=live a=control:track0 a=range:npt=0- a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=42001E;sprop-parameter-sets=Z0IAHvQCgC3I,aM48gA== a=control:track0 m=audio 0 RTP/AVP 97 c=IN IP4 0.0.0.0 s=RtspServer i=live a=control:track1 a=range:npt=0- a=rtpmap:97 MPEG4-GENERIC/8000/1 a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1588 a=control:track1 ` medias, err := UnmarshalSDP([]byte(s)) assert.Nil(t, err) assert.NotNil(t, medias) } func TestBugSDP2(t *testing.T) { // https://github.com/AlexxIT/WebRTC/issues/419 s := `v=0 o=- 1675628282 1675628283 IN IP4 192.168.1.123 s=streamed by the RTSP server t=0 0 m=video 0 RTP/AVP 96 a=rtpmap:96 H264/90000 a=control:track0 m=audio 0 RTP/AVP 8 a=rtpmap:0 pcma/8000/1 a=control:track1 a=framerate:25 a=range:npt=now- a=fmtp:96 packetization-mode=1;profile-level-id=64001F;sprop-parameter-sets=Z0IAH5WoFAFuQA==,aM48gA== ` medias, err := UnmarshalSDP([]byte(s)) assert.Nil(t, err) assert.NotNil(t, medias) assert.NotEqual(t, "", medias[0].Codecs[0].FmtpLine) } func TestBugSDP3(t *testing.T) { s := `v=0 o=- 1675775048103026 1 IN IP4 192.168.1.123 s=Session streamed by "preview" t=0 0 a=tool:LIVE555 Streaming Media v2020.08.12 a=type:broadcast a=control:* a=range:npt=0- 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=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 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=recvonly a=control:track3 ` 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, streamer.CodecH264, codec.Name) sps, _ := h264.GetParameterSet(codec.FmtpLine) assert.Nil(t, sps) profile := h264.GetProfileLevelID(codec.FmtpLine) assert.Equal(t, "420029", profile) }