Fix FLAC/Ogg Packetizers, add packetizer tests
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
f92b0ed4b3
commit
4973144585
178
Kirika_test.go
178
Kirika_test.go
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue