80 lines
1.5 KiB
Go
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
|
|
}
|