Ignite/encoder/libaom/libaom_test.go

121 lines
2.3 KiB
Go

//go:build cgo && !disable_codec_libaom
package libaom
import (
"git.gammaspectra.live/S.O.N.G/Ignite/decoder/y4m"
"git.gammaspectra.live/S.O.N.G/Ignite/testdata"
"io"
"net/http"
"os"
"runtime"
"sync"
"testing"
)
func TestVersion(t *testing.T) {
t.Logf("libaom version: %s", Version())
}
func testEncode(sample testdata.TestSample, t *testing.T) {
var reader io.Reader
var err error
if _, err = os.Stat(sample.Path); err != nil {
if sample.SkipNotFound || sample.Url == "" {
t.Skip("skipping without sample")
}
response, err := http.DefaultClient.Get(sample.Url)
if err != nil {
t.Fatal(err)
}
defer response.Body.Close()
reader = response.Body
} else {
f, err := os.Open(sample.Path)
if err != nil {
t.Fatal(err)
}
defer f.Close()
reader = f
}
var pipe *y4m.Decoder
switch sample.Type {
case "y4m":
pipe, err = y4m.NewDecoder(reader, nil)
case "y4m.xz":
pipe, err = y4m.NewXZCompressedDecoder(reader, nil)
default:
t.Fatal("unsupported sample type")
}
if err != nil {
t.Fatal(err)
} else {
defer pipe.Close()
target, err := os.CreateTemp("", "encode_test_*.ivf")
if err != nil {
t.Fatal(err)
return
}
defer func() {
name := target.Name()
target.Close()
os.Remove(name)
}()
stream := pipe.DecodeStream()
settings := make(map[string]any)
settings["threads"] = runtime.NumCPU()
settings["row-mt"] = 1
settings["cpu-used"] = 8
//settings["use-16bit-internal"] = 1
settings["frame-parallel"] = 1
settings["lag-in-frames"] = 2
settings["tile-columns"] = 1
settings["tile-rows"] = 4
if encoder, err := NewEncoder(target, stream.Properties(), settings); err != nil {
t.Fatal(err)
} else {
defer encoder.Close()
s := stream.Copy(2)
encoded := 0
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for range s[0].Channel() {
if encoded%10 == 0 {
t.Logf("frame %d/%d", encoded, sample.Frames)
}
encoded++
}
}()
if err = encoder.EncodeStream(s[1]); err != nil {
t.Fatal(err)
}
wg.Wait()
if encoded != sample.Frames {
t.Fatalf("expected %d frames, got %d", sample.Frames, encoded)
}
}
}
}
func TestEncode_YUV420_8bit(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode")
}
testEncode(testdata.Y4M_Sintel_Trailer_720p24_YUV420_8bit, t)
}