mirror of
https://github.com/datarhei/core.git
synced 2025-09-27 04:16:25 +08:00
460 lines
11 KiB
Go
460 lines
11 KiB
Go
package skills
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestNewInvalidBinary(t *testing.T) {
|
|
skills, err := New("")
|
|
|
|
require.NotNil(t, err)
|
|
|
|
require.Empty(t, skills.FFmpeg.Version)
|
|
require.Empty(t, skills.FFmpeg.Compiler)
|
|
require.Empty(t, skills.FFmpeg.Configuration)
|
|
require.Empty(t, skills.FFmpeg.Libraries)
|
|
|
|
require.Empty(t, skills.Filters)
|
|
require.Empty(t, skills.HWAccels)
|
|
|
|
require.Empty(t, skills.Codecs.Audio)
|
|
require.Empty(t, skills.Codecs.Subtitle)
|
|
require.Empty(t, skills.Codecs.Video)
|
|
|
|
require.Empty(t, skills.Devices.Demuxers)
|
|
require.Empty(t, skills.Devices.Muxers)
|
|
|
|
require.Empty(t, skills.Formats.Demuxers)
|
|
require.Empty(t, skills.Formats.Muxers)
|
|
|
|
require.Empty(t, skills.Protocols.Input)
|
|
require.Empty(t, skills.Protocols.Output)
|
|
}
|
|
|
|
func TestPatchVersion(t *testing.T) {
|
|
data := `ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
|
|
built with Apple clang version 12.0.0 (clang-1200.0.32.29)
|
|
configuration: --enable-static --enable-debug --disable-doc --enable-libx264 --enable-gpl --enable-nonfree
|
|
libavutil 56. 51.100 / 56. 51.100
|
|
libavcodec 58. 91.100 / 58. 91.100
|
|
libavformat 58. 45.100 / 58. 45.100
|
|
libavdevice 58. 10.100 / 58. 10.100
|
|
libavfilter 7. 85.100 / 7. 85.100
|
|
libswscale 5. 7.100 / 5. 7.100
|
|
libswresample 3. 7.100 / 3. 7.100
|
|
libpostproc 55. 7.100 / 55. 7.100`
|
|
|
|
f := parseVersion([]byte(data))
|
|
|
|
require.Equal(t, ffmpeg{
|
|
Version: "4.3.1",
|
|
Compiler: "Apple clang version 12.0.0 (clang-1200.0.32.29)",
|
|
Configuration: "--enable-static --enable-debug --disable-doc --enable-libx264 --enable-gpl --enable-nonfree",
|
|
Libraries: []Library{
|
|
{
|
|
Name: "libavutil",
|
|
Compiled: "56. 51.100",
|
|
Linked: "56. 51.100",
|
|
},
|
|
{
|
|
Name: "libavcodec",
|
|
Compiled: "58. 91.100",
|
|
Linked: "58. 91.100",
|
|
},
|
|
{
|
|
Name: "libavformat",
|
|
Compiled: "58. 45.100",
|
|
Linked: "58. 45.100",
|
|
},
|
|
{
|
|
Name: "libavdevice",
|
|
Compiled: "58. 10.100",
|
|
Linked: "58. 10.100",
|
|
},
|
|
{
|
|
Name: "libavfilter",
|
|
Compiled: "7. 85.100",
|
|
Linked: "7. 85.100",
|
|
},
|
|
{
|
|
Name: "libswscale",
|
|
Compiled: "5. 7.100",
|
|
Linked: "5. 7.100",
|
|
},
|
|
{
|
|
Name: "libswresample",
|
|
Compiled: "3. 7.100",
|
|
Linked: "3. 7.100",
|
|
},
|
|
{
|
|
Name: "libpostproc",
|
|
Compiled: "55. 7.100",
|
|
Linked: "55. 7.100",
|
|
},
|
|
},
|
|
}, f)
|
|
}
|
|
|
|
func TestMinorVersion(t *testing.T) {
|
|
data := `ffmpeg version 4.4 Copyright (c) 2000-2020 the FFmpeg developers
|
|
built with Apple clang version 12.0.0 (clang-1200.0.32.29)
|
|
configuration: --enable-static --enable-debug --disable-doc --enable-libx264 --enable-gpl --enable-nonfree
|
|
libavutil 56. 51.100 / 56. 51.100
|
|
libavcodec 58. 91.100 / 58. 91.100
|
|
libavformat 58. 45.100 / 58. 45.100
|
|
libavdevice 58. 10.100 / 58. 10.100
|
|
libavfilter 7. 85.100 / 7. 85.100
|
|
libswscale 5. 7.100 / 5. 7.100
|
|
libswresample 3. 7.100 / 3. 7.100
|
|
libpostproc 55. 7.100 / 55. 7.100`
|
|
|
|
f := parseVersion([]byte(data))
|
|
|
|
require.Equal(t, ffmpeg{
|
|
Version: "4.4.0",
|
|
Compiler: "Apple clang version 12.0.0 (clang-1200.0.32.29)",
|
|
Configuration: "--enable-static --enable-debug --disable-doc --enable-libx264 --enable-gpl --enable-nonfree",
|
|
Libraries: []Library{
|
|
{
|
|
Name: "libavutil",
|
|
Compiled: "56. 51.100",
|
|
Linked: "56. 51.100",
|
|
},
|
|
{
|
|
Name: "libavcodec",
|
|
Compiled: "58. 91.100",
|
|
Linked: "58. 91.100",
|
|
},
|
|
{
|
|
Name: "libavformat",
|
|
Compiled: "58. 45.100",
|
|
Linked: "58. 45.100",
|
|
},
|
|
{
|
|
Name: "libavdevice",
|
|
Compiled: "58. 10.100",
|
|
Linked: "58. 10.100",
|
|
},
|
|
{
|
|
Name: "libavfilter",
|
|
Compiled: "7. 85.100",
|
|
Linked: "7. 85.100",
|
|
},
|
|
{
|
|
Name: "libswscale",
|
|
Compiled: "5. 7.100",
|
|
Linked: "5. 7.100",
|
|
},
|
|
{
|
|
Name: "libswresample",
|
|
Compiled: "3. 7.100",
|
|
Linked: "3. 7.100",
|
|
},
|
|
{
|
|
Name: "libpostproc",
|
|
Compiled: "55. 7.100",
|
|
Linked: "55. 7.100",
|
|
},
|
|
},
|
|
}, f)
|
|
}
|
|
|
|
func TestCustomVersion(t *testing.T) {
|
|
data := `ffmpeg version 4.4.1-datarhei Copyright (c) 2000-2021 the FFmpeg developers
|
|
built with gcc 10.3.1 (Alpine 10.3.1_git20211027) 20211027
|
|
configuration: --extra-version=datarhei --prefix=/usr --extra-libs='-lpthread -lm -lz -lsupc++ -lstdc++ -lssl -lcrypto -lz -lc -ldl' --enable-nonfree --enable-gpl --enable-version3 --enable-postproc --enable-static --enable-openssl --enable-omx --enable-omx-rpi --enable-mmal --enable-v4l2_m2m --enable-libfreetype --enable-libsrt --enable-libx264 --enable-libx265 --enable-libvpx --enable-libmp3lame --enable-libopus --enable-libvorbis --disable-ffplay --disable-debug --disable-doc --disable-shared
|
|
libavutil 56. 70.100 / 56. 70.100
|
|
libavcodec 58.134.100 / 58.134.100
|
|
libavformat 58. 76.100 / 58. 76.100
|
|
libavdevice 58. 13.100 / 58. 13.100
|
|
libavfilter 7.110.100 / 7.110.100
|
|
libswscale 5. 9.100 / 5. 9.100
|
|
libswresample 3. 9.100 / 3. 9.100
|
|
libpostproc 55. 9.100 / 55. 9.100`
|
|
|
|
f := parseVersion([]byte(data))
|
|
|
|
require.Equal(t, ffmpeg{
|
|
Version: "4.4.1",
|
|
Compiler: "gcc 10.3.1 (Alpine 10.3.1_git20211027) 20211027",
|
|
Configuration: "--extra-version=datarhei --prefix=/usr --extra-libs='-lpthread -lm -lz -lsupc++ -lstdc++ -lssl -lcrypto -lz -lc -ldl' --enable-nonfree --enable-gpl --enable-version3 --enable-postproc --enable-static --enable-openssl --enable-omx --enable-omx-rpi --enable-mmal --enable-v4l2_m2m --enable-libfreetype --enable-libsrt --enable-libx264 --enable-libx265 --enable-libvpx --enable-libmp3lame --enable-libopus --enable-libvorbis --disable-ffplay --disable-debug --disable-doc --disable-shared",
|
|
Libraries: []Library{
|
|
{
|
|
Name: "libavutil",
|
|
Compiled: "56. 70.100",
|
|
Linked: "56. 70.100",
|
|
},
|
|
{
|
|
Name: "libavcodec",
|
|
Compiled: "58.134.100",
|
|
Linked: "58.134.100",
|
|
},
|
|
{
|
|
Name: "libavformat",
|
|
Compiled: "58. 76.100",
|
|
Linked: "58. 76.100",
|
|
},
|
|
{
|
|
Name: "libavdevice",
|
|
Compiled: "58. 13.100",
|
|
Linked: "58. 13.100",
|
|
},
|
|
{
|
|
Name: "libavfilter",
|
|
Compiled: "7.110.100",
|
|
Linked: "7.110.100",
|
|
},
|
|
{
|
|
Name: "libswscale",
|
|
Compiled: "5. 9.100",
|
|
Linked: "5. 9.100",
|
|
},
|
|
{
|
|
Name: "libswresample",
|
|
Compiled: "3. 9.100",
|
|
Linked: "3. 9.100",
|
|
},
|
|
{
|
|
Name: "libpostproc",
|
|
Compiled: "55. 9.100",
|
|
Linked: "55. 9.100",
|
|
},
|
|
},
|
|
}, f)
|
|
}
|
|
|
|
func TestFilters(t *testing.T) {
|
|
data := ` ... afirsrc |->A Generate a FIR coefficients audio stream.
|
|
... anoisesrc |->A Generate a noise audio signal.
|
|
... anullsrc |->A Null audio source, return empty audio frames.
|
|
... hilbert |->A Generate a Hilbert transform FIR coefficients.
|
|
... sinc |->A Generate a sinc kaiser-windowed low-pass, high-pass, band-pass, or band-reject FIR coefficients.
|
|
... sine |->A Generate sine wave audio signal.
|
|
... anullsink A->| Do absolutely nothing with the input audio.
|
|
... addroi V->V Add region of interest to frame.
|
|
... alphaextract V->N Extract an alpha channel as a grayscale image component.
|
|
T.. alphamerge VV->V Copy the luma value of the second input into the alpha channel of the first input.`
|
|
|
|
f := parseFilters([]byte(data))
|
|
|
|
require.Equal(t, []Filter{
|
|
{
|
|
Id: "afirsrc",
|
|
Name: "Generate a FIR coefficients audio stream.",
|
|
},
|
|
{
|
|
Id: "anoisesrc",
|
|
Name: "Generate a noise audio signal.",
|
|
},
|
|
{
|
|
Id: "anullsrc",
|
|
Name: "Null audio source, return empty audio frames.",
|
|
},
|
|
{
|
|
Id: "hilbert",
|
|
Name: "Generate a Hilbert transform FIR coefficients.",
|
|
},
|
|
{
|
|
Id: "sinc",
|
|
Name: "Generate a sinc kaiser-windowed low-pass, high-pass, band-pass, or band-reject FIR coefficients.",
|
|
},
|
|
{
|
|
Id: "sine",
|
|
Name: "Generate sine wave audio signal.",
|
|
},
|
|
{
|
|
Id: "anullsink",
|
|
Name: "Do absolutely nothing with the input audio.",
|
|
},
|
|
{
|
|
Id: "addroi",
|
|
Name: "Add region of interest to frame.",
|
|
},
|
|
{
|
|
Id: "alphaextract",
|
|
Name: "Extract an alpha channel as a grayscale image component.",
|
|
},
|
|
{
|
|
Id: "alphamerge",
|
|
Name: "Copy the luma value of the second input into the alpha channel of the first input.",
|
|
},
|
|
}, f)
|
|
}
|
|
|
|
func TestCodecs(t *testing.T) {
|
|
data := ` DEAIL. aac AAC (Advanced Audio Coding) (decoders: aac aac_fixed aac_at ) (encoders: aac aac_at )
|
|
DEVI.S y41p Uncompressed YUV 4:1:1 12-bit
|
|
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (encoders: libx264 libx264rgb h264_videotoolbox )
|
|
DEV.L. flv1 FLV / Sorenson Spark / Sorenson H.263 (Flash Video) (decoders: flv ) (encoders: flv )`
|
|
|
|
c := parseCodecs([]byte(data))
|
|
|
|
require.Equal(t, ffCodecs{
|
|
Audio: []Codec{
|
|
{
|
|
Id: "aac",
|
|
Name: "AAC (Advanced Audio Coding)",
|
|
Encoders: []string{
|
|
"aac",
|
|
"aac_at",
|
|
},
|
|
Decoders: []string{
|
|
"aac",
|
|
"aac_fixed",
|
|
"aac_at",
|
|
},
|
|
},
|
|
},
|
|
Video: []Codec{
|
|
{
|
|
Id: "y41p",
|
|
Name: "Uncompressed YUV 4:1:1 12-bit",
|
|
Encoders: []string{
|
|
"y41p",
|
|
},
|
|
Decoders: []string{
|
|
"y41p",
|
|
},
|
|
},
|
|
{
|
|
Id: "h264",
|
|
Name: "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
|
|
Encoders: []string{
|
|
"libx264",
|
|
"libx264rgb",
|
|
"h264_videotoolbox",
|
|
},
|
|
Decoders: []string{
|
|
"h264",
|
|
},
|
|
},
|
|
{
|
|
Id: "flv1",
|
|
Name: "FLV / Sorenson Spark / Sorenson H.263 (Flash Video)",
|
|
Encoders: []string{
|
|
"flv",
|
|
},
|
|
Decoders: []string{
|
|
"flv",
|
|
},
|
|
},
|
|
},
|
|
Subtitle: nil,
|
|
}, c)
|
|
}
|
|
|
|
func TestFormats(t *testing.T) {
|
|
data := ` DE mpeg MPEG-1 Systems / MPEG program stream
|
|
E mpeg1video raw MPEG-1 video
|
|
E mpeg2video raw MPEG-2 video
|
|
DE mpegts MPEG-TS (MPEG-2 Transport Stream)
|
|
D mpegtsraw raw MPEG-TS (MPEG-2 Transport Stream)
|
|
D mpegvideo raw MPEG video`
|
|
|
|
f := parseFormats([]byte(data))
|
|
|
|
require.Equal(t, ffFormats{
|
|
Demuxers: []Format{
|
|
{
|
|
Id: "mpeg",
|
|
Name: "MPEG-1 Systems / MPEG program stream",
|
|
},
|
|
{
|
|
Id: "mpegts",
|
|
Name: "MPEG-TS (MPEG-2 Transport Stream)",
|
|
},
|
|
{
|
|
Id: "mpegtsraw",
|
|
Name: "raw MPEG-TS (MPEG-2 Transport Stream)",
|
|
},
|
|
{
|
|
Id: "mpegvideo",
|
|
Name: "raw MPEG video",
|
|
},
|
|
},
|
|
Muxers: []Format{
|
|
{
|
|
Id: "mpeg",
|
|
Name: "MPEG-1 Systems / MPEG program stream",
|
|
},
|
|
{
|
|
Id: "mpeg1video",
|
|
Name: "raw MPEG-1 video",
|
|
},
|
|
{
|
|
Id: "mpeg2video",
|
|
Name: "raw MPEG-2 video",
|
|
},
|
|
{
|
|
Id: "mpegts",
|
|
Name: "MPEG-TS (MPEG-2 Transport Stream)",
|
|
},
|
|
},
|
|
}, f)
|
|
}
|
|
|
|
func TestProtocols(t *testing.T) {
|
|
data := `Input:
|
|
async
|
|
bluray
|
|
cache
|
|
Output:
|
|
crypto
|
|
file
|
|
ftp
|
|
gopher`
|
|
|
|
p := parseProtocols([]byte(data))
|
|
|
|
require.Equal(t, ffProtocols{
|
|
Input: []Protocol{
|
|
{
|
|
Id: "async",
|
|
Name: "async",
|
|
},
|
|
{
|
|
Id: "bluray",
|
|
Name: "bluray",
|
|
},
|
|
{
|
|
Id: "cache",
|
|
Name: "cache",
|
|
},
|
|
},
|
|
Output: []Protocol{
|
|
{
|
|
Id: "crypto",
|
|
Name: "crypto",
|
|
},
|
|
{
|
|
Id: "file",
|
|
Name: "file",
|
|
},
|
|
{
|
|
Id: "ftp",
|
|
Name: "ftp",
|
|
},
|
|
{
|
|
Id: "gopher",
|
|
Name: "gopher",
|
|
},
|
|
},
|
|
}, p)
|
|
}
|
|
|
|
func TestHWAccels(t *testing.T) {
|
|
data := `Hardware acceleration methods:
|
|
videotoolbox`
|
|
|
|
p := parseHWAccels([]byte(data))
|
|
|
|
require.Equal(t, []HWAccel{
|
|
{
|
|
Id: "videotoolbox",
|
|
Name: "videotoolbox",
|
|
},
|
|
}, p)
|
|
}
|