|
|
|
// Copyright 2020, Chef. All rights reserved.
|
|
|
|
// https://github.com/q191201771/lal
|
|
|
|
//
|
|
|
|
// Use of this source code is governed by a MIT-style license
|
|
|
|
// that can be found in the License file.
|
|
|
|
//
|
|
|
|
// Author: Chef (191201771@qq.com)
|
|
|
|
|
|
|
|
package rtsp
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"io"
|
|
|
|
|
|
|
|
"github.com/q191201771/naza/pkg/bele"
|
|
|
|
)
|
|
|
|
|
|
|
|
// rfc2326 10.12 Embedded (Interleaved) Binary Data
|
|
|
|
|
|
|
|
func readInterleaved(r *bufio.Reader) (isInterleaved bool, packet []byte, channel uint8, err error) {
|
|
|
|
flag, err := r.ReadByte()
|
|
|
|
if err != nil {
|
|
|
|
return false, nil, 0, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if flag != Interleaved {
|
|
|
|
_ = r.UnreadByte()
|
|
|
|
return false, nil, 0, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
channel, err = r.ReadByte()
|
|
|
|
if err != nil {
|
|
|
|
return false, nil, 0, err
|
|
|
|
}
|
|
|
|
rtpLenBuf := make([]byte, 2)
|
|
|
|
_, err = io.ReadFull(r, rtpLenBuf)
|
|
|
|
if err != nil {
|
|
|
|
return false, nil, 0, err
|
|
|
|
}
|
|
|
|
rtpLen := int(bele.BeUint16(rtpLenBuf))
|
|
|
|
// TODO chef: 这里为了安全性,应该检查大小
|
|
|
|
rtpBuf := make([]byte, rtpLen)
|
|
|
|
_, err = io.ReadFull(r, rtpBuf)
|
|
|
|
if err != nil {
|
|
|
|
return false, nil, 0, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, rtpBuf, channel, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func packInterleaved(channel int, rtpPacket []byte) []byte {
|
|
|
|
ret := make([]byte, 4+len(rtpPacket))
|
|
|
|
ret[0] = Interleaved
|
|
|
|
ret[1] = uint8(channel)
|
|
|
|
bele.BePutUint16(ret[2:], uint16(len(rtpPacket)))
|
|
|
|
copy(ret[4:], rtpPacket)
|
|
|
|
return ret
|
|
|
|
}
|