Kirika/audio/packetizer/adts.go
DataHoarder 84faf19303
Some checks reported errors
continuous-integration/drone Build was killed
Upgrade edgeware/mp4ff to Eyevinn/mp4ff, update dependencies
2023-01-28 03:44:45 +01:00

80 lines
1.5 KiB
Go

package packetizer
import (
"bufio"
aacAdts "github.com/Eyevinn/mp4ff/aac"
"io"
)
// adtsAACFrameSamples TODO: LC has 1024, others 2048?
const adtsAACFrameSamples = 1024
type AdtsPacketizer struct {
reader io.Reader
samples int64
}
type AdtsPacket struct {
SampleNumber int64
Header *aacAdts.ADTSHeader
// Data raw AAC frame
Data []byte
}
func (p *AdtsPacket) KeepMode() KeepMode {
return Discard
}
func (p *AdtsPacket) GetStartSampleNumber() int64 {
return p.SampleNumber
}
func (p *AdtsPacket) GetEndSampleNumber() int64 {
return p.SampleNumber + adtsAACFrameSamples
}
func (p *AdtsPacket) Category() int64 {
return 0
}
func (p *AdtsPacket) GetData() (result []byte) {
result = append(result, p.Header.Encode()...)
result = append(result, p.Data...)
return
}
func (p *AdtsPacket) GetDataOffset(_ int64) []byte {
return p.GetData()
}
func NewAdtsPacketizer(reader io.Reader) *AdtsPacketizer {
return &AdtsPacketizer{reader: bufio.NewReader(reader)}
}
func (o *AdtsPacketizer) GetPacket() Packet {
packet := &AdtsPacket{}
header, offset, err := aacAdts.DecodeADTSHeader(o.reader)
if err != nil || offset != 0 {
return nil
}
packet.Header = header
packet.Data = make([]byte, packet.Header.PayloadLength)
var n int
if n, err = io.ReadFull(o.reader, packet.Data); err != nil {
return nil
}
if n != len(packet.Data) {
return nil
}
packet.SampleNumber = o.samples
o.samples += adtsAACFrameSamples //always this fixed size per frame
return packet
}