Kirika/audio/packetizer/adts.go
DataHoarder bd069cdf05
Some checks failed
continuous-integration/drone/push Build is failing
General code inspection cleanup
2022-10-03 11:34:56 +02:00

79 lines
1.5 KiB
Go

package packetizer
import (
"bufio"
aacAdts "github.com/edgeware/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 []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
}