From 71f1e445e1ec3c55371009297d0403318726ee46 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Wed, 23 Aug 2023 06:52:33 +0300 Subject: [PATCH] Fix 400 response on PLAY for Reolink Doorbell #562 --- pkg/rtsp/conn.go | 3 +++ pkg/rtsp/consumer.go | 8 ++++++-- pkg/rtsp/server.go | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pkg/rtsp/conn.go b/pkg/rtsp/conn.go index c68a2675..2edf9215 100644 --- a/pkg/rtsp/conn.go +++ b/pkg/rtsp/conn.go @@ -38,6 +38,7 @@ type Conn struct { conn net.Conn keepalive int mode core.Mode + playOK bool reader *bufio.Reader sequence int session string @@ -156,6 +157,8 @@ func (c *Conn) Handle() (err error) { return } c.Fire(res) + // for playing backchannel only after OK response on play + c.playOK = true continue case "OPTI", "TEAR", "DESC", "SETU", "PLAY", "PAUS", "RECO", "ANNO", "GET_", "SET_": diff --git a/pkg/rtsp/consumer.go b/pkg/rtsp/consumer.go index d1874025..4bddd77b 100644 --- a/pkg/rtsp/consumer.go +++ b/pkg/rtsp/consumer.go @@ -86,7 +86,7 @@ func (c *Conn) packetWriter(codec *core.Codec, channel, payloadType uint8) core. } handlerFunc := func(packet *rtp.Packet) { - if c.state == StateNone { + if c.state == StateNone || !c.playOK { return } @@ -102,6 +102,10 @@ func (c *Conn) packetWriter(codec *core.Codec, channel, payloadType uint8) core. Payload: packet.Payload, } + if !video { + packet.Marker = true // better to have marker on all audio packets + } + size := 12 + len(packet.Payload) if n+4+size > len(buf) { @@ -130,7 +134,7 @@ func (c *Conn) packetWriter(codec *core.Codec, channel, payloadType uint8) core. n += 4 + size - if video && !packet.Marker { + if !packet.Marker { return // collect continious video packets to buffer } diff --git a/pkg/rtsp/server.go b/pkg/rtsp/server.go index 5c69fb68..15b3f84b 100644 --- a/pkg/rtsp/server.go +++ b/pkg/rtsp/server.go @@ -157,7 +157,9 @@ func (c *Conn) Accept() error { case MethodRecord, MethodPlay: res := &tcp.Response{Request: req} - return c.WriteResponse(res) + err = c.WriteResponse(res) + c.playOK = true + return err case MethodTeardown: res := &tcp.Response{Request: req}