Added FLAC packetizer
This commit is contained in:
parent
73e94c24c4
commit
f92b0ed4b3
|
@ -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
85
audio/packetizer/flac.go
Normal 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
|
||||
}
|
|
@ -4,6 +4,7 @@ type KeepMode int
|
|||
|
||||
const (
|
||||
KeepLast = KeepMode(iota)
|
||||
Keep
|
||||
GroupKeep
|
||||
GroupDiscard
|
||||
Discard
|
||||
|
|
7
go.mod
7
go.mod
|
@ -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
16
go.sum
|
@ -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=
|
||||
|
|
Loading…
Reference in a new issue