From dab15e898dc073afd3a96653189e5db008e44ca4 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sun, 29 Dec 2019 12:32:54 +0100 Subject: [PATCH] support RTCP streaming via TCP --- main.go | 2 +- rtsp/conn.go | 14 +++++++------- rtsp_client.go | 16 +++++++++++++--- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/main.go b/main.go index 465d661a..9607e149 100644 --- a/main.go +++ b/main.go @@ -117,7 +117,7 @@ func main() { p, err := newProgram(*rtspPort, *rtpPort, *rtcpPort) if err != nil { - log.Fatal("ERR:", err) + log.Fatal("ERR: ", err) } p.run() diff --git a/rtsp/conn.go b/rtsp/conn.go index a268cfa1..375ea0e0 100644 --- a/rtsp/conn.go +++ b/rtsp/conn.go @@ -43,33 +43,33 @@ func (c *Conn) WriteResponse(res *Response) error { return responseEncode(c.c, res) } -func (c *Conn) ReadInterleavedFrame(frame []byte) (int, error) { +func (c *Conn) ReadInterleavedFrame(frame []byte) (int, int, error) { var header [4]byte _, err := io.ReadFull(c.c, header[:]) if err != nil { - return 0, err + return 0, 0, err } // connection terminated if header[0] == 0x54 { - return 0, io.EOF + return 0, 0, io.EOF } if header[0] != 0x24 { - return 0, fmt.Errorf("wrong magic byte (0x%.2x)", header[0]) + return 0, 0, fmt.Errorf("wrong magic byte (0x%.2x)", header[0]) } framelen := binary.BigEndian.Uint16(header[2:]) if framelen > 2048 { - return 0, fmt.Errorf("frame length greater than 2048") + return 0, 0, fmt.Errorf("frame length greater than 2048") } _, err = io.ReadFull(c.c, frame[:framelen]) if err != nil { - return 0, err + return 0, 0, err } - return int(framelen), nil + return int(header[1]), int(framelen), nil } func (c *Conn) WriteInterleavedFrame(frame []byte) error { diff --git a/rtsp_client.go b/rtsp_client.go index 3b54c32d..0730a214 100644 --- a/rtsp_client.go +++ b/rtsp_client.go @@ -132,7 +132,7 @@ func (c *rtspClient) run() { if c.rtpProto == "tcp" { buf := make([]byte, 2048) for { - _, err := c.rconn.ReadInterleavedFrame(buf) + _, _, err := c.rconn.ReadInterleavedFrame(buf) if err != nil { if err != io.EOF { c.log("ERR: %s", err) @@ -161,7 +161,7 @@ func (c *rtspClient) run() { if c.rtpProto == "tcp" { buf := make([]byte, 2048) for { - n, err := c.rconn.ReadInterleavedFrame(buf) + channel, n, err := c.rconn.ReadInterleavedFrame(buf) if err != nil { if err != io.EOF { c.log("ERR: %s", err) @@ -169,7 +169,17 @@ func (c *rtspClient) run() { return } - c.p.handleRtp(buf[:n]) + switch channel { + case 0: + c.p.handleRtp(buf[:n]) + + case 1: + c.p.handleRtcp(buf[:n]) + + default: + c.log("ERR: unsupported channel '%d'", channel) + return + } } }