package filter

This commit is contained in:
Markus Tzoe 2017-07-19 18:10:58 +08:00
parent aeb57b323f
commit f681e62c61
8 changed files with 37 additions and 36 deletions

View file

@ -23,7 +23,7 @@ func init() {
}
func main() {
fmt.Fprintf(os.Stderr, "\r\nTTA1 lossless audio encoder/decoder, version %s{%d}\n\n", tta.Version, tta.BinaryVersion())
fmt.Fprintf(os.Stderr, "\r\nTTA1 lossless audio encoder/decoder, version %s\n\n", tta.Version)
flag.Parse()
if help || flag.NArg() < 1 || (!decode && !encode) {
fmt.Fprintf(os.Stderr, "\rUsage of gotta: [encode|decode] [passwd PASSWORD] INPUT_FILE OUTPUT_FILE\n\n")

View file

@ -1,5 +1,9 @@
package tta
import (
"github.com/zyxar/tta/filter"
)
type Info struct {
format uint32 // audio format
nch uint32 // number of channels
@ -23,7 +27,7 @@ func (a *adapter) init(k0, k1 uint32) {
}
type codec struct {
filter Filter
filter filter.Filter
adapter adapter
prev int32
}

View file

@ -17,7 +17,7 @@ const (
formatEncrypted = 2
// Version of TTA lib
Version = "0.0.1"
Version = "0.0.2"
)
var (
@ -34,14 +34,6 @@ var (
errPartialWritten = errors.New("partial written")
)
const ( // CPU_ARCH_TYPE
cpuArchUndefined = iota
cpuArchIx86Sse2
cpuArchIx86Sse3
cpuArchIx86Sse4_1
cpuArchIx86Sse4_2
)
var bitMask = []uint32{
0x00000000, 0x00000001, 0x00000003, 0x00000007,
0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,

View file

@ -4,6 +4,7 @@ import (
"io"
"os"
"github.com/zyxar/tta/filter"
"github.com/zyxar/tta/wave"
)
@ -226,7 +227,7 @@ func (d *Decoder) frameInit(frame uint32, seekNeeded bool) (err error) {
d.flen = d.flenStd
}
for i := 0; i < d.channels; i++ {
d.codecs[i].filter = NewCompatibleFilter(d.data, shift)
d.codecs[i].filter = filter.New(d.data, shift)
d.codecs[i].adapter.init(10, 10)
d.codecs[i].prev = 0
}

View file

@ -5,6 +5,7 @@ import (
"io"
"os"
"github.com/zyxar/tta/filter"
"github.com/zyxar/tta/wave"
)
@ -228,7 +229,7 @@ func (e *Encoder) frameInit(frame uint32) (err error) {
}
// init entropy encoder
for i := 0; i < e.channels; i++ {
e.codecs[i].filter = NewCompatibleFilter(e.data, shift)
e.codecs[i].filter = filter.New(e.data, shift)
e.codecs[i].adapter.init(10, 10)
e.codecs[i].prev = 0
}

View file

@ -1,4 +1,4 @@
package tta
package filter
import (
"github.com/klauspost/cpuid"

View file

@ -1,4 +1,4 @@
package tta
package filter
// TODO: SSE4 optimization
@ -7,20 +7,20 @@ type Filter interface {
Encode(*int32)
}
type filterCompat struct {
index int32
error int32
round int32
shift uint32
qm [8]int32
dx [24]int32
dl [24]int32
type flt struct {
index int32
error int32
round int32
shift uint32
qm [8]int32
dx [24]int32
dl [24]int32
decode func(*int32)
encode func(*int32)
}
// type filterSse filterCompat
func NewCompatibleFilter(data [8]byte, shift uint32) Filter {
t := filterCompat{}
func New(data [8]byte, shift uint32) Filter {
t := flt{}
t.shift = shift
t.round = 1 << uint32(shift-1)
t.qm[0] = int32(int8(data[0]))
@ -31,10 +31,20 @@ func NewCompatibleFilter(data [8]byte, shift uint32) Filter {
t.qm[5] = int32(int8(data[5]))
t.qm[6] = int32(int8(data[6]))
t.qm[7] = int32(int8(data[7]))
t.decode = t.DecodeCompat
t.encode = t.EncodeCompat
return &t
}
func (t *filterCompat) Decode(in *int32) {
func (f *flt) Decode(in *int32) {
f.decode(in)
}
func (f *flt) Encode(in *int32) {
f.encode(in)
}
func (t *flt) DecodeCompat(in *int32) {
pa := t.dl[:]
pb := t.qm[:]
pm := t.dx[:]
@ -84,7 +94,7 @@ func (t *filterCompat) Decode(in *int32) {
pa[4] += pa[5]
}
func (t *filterCompat) Encode(in *int32) {
func (t *flt) EncodeCompat(in *int32) {
pa := t.dl[:]
pb := t.qm[:]
pm := t.dx[:]

View file

@ -4,13 +4,6 @@ import (
"encoding/binary"
)
func BinaryVersion() byte {
if sseEnabled {
return cpuArchIx86Sse4_1
}
return cpuArchUndefined
}
func computeKeyDigits(p []byte) [8]byte {
var crcLow, crcHigh uint32 = 0xFFFFFFFF, 0xFFFFFFFF
for i := 0; i < len(p); i++ {