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/httpflv/tag.go

91 lines
1.8 KiB
Go

package httpflv
import (
"github.com/q191201771/lal/bele"
"io"
)
// TODO chef: make these const
const tagHeaderSize int = 11
var (
tagTypeMetadata uint8 = 18
tagTypeVideo uint8 = 9
tagTypeAudio uint8 = 8
)
var (
frameTypeKey uint8 = 1
frameTypeInter uint8 = 2
)
var (
codecIdAvc uint8 = 7
)
var (
AvcKey = frameTypeKey<<4 | codecIdAvc
AvcInter = frameTypeInter<<4 | codecIdAvc
)
var (
AvcPacketTypeSeqHeader uint8 = 0
AvcPacketTypeNalu uint8 = 1
)
var (
SoundFormatAac uint8 = 10
)
var (
AacPacketTypeSeqHeader uint8 = 0
AacPacketTypeRaw uint8 = 1
)
type TagHeader struct {
T uint8 // type
DataSize uint32
Timestamp uint32
StreamId uint32 // always 0
}
type Tag struct {
Header TagHeader
Raw []byte
}
func readTagHeader(rd io.Reader) (h TagHeader, rawHeader []byte, err error) {
rawHeader = make([]byte, tagHeaderSize)
if _, err = io.ReadAtLeast(rd, rawHeader, tagHeaderSize); err != nil {
return
}
h.T = rawHeader[0]
h.DataSize = bele.BeUInt24(rawHeader[1:])
h.Timestamp = (uint32(rawHeader[7]) << 24) + bele.BeUInt24(rawHeader[4:])
return
}
func (tag *Tag) isMetaData() bool {
return tag.Header.T == tagTypeMetadata
}
func (tag *Tag) isAvcKeySeqHeader() bool {
return tag.Header.T == tagTypeVideo && tag.Raw[tagHeaderSize] == AvcKey && tag.Raw[tagHeaderSize+1] == AvcPacketTypeSeqHeader
}
func (tag *Tag) isAvcKeyNalu() bool {
return tag.Header.T == tagTypeVideo && tag.Raw[tagHeaderSize] == AvcKey && tag.Raw[tagHeaderSize+1] == AvcPacketTypeNalu
}
func (tag *Tag) isAacSeqHeader() bool {
return tag.Header.T == tagTypeAudio && tag.Raw[tagHeaderSize]>>4 == SoundFormatAac && tag.Raw[tagHeaderSize+1] == AacPacketTypeSeqHeader
}
func (tag *Tag) cloneTag() *Tag {
res := &Tag{}
res.Header = tag.Header
res.Raw = append(res.Raw, tag.Raw...)
return res
}