Kirika/audio/packetizer/adts.go
DataHoarder 15e4c8e6f8
All checks were successful
continuous-integration/drone/push Build is passing
Updated fdk-aac, fix tests on systems without AAC SBR/PS encoder
2022-09-10 17:44:22 +02:00

79 lines
1.5 KiB
Go

package packetizer
import (
"bufio"
aac_adts "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 *aac_adts.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(offset 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 := aac_adts.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
}