Fix FLAC/Ogg Packetizers, add packetizer tests
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
DataHoarder 2022-03-01 19:02:46 +01:00
parent f92b0ed4b3
commit 4973144585
3 changed files with 201 additions and 20 deletions

View file

@ -10,7 +10,9 @@ import (
"git.gammaspectra.live/S.O.N.G/Kirika/audio/format/mp3"
"git.gammaspectra.live/S.O.N.G/Kirika/audio/format/opus"
"git.gammaspectra.live/S.O.N.G/Kirika/audio/format/tta"
"git.gammaspectra.live/S.O.N.G/Kirika/audio/packetizer"
"git.gammaspectra.live/S.O.N.G/Kirika/hasher"
"io"
"os"
"path"
"testing"
@ -296,6 +298,50 @@ func TestEncodeFLAC(t *testing.T) {
}
}
func TestPacketizeFLAC(t *testing.T) {
t.Parallel()
fp, err := os.Open(TestSingleSample24)
if err != nil {
t.Error(err)
return
}
defer fp.Close()
source, err := flac.NewFormat().Open(fp)
if err != nil {
t.Error(err)
return
}
reader, writer := io.Pipe()
go func() {
defer writer.Close()
err = flac.NewFormat().Encode(source, writer, nil)
if err != nil {
t.Error(err)
return
}
}()
pipePacketizer := packetizer.NewFLACPacketizer(reader)
packetCount := 0
packetBytes := 0
for {
packet := pipePacketizer.GetPacket()
if packet == nil {
break
}
packetCount++
packetBytes += len(packet.GetData())
}
if packetCount != 4231 {
t.Errorf("Wrong Packet Count %d != %d", packetCount, 4231)
}
if packetBytes != 60850176 {
t.Errorf("Wrong Packet Bytes %d != %d", packetBytes, 60850176)
}
}
func TestEncodeTTA(t *testing.T) {
t.Parallel()
fp, err := os.Open(TestSingleSample24)
@ -362,6 +408,50 @@ func TestEncodeMP3(t *testing.T) {
}
}
func TestPacketizeMP3(t *testing.T) {
t.Parallel()
fp, err := os.Open(TestSingleSample24)
if err != nil {
t.Error(err)
return
}
defer fp.Close()
source, err := flac.NewFormat().Open(fp)
if err != nil {
t.Error(err)
return
}
reader, writer := io.Pipe()
go func() {
defer writer.Close()
err = mp3.NewFormat().Encode(source, writer, nil)
if err != nil {
t.Error(err)
return
}
}()
pipePacketizer := packetizer.NewMp3Packetizer(reader)
packetCount := 0
packetBytes := 0
for {
packet := pipePacketizer.GetPacket()
if packet == nil {
break
}
packetCount++
packetBytes += len(packet.GetData())
}
if packetCount != 15040 {
t.Errorf("Wrong Packet Count %d != %d", packetCount, 15040)
}
if packetBytes != 13901254 {
t.Errorf("Wrong Packet Bytes %d != %d", packetBytes, 13901254)
}
}
func TestEncodeOpus(t *testing.T) {
t.Parallel()
fp, err := os.Open(TestSingleSample24)
@ -398,6 +488,50 @@ func TestEncodeOpus(t *testing.T) {
}
}
func TestPacketizeOgg(t *testing.T) {
t.Parallel()
fp, err := os.Open(TestSingleSample24)
if err != nil {
t.Error(err)
return
}
defer fp.Close()
source, err := flac.NewFormat().Open(fp)
if err != nil {
t.Error(err)
return
}
reader, writer := io.Pipe()
go func() {
defer writer.Close()
err = opus.NewFormat().Encode(audio.NewResampleFilter(opus.FixedSampleRate, audio.Linear, 0).Process(source), writer, nil)
if err != nil {
t.Error(err)
return
}
}()
pipePacketizer := packetizer.NewOggPacketizer(reader)
packetCount := 0
packetBytes := 0
for {
packet := pipePacketizer.GetPacket()
if packet == nil {
break
}
packetCount++
packetBytes += len(packet.GetData())
}
if packetCount != 395 {
t.Errorf("Wrong Packet Count %d != %d", packetCount, 395)
}
if packetBytes != 5962688 {
t.Errorf("Wrong Packet Bytes %d != %d", packetBytes, 5962688)
}
}
func TestEncodeAAC(t *testing.T) {
t.Parallel()
fp, err := os.Open(TestSingleSample24)
@ -434,6 +568,50 @@ func TestEncodeAAC(t *testing.T) {
}
}
func TestPacketizeADTS(t *testing.T) {
t.Parallel()
fp, err := os.Open(TestSingleSample24)
if err != nil {
t.Error(err)
return
}
defer fp.Close()
source, err := flac.NewFormat().Open(fp)
if err != nil {
t.Error(err)
return
}
reader, writer := io.Pipe()
go func() {
defer writer.Close()
err = aac.NewFormat().Encode(source, writer, nil)
if err != nil {
t.Error(err)
return
}
}()
pipePacketizer := packetizer.NewAdtsPacketizer(reader)
packetCount := 0
packetBytes := 0
for {
packet := pipePacketizer.GetPacket()
if packet == nil {
break
}
packetCount++
packetBytes += len(packet.GetData())
}
if packetCount != 16920 {
t.Errorf("Wrong Packet Count %d != %d", packetCount, 16920)
}
if packetBytes != 6436973 {
t.Errorf("Wrong Packet Bytes %d != %d", packetBytes, 6436973)
}
}
func TestEncodeAACHE(t *testing.T) {
t.Parallel()
fp, err := os.Open(TestSingleSample24)

View file

@ -46,7 +46,7 @@ func (o *FLACPacketizer) Read(p []byte) (n int, err error) {
func (o *FLACPacketizer) getBuffer() (buf []byte) {
buf = make([]byte, len(o.buffer))
copy(buf, o.buffer)
o.buffer = o.buffer[:]
o.buffer = o.buffer[:0]
return
}

View file

@ -11,15 +11,18 @@ type OggPacketizer struct {
}
type OggPacket struct {
Capture [4]byte
Revision byte
Flags byte
AbsoluteGranulePosition int64
StreamSerialNumber uint32
PageChecksum uint32
PageSegments byte
pageSegmentTable []byte
segments [][]byte
header struct {
Capture [4]byte
Revision byte
Flags byte
AbsoluteGranulePosition int64
StreamSerialNumber uint32
PageSequenceNumber uint32
PageChecksum uint32
PageSegments byte
}
pageSegmentTable []byte
segments [][]byte
}
func (p *OggPacket) KeepMode() KeepMode {
@ -28,16 +31,16 @@ func (p *OggPacket) KeepMode() KeepMode {
func (p *OggPacket) GetSampleNumber() int64 {
//TODO
return p.AbsoluteGranulePosition
return p.header.AbsoluteGranulePosition
}
func (p *OggPacket) GetData() []byte {
buf := bytes.NewBuffer(make([]byte, 0, 4+1+1+8+4+4+1+p.PageChecksum*(255+1)))
binary.Write(buf, binary.BigEndian, p)
binary.Write(buf, binary.BigEndian, p.pageSegmentTable)
buf := bytes.NewBuffer(make([]byte, 0, 4+1+1+8+4+4+4+1+int(p.header.PageSegments)*(255+1)))
binary.Write(buf, binary.LittleEndian, p.header)
binary.Write(buf, binary.LittleEndian, p.pageSegmentTable)
for _, segment := range p.segments {
if len(segment) > 0 {
binary.Write(buf, binary.BigEndian, segment)
binary.Write(buf, binary.LittleEndian, segment)
}
}
@ -50,20 +53,20 @@ func NewOggPacketizer(reader io.Reader) *OggPacketizer {
func (o *OggPacketizer) GetPacket() Packet {
packet := &OggPacket{}
if err := binary.Read(o.reader, binary.BigEndian, packet); err != nil || bytes.Compare(packet.Capture[:], []byte{'O', 'g', 'g', 'S'}) != 0 {
if err := binary.Read(o.reader, binary.LittleEndian, &packet.header); err != nil || bytes.Compare(packet.header.Capture[:], []byte{'O', 'g', 'g', 'S'}) != 0 {
return nil
}
packet.pageSegmentTable = make([]byte, packet.PageSegments)
if err := binary.Read(o.reader, binary.BigEndian, packet.pageSegmentTable); err != nil {
packet.pageSegmentTable = make([]byte, packet.header.PageSegments)
if err := binary.Read(o.reader, binary.LittleEndian, packet.pageSegmentTable); err != nil {
return nil
}
packet.segments = make([][]byte, packet.PageSegments)
packet.segments = make([][]byte, packet.header.PageSegments)
for i, size := range packet.pageSegmentTable {
if size > 0 {
packet.segments[i] = make([]byte, size)
if err := binary.Read(o.reader, binary.BigEndian, packet.segments[i]); err != nil {
if err := binary.Read(o.reader, binary.LittleEndian, packet.segments[i]); err != nil {
return nil
}
}