142 lines
3 KiB
Go
142 lines
3 KiB
Go
//go:build cgo && !disable_codec_libx264
|
|
|
|
package libx264
|
|
|
|
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("libx264 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_*.h264")
|
|
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["preset"] = "fast"
|
|
settings["log"] = LogLevelInfo
|
|
|
|
if sample.ColorSpace.ChromaSampling.J == 4 && sample.ColorSpace.ChromaSampling.A == 4 && sample.ColorSpace.ChromaSampling.B == 4 {
|
|
settings["profile"] = "high444"
|
|
} else if sample.ColorSpace.ChromaSampling.J == 4 && sample.ColorSpace.ChromaSampling.A == 2 && sample.ColorSpace.ChromaSampling.B == 2 {
|
|
settings["profile"] = "high422"
|
|
} else if sample.ColorSpace.BitDepth > 8 {
|
|
settings["profile"] = "high10"
|
|
} else {
|
|
settings["profile"] = "high"
|
|
}
|
|
|
|
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 encode test in short mode")
|
|
}
|
|
|
|
testEncode(testdata.Y4M_Sintel_Trailer_720p24_YUV420_8bit, t)
|
|
}
|
|
|
|
func TestEncode_YUV422_8bit(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping encode test in short mode")
|
|
}
|
|
|
|
testEncode(testdata.Y4M_Ducks_Take_Off_720p50_YUV422_8bit, t)
|
|
}
|
|
|
|
func TestEncode_YUV444_8bit(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping encode test in short mode")
|
|
}
|
|
|
|
testEncode(testdata.Y4M_Ducks_Take_Off_720p50_YUV444_8bit, t)
|
|
}
|