From 757091e43dd9bc038da45d42ce1733d31954ff64 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Sun, 16 Apr 2023 14:47:07 +0300 Subject: [PATCH] Rewrite RTSP keepalive --- pkg/rtsp/conn.go | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/pkg/rtsp/conn.go b/pkg/rtsp/conn.go index ebc127bc..142bc77d 100644 --- a/pkg/rtsp/conn.go +++ b/pkg/rtsp/conn.go @@ -89,11 +89,13 @@ const ( func (c *Conn) Handle() (err error) { var timeout time.Duration + var keepalive time.Time + switch c.mode { case core.ModeActiveProducer: - // polling frames from remote RTSP Server (ex Camera) - go c.keepalive() + keepalive = time.Now().Add(time.Second * 25) + // polling frames from remote RTSP Server (ex Camera) if len(c.receivers) > 0 { // if we receiving video/audio from camera timeout = time.Second * 5 @@ -115,7 +117,9 @@ func (c *Conn) Handle() (err error) { } for c.state != StateNone { - if err = c.conn.SetReadDeadline(time.Now().Add(timeout)); err != nil { + ts := time.Now() + + if err = c.conn.SetReadDeadline(ts.Add(timeout)); err != nil { return } @@ -232,6 +236,15 @@ func (c *Conn) Handle() (err error) { c.Fire(msg) } + + if !keepalive.IsZero() && ts.After(keepalive) { + req := &tcp.Request{Method: MethodOptions, URL: c.URL} + if err = c.WriteRequest(req); err != nil { + return + } + + keepalive = ts.Add(time.Second * 25) + } } return @@ -322,17 +335,3 @@ func (c *Conn) ReadResponse() (*tcp.Response, error) { } return tcp.ReadResponse(c.reader) } - -func (c *Conn) keepalive() { - // TODO: rewrite to RTCP - req := &tcp.Request{Method: MethodOptions, URL: c.URL} - for { - time.Sleep(time.Second * 25) - if c.state == StateNone { - return - } - if err := c.WriteRequest(req); err != nil { - return - } - } -}