You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/rtmp/stream.go

108 lines
2.0 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package rtmp
import "github.com/q191201771/nezha/pkg/log"
const initMsgLen = 4096
type Header struct {
CSID int
MsgLen uint32
// NOTICE 是header中的时间戳可能是绝对的也可能是相对的。
// 如果需要绝对时间戳应该使用Stream中的timestampAbs
Timestamp uint32
MsgTypeID uint8 // 8 audio 9 video 18 metadata
MsgStreamID int
}
type StreamMsg struct {
buf []byte
b uint32
e uint32
}
type Stream struct {
header Header
timestampAbs uint32
msg StreamMsg
}
func NewStream() *Stream {
return &Stream{
msg: StreamMsg{
buf: make([]byte, initMsgLen),
},
}
}
func (msg *StreamMsg) reserve(n uint32) {
bufCap := uint32(cap(msg.buf))
nn := bufCap - msg.e
if nn > n {
return
}
for nn < n {
nn <<= 1
}
nb := make([]byte, bufCap+nn)
copy(nb, msg.buf[msg.b:msg.e])
msg.buf = nb
log.Debugf("reserve. need:%d left:%d %d %d", n, nn, len(msg.buf), cap(msg.buf))
}
func (msg *StreamMsg) len() uint32 {
return msg.e - msg.b
}
func (msg *StreamMsg) produced(n uint32) {
msg.e += n
}
func (msg *StreamMsg) consumed(n uint32) {
msg.b += n
}
func (msg *StreamMsg) clear() {
msg.b = 0
msg.e = 0
}
func (msg *StreamMsg) peekStringWithType() (string, error) {
str, _, err := AMF0.ReadString(msg.buf[msg.b:msg.e])
return str, err
}
func (msg *StreamMsg) readStringWithType() (string, error) {
str, l, err := AMF0.ReadString(msg.buf[msg.b:msg.e])
if err == nil {
msg.consumed(uint32(l))
}
return str, err
}
func (msg *StreamMsg) readNumberWithType() (int, error) {
val, l, err := AMF0.ReadNumber(msg.buf[msg.b:msg.e])
if err == nil {
msg.consumed(uint32(l))
}
return int(val), err
}
func (msg *StreamMsg) readObjectWithType() (map[string]interface{}, error) {
obj, l, err := AMF0.ReadObject(msg.buf[msg.b:msg.e])
if err == nil {
msg.consumed(uint32(l))
}
return obj, err
}
func (msg *StreamMsg) readNull() error {
l, err := AMF0.ReadNull(msg.buf[msg.b:msg.e])
if err == nil {
msg.consumed(uint32(l))
}
return err
}