mirror of
https://github.com/asticode/go-astiav.git
synced 2024-05-28 13:53:18 +08:00
101 lines
4.0 KiB
Go
101 lines
4.0 KiB
Go
// TODO Fix https://github.com/asticode/go-astiav/actions/runs/5853322732/job/15867145888
|
|
//go:build !windows
|
|
|
|
package astiav
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestFilterGraph(t *testing.T) {
|
|
fg := AllocFilterGraph()
|
|
defer fg.Free()
|
|
cl := fg.Class()
|
|
require.NotNil(t, cl)
|
|
require.Equal(t, "AVFilterGraph", cl.Name())
|
|
fg.SetThreadCount(2)
|
|
require.Equal(t, 2, fg.ThreadCount())
|
|
fg.SetThreadType(ThreadTypeSlice)
|
|
require.Equal(t, ThreadTypeSlice, fg.ThreadType())
|
|
|
|
bufferSink := FindFilterByName("buffersink")
|
|
require.NotNil(t, bufferSink)
|
|
|
|
fcOut, err := fg.NewFilterContext(bufferSink, "filter_out", nil)
|
|
require.NoError(t, err)
|
|
defer fcOut.Free()
|
|
cl = fcOut.Class()
|
|
require.NotNil(t, cl)
|
|
require.Equal(t, "AVFilter", cl.Name())
|
|
|
|
inputs := AllocFilterInOut()
|
|
defer inputs.Free()
|
|
inputs.SetName("out")
|
|
inputs.SetFilterContext(fcOut)
|
|
inputs.SetPadIdx(0)
|
|
inputs.SetNext(nil)
|
|
|
|
var outputs *FilterInOut
|
|
defer func() {
|
|
if outputs != nil {
|
|
outputs.Free()
|
|
}
|
|
}()
|
|
var fcIns []*FilterContext
|
|
for i := 0; i < 2; i++ {
|
|
bufferSrc := FindFilterByName("buffer")
|
|
require.NotNil(t, bufferSrc)
|
|
|
|
fcIn, err := fg.NewFilterContext(bufferSrc, fmt.Sprintf("filter_in_%d", i+1), FilterArgs{
|
|
"pix_fmt": strconv.Itoa(int(PixelFormatYuv420P)),
|
|
"pixel_aspect": "1/1",
|
|
"time_base": "1/1000",
|
|
"video_size": "1x1",
|
|
})
|
|
require.NoError(t, err)
|
|
fcIns = append(fcIns, fcIn)
|
|
defer fcIn.Free()
|
|
|
|
o := AllocFilterInOut()
|
|
o.SetName(fmt.Sprintf("input_%d", i+1))
|
|
o.SetFilterContext(fcIn)
|
|
o.SetPadIdx(0)
|
|
o.SetNext(outputs)
|
|
|
|
outputs = o
|
|
}
|
|
|
|
err = fg.Parse("[input_1]scale=2x2[scaled_1];[input_2]scale=3x3[scaled_2];[scaled_1][scaled_2]overlay", inputs, outputs)
|
|
require.NoError(t, err)
|
|
|
|
err = fg.Configure()
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, 1, fcOut.NbInputs())
|
|
require.Equal(t, 1, len(fcOut.Inputs()))
|
|
require.Equal(t, NewRational(1, 1000), fcOut.Inputs()[0].TimeBase())
|
|
require.Equal(t, 0, fcOut.NbOutputs())
|
|
for _, fc := range fcIns {
|
|
require.Equal(t, 0, fc.NbInputs())
|
|
require.Equal(t, 1, fc.NbOutputs())
|
|
require.Equal(t, 1, len(fc.Outputs()))
|
|
require.Equal(t, NewRational(1, 1000), fc.Outputs()[0].TimeBase())
|
|
}
|
|
|
|
resp, err := fg.SendCommand("scale", "invalid", "a", NewFilterCommandFlags())
|
|
require.Error(t, err)
|
|
require.Empty(t, resp)
|
|
resp, err = fg.SendCommand("scale", "width", "4", NewFilterCommandFlags().Add(FilterCommandFlagOne))
|
|
require.NoError(t, err)
|
|
require.Empty(t, resp)
|
|
|
|
require.Equal(t, " +--------------+\nParsed_overlay_2:default--[2x2 1:1 yuv420p]--default| filter_out |\n | (buffersink) |\n +--------------+\n\n+-------------+\n| filter_in_1 |default--[1x1 1:1 yuv420p]--Parsed_scale_0:default\n| (buffer) |\n+-------------+\n\n+-------------+\n| filter_in_2 |default--[1x1 1:1 yuv420p]--Parsed_scale_1:default\n| (buffer) |\n+-------------+\n\n +----------------+\nfilter_in_1:default--[1x1 1:1 yuv420p]--default| Parsed_scale_0 |default--[4x2 1:2 yuv420p]--Parsed_overlay_2:main\n | (scale) |\n +----------------+\n\n +----------------+\nfilter_in_2:default--[1x1 1:1 yuv420p]--default| Parsed_scale_1 |default--[3x3 1:1 yuva420p]--Parsed_overlay_2:overlay\n | (scale) |\n +----------------+\n\n +------------------+\nParsed_scale_0:default--[4x2 1:2 yuv420p]------main| Parsed_overlay_2 |default--[2x2 1:1 yuv420p]--filter_out:default\nParsed_scale_1:default--[3x3 1:1 yuva420p]--overlay| (overlay) |\n +------------------+\n\n", fg.String())
|
|
|
|
// TODO Test BuffersrcAddFrame
|
|
// TODO Test BuffersinkGetFrame
|
|
}
|