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