Added FLAC packetizer

This commit is contained in:
DataHoarder 2022-03-01 18:30:45 +01:00
parent 73e94c24c4
commit f92b0ed4b3
5 changed files with 109 additions and 2 deletions

View file

@ -23,7 +23,7 @@ Collection of audio utilities for decoding/encoding files and streams.
## Container packetizers supported
| Container | Packetizer | Keep Mode | Sample Number |
|:---------:|:----------:|:---------:|:-------------:|
| **FLAC** | ❌ | - | - |
| **FLAC** | ✅ | ✅ | ✅ |
| **TTA** | ❌ | - | - |
| **MP3** | ✅ | ✅ | ✅ |
| **Ogg** | ✅ | ✅ | ✅* |

85
audio/packetizer/flac.go Normal file
View file

@ -0,0 +1,85 @@
package packetizer
import (
flac_parser "github.com/mewkiz/flac"
"io"
)
type FLACPacketizer struct {
reader io.Reader
stream *flac_parser.Stream
offset int64
samples int64
buffer []byte
}
type FLACPacket struct {
mode KeepMode
sampleNumber int64
data []byte
}
func (p *FLACPacket) KeepMode() KeepMode {
return p.mode
}
func (p *FLACPacket) GetSampleNumber() int64 {
return p.sampleNumber
}
func (p *FLACPacket) GetData() []byte {
return p.data
}
func NewFLACPacketizer(reader io.Reader) *FLACPacketizer {
return &FLACPacketizer{reader: reader}
}
func (o *FLACPacketizer) Read(p []byte) (n int, err error) {
n, err = o.reader.Read(p)
if err == nil {
o.buffer = append(o.buffer, p...)
}
return
}
func (o *FLACPacketizer) getBuffer() (buf []byte) {
buf = make([]byte, len(o.buffer))
copy(buf, o.buffer)
o.buffer = o.buffer[:]
return
}
func (o *FLACPacketizer) GetPacket() (packet Packet) {
var err error
if o.stream == nil {
o.stream, err = flac_parser.New(o)
if err != nil {
return nil
}
packet = &FLACPacket{
mode: Keep,
sampleNumber: 0,
data: o.getBuffer(),
}
return
}
frame, err := o.stream.ParseNext()
if err != nil {
return nil
}
sampleNumber := int64(frame.Num)
if frame.HasFixedBlockSize {
sampleNumber *= int64(frame.BlockSize)
}
packet = &FLACPacket{
mode: Discard,
sampleNumber: sampleNumber,
data: o.getBuffer(),
}
return
}

View file

@ -4,6 +4,7 @@ type KeepMode int
const (
KeepLast = KeepMode(iota)
Keep
GroupKeep
GroupDiscard
Discard

7
go.mod
View file

@ -10,8 +10,13 @@ require (
github.com/dh1tw/gosamplerate v0.1.2
github.com/edgeware/mp4ff v0.26.1
github.com/kvark128/minimp3 v0.0.0-20211109174940-101188771a65
github.com/mewkiz/flac v1.0.7
github.com/sssgun/mp3 v0.0.0-20170810093403-85f2ec632081
github.com/viert/go-lame v0.0.0-20201108052322-bb552596b11d
)
require github.com/klauspost/cpuid v1.3.1 // indirect
require (
github.com/icza/bitio v1.0.0 // indirect
github.com/klauspost/cpuid v1.3.1 // indirect
github.com/mewkiz/pkg v0.0.0-20190919212034-518ade7978e2 // indirect
)

16
go.sum
View file

@ -7,17 +7,33 @@ git.gammaspectra.live/S.O.N.G/go-tta v0.2.1-0.20220226150007-096de1072bd6/go.mod
git.gammaspectra.live/S.O.N.G/goflac v0.0.0-20220223152921-827e6c3f729f h1:4Dkx1l5Ex7pG/Xbs57L4IQd7mBgd6TO5rhP0BKP9PiI=
git.gammaspectra.live/S.O.N.G/goflac v0.0.0-20220223152921-827e6c3f729f/go.mod h1:/po1QgOh3xynbvi4sxdY6Iw8m5WPJfGGmry2boZD8fs=
github.com/cocoonlife/testify v0.0.0-20160218172820-792cc1faeb64 h1:LjPYdzoFSAJ5Tr/ElL8kzTJghXgpnOjJVbgd1UvZB1o=
github.com/d4l3k/messagediff v1.2.2-0.20190829033028-7e0a312ae40b/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo=
github.com/dh1tw/gosamplerate v0.1.2 h1:oyqtZk67xB9B4l+vIZCZ3F0RYV/z66W58VOah11/ktI=
github.com/dh1tw/gosamplerate v0.1.2/go.mod h1:zooTyHpoR7hE+FLfdE3yjLHb2QA2NpMusNfuaZqEACM=
github.com/edgeware/mp4ff v0.26.1 h1:tH+TIesZZmrA8BN5HuiKWp3sv5NF4N1A2cFxTSCNL8E=
github.com/edgeware/mp4ff v0.26.1/go.mod h1:6VHE5CTkpDseIg775+rh8BfnTvqjMnVbz5EDU4QwSdc=
github.com/go-audio/audio v1.0.0/go.mod h1:6uAu0+H2lHkwdGsAY+j2wHPNPpPoeg5AaEFh9FlA+Zs=
github.com/go-audio/riff v1.0.0/go.mod h1:l3cQwc85y79NQFCRB7TiPoNiaijp6q8Z0Uv38rVG498=
github.com/go-audio/wav v1.0.0/go.mod h1:3yoReyQOsiARkvPl3ERCi8JFjihzG6WhjYpZCf5zAWE=
github.com/go-test/deep v1.0.6 h1:UHSEyLZUwX9Qoi99vVwvewiMC8mM2bf7XEM2nqvzEn8=
github.com/go-test/deep v1.0.6/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
github.com/icza/bitio v1.0.0 h1:squ/m1SHyFeCA6+6Gyol1AxV9nmPPlJFT8c2vKdj3U8=
github.com/icza/bitio v1.0.0/go.mod h1:0jGnlLAx8MKMr9VGnn/4YrvZiprkvBelsVIbA9Jjr9A=
github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k=
github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA=
github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s=
github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4=
github.com/kvark128/minimp3 v0.0.0-20211109174940-101188771a65 h1:8qfVQv7MSACDXadEwl1yjUKJ68yC9B7nR4cioEoCfH0=
github.com/kvark128/minimp3 v0.0.0-20211109174940-101188771a65/go.mod h1:hIq9nAqNcwTySvnFhCe1C8xC/STIr2Fe5vJ52zk1jkE=
github.com/mewkiz/flac v1.0.7 h1:uIXEjnuXqdRaZttmSFM5v5Ukp4U6orrZsnYGGR3yow8=
github.com/mewkiz/flac v1.0.7/go.mod h1:yU74UH277dBUpqxPouHSQIar3G1X/QIclVbFahSd1pU=
github.com/mewkiz/pkg v0.0.0-20190919212034-518ade7978e2 h1:EyTNMdePWaoWsRSGQnXiSoQu0r6RS1eA557AwJhlzHU=
github.com/mewkiz/pkg v0.0.0-20190919212034-518ade7978e2/go.mod h1:3E2FUC/qYUfM8+r9zAwpeHJzqRVVMIYnpzD/clwWxyA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/sssgun/mp3 v0.0.0-20170810093403-85f2ec632081 h1:Qo/HswJzVywl0podyXMD62HIohsj/Ij2oXbD26aUIxM=
github.com/sssgun/mp3 v0.0.0-20170810093403-85f2ec632081/go.mod h1:ExwZtltybPz8zLO8c2lKRfpPk1HAxhrkp038QIBs+yg=
github.com/viert/go-lame v0.0.0-20201108052322-bb552596b11d h1:LptdD7GTUZeklomtW5vZ1AHwBvDBUCZ2Ftpaz7uEI7g=
github.com/viert/go-lame v0.0.0-20201108052322-bb552596b11d/go.mod h1:EqTcYM7y4JlSfeTI47pmNu3EZQuCuLQefsQyg1Imlz8=
golang.org/x/image v0.0.0-20190220214146-31aff87c08e9/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=