golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
1.6 KiB
90 lines
1.6 KiB
package rtsp |
|
|
|
import ( |
|
"encoding/binary" |
|
"fmt" |
|
"io" |
|
"net" |
|
) |
|
|
|
type Conn struct { |
|
c net.Conn |
|
writeBuf []byte |
|
} |
|
|
|
func NewConn(c net.Conn) *Conn { |
|
return &Conn{ |
|
c: c, |
|
writeBuf: make([]byte, 2048), |
|
} |
|
} |
|
|
|
func (c *Conn) Close() error { |
|
return c.c.Close() |
|
} |
|
|
|
func (c *Conn) RemoteAddr() net.Addr { |
|
return c.c.RemoteAddr() |
|
} |
|
|
|
func (c *Conn) ReadRequest() (*Request, error) { |
|
return requestDecode(c.c) |
|
} |
|
|
|
func (c *Conn) WriteRequest(req *Request) error { |
|
return requestEncode(c.c, req) |
|
} |
|
|
|
func (c *Conn) ReadResponse() (*Response, error) { |
|
return responseDecode(c.c) |
|
} |
|
|
|
func (c *Conn) WriteResponse(res *Response) error { |
|
return responseEncode(c.c, res) |
|
} |
|
|
|
func (c *Conn) ReadInterleavedFrame(frame []byte) (int, int, error) { |
|
var header [4]byte |
|
_, err := io.ReadFull(c.c, header[:]) |
|
if err != nil { |
|
return 0, 0, err |
|
} |
|
|
|
// connection terminated |
|
if header[0] == 0x54 { |
|
return 0, 0, io.EOF |
|
} |
|
|
|
if header[0] != 0x24 { |
|
return 0, 0, fmt.Errorf("wrong magic byte (0x%.2x)", header[0]) |
|
} |
|
|
|
framelen := binary.BigEndian.Uint16(header[2:]) |
|
if framelen > 2048 { |
|
return 0, 0, fmt.Errorf("frame length greater than 2048") |
|
} |
|
|
|
_, err = io.ReadFull(c.c, frame[:framelen]) |
|
if err != nil { |
|
return 0, 0, err |
|
} |
|
|
|
return int(header[1]), int(framelen), nil |
|
} |
|
|
|
func (c *Conn) WriteInterleavedFrame(channel int, frame []byte) error { |
|
c.writeBuf[0] = 0x24 |
|
c.writeBuf[1] = byte(channel) |
|
binary.BigEndian.PutUint16(c.writeBuf[2:], uint16(len(frame))) |
|
n := copy(c.writeBuf[4:], frame) |
|
|
|
_, err := c.c.Write(c.writeBuf[:4+n]) |
|
if err != nil { |
|
return err |
|
} |
|
return nil |
|
} |
|
|
|
func (c *Conn) Read(buf []byte) (int, error) { |
|
return c.c.Read(buf) |
|
}
|
|
|