mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
add intermediate layer between net.Conn and client / server
This commit is contained in:
@@ -7,65 +7,10 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
interleavedFrameMagicByte = 0x24
|
||||
// InterleavedFrameMagicByte is the first byte of an interleaved frame.
|
||||
InterleavedFrameMagicByte = 0x24
|
||||
)
|
||||
|
||||
// ReadInterleavedFrameOrRequest reads an InterleavedFrame or a Response.
|
||||
func ReadInterleavedFrameOrRequest(
|
||||
frame *InterleavedFrame,
|
||||
maxPayloadSize int,
|
||||
req *Request,
|
||||
br *bufio.Reader,
|
||||
) (interface{}, error) {
|
||||
b, err := br.ReadByte()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
br.UnreadByte()
|
||||
|
||||
if b == interleavedFrameMagicByte {
|
||||
err := frame.Read(maxPayloadSize, br)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return frame, err
|
||||
}
|
||||
|
||||
err = req.Read(br)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return req, nil
|
||||
}
|
||||
|
||||
// ReadInterleavedFrameOrResponse reads an InterleavedFrame or a Response.
|
||||
func ReadInterleavedFrameOrResponse(
|
||||
frame *InterleavedFrame,
|
||||
maxPayloadSize int,
|
||||
res *Response,
|
||||
br *bufio.Reader,
|
||||
) (interface{}, error) {
|
||||
b, err := br.ReadByte()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
br.UnreadByte()
|
||||
|
||||
if b == interleavedFrameMagicByte {
|
||||
err := frame.Read(maxPayloadSize, br)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return frame, err
|
||||
}
|
||||
|
||||
err = res.Read(br)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
// InterleavedFrame is an interleaved frame, and allows to transfer binary data
|
||||
// within RTSP/TCP connections. It is used to send and receive RTP and RTCP packets with TCP.
|
||||
type InterleavedFrame struct {
|
||||
@@ -77,22 +22,19 @@ type InterleavedFrame struct {
|
||||
}
|
||||
|
||||
// Read decodes an interleaved frame.
|
||||
func (f *InterleavedFrame) Read(maxPayloadSize int, br *bufio.Reader) error {
|
||||
func (f *InterleavedFrame) Read(br *bufio.Reader) error {
|
||||
var header [4]byte
|
||||
_, err := io.ReadFull(br, header[:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if header[0] != interleavedFrameMagicByte {
|
||||
if header[0] != InterleavedFrameMagicByte {
|
||||
return fmt.Errorf("invalid magic byte (0x%.2x)", header[0])
|
||||
}
|
||||
|
||||
// it's useless to check payloadLen since it's limited to 65535
|
||||
payloadLen := int(uint16(header[2])<<8 | uint16(header[3]))
|
||||
if payloadLen > maxPayloadSize {
|
||||
return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)",
|
||||
payloadLen, maxPayloadSize)
|
||||
}
|
||||
|
||||
f.Channel = int(header[1])
|
||||
f.Payload = make([]byte, payloadLen)
|
||||
|
Reference in New Issue
Block a user