test: ffmpeg select frame and frame(n) filter
|
|
@ -3,6 +3,7 @@ package ffmpeg
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"github.com/cshum/imagor/vips"
|
"github.com/cshum/imagor/vips"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
@ -47,41 +48,53 @@ func TestAVContext(t *testing.T) {
|
||||||
require.NoError(t, os.MkdirAll(baseDir+"golden/export", 0755))
|
require.NoError(t, os.MkdirAll(baseDir+"golden/export", 0755))
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
for _, filename := range files {
|
for _, filename := range files {
|
||||||
t.Run(filename, func(t *testing.T) {
|
for _, frame := range []int{-1, 5, 9999, 99999} {
|
||||||
ctx := context.Background()
|
name := filename
|
||||||
path := baseDir + filename
|
if frame > -1 {
|
||||||
reader, err := os.Open(path)
|
name = fmt.Sprintf("%s-%d", filename, frame)
|
||||||
require.NoError(t, err)
|
|
||||||
stats, err := os.Stat(path)
|
|
||||||
require.NoError(t, err)
|
|
||||||
av, err := LoadAVContext(ctx, reader, stats.Size())
|
|
||||||
require.NoError(t, err)
|
|
||||||
defer av.Close()
|
|
||||||
err = av.ProcessFrames()
|
|
||||||
require.NoError(t, err)
|
|
||||||
meta := av.Metadata()
|
|
||||||
metaBuf, err := json.Marshal(meta)
|
|
||||||
require.NoError(t, err)
|
|
||||||
goldenFile := baseDir + "golden/meta/" + filename + ".meta.json"
|
|
||||||
if curr, err := os.ReadFile(goldenFile); err == nil {
|
|
||||||
assert.Equal(t, string(curr), string(metaBuf))
|
|
||||||
} else {
|
|
||||||
require.NoError(t, os.WriteFile(goldenFile, metaBuf, 0666))
|
|
||||||
}
|
}
|
||||||
bands := 4
|
t.Run(name, func(t *testing.T) {
|
||||||
buf, err := av.Export(bands)
|
ctx := context.Background()
|
||||||
require.NoError(t, err)
|
path := baseDir + filename
|
||||||
img, err := vips.LoadImageFromMemory(buf, meta.Width, meta.Height, bands)
|
reader, err := os.Open(path)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
buf, err = img.ExportJpeg(nil)
|
stats, err := os.Stat(path)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
goldenFile = baseDir + "golden/export/" + filename + ".jpg"
|
av, err := LoadAVContext(ctx, reader, stats.Size())
|
||||||
if curr, err := os.ReadFile(goldenFile); err == nil {
|
require.NoError(t, err)
|
||||||
assert.True(t, reflect.DeepEqual(curr, buf))
|
defer av.Close()
|
||||||
} else {
|
if frame == 9999 {
|
||||||
require.NoError(t, os.WriteFile(goldenFile, buf, 0666))
|
require.NoError(t, av.ProcessFrames())
|
||||||
}
|
}
|
||||||
|
if frame > -1 {
|
||||||
})
|
require.NoError(t, av.SelectFrame(frame))
|
||||||
|
}
|
||||||
|
if frame != 9999 {
|
||||||
|
require.NoError(t, av.ProcessFrames())
|
||||||
|
}
|
||||||
|
meta := av.Metadata()
|
||||||
|
metaBuf, err := json.Marshal(meta)
|
||||||
|
require.NoError(t, err)
|
||||||
|
goldenFile := baseDir + "golden/meta/" + name + ".meta.json"
|
||||||
|
if curr, err := os.ReadFile(goldenFile); err == nil {
|
||||||
|
assert.Equal(t, string(curr), string(metaBuf))
|
||||||
|
} else {
|
||||||
|
require.NoError(t, os.WriteFile(goldenFile, metaBuf, 0666))
|
||||||
|
}
|
||||||
|
bands := 4
|
||||||
|
buf, err := av.Export(bands)
|
||||||
|
require.NoError(t, err)
|
||||||
|
img, err := vips.LoadImageFromMemory(buf, meta.Width, meta.Height, bands)
|
||||||
|
require.NoError(t, err)
|
||||||
|
buf, err = img.ExportJpeg(nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
goldenFile = baseDir + "golden/export/" + name + ".jpg"
|
||||||
|
if curr, err := os.ReadFile(goldenFile); err == nil {
|
||||||
|
assert.True(t, reflect.DeepEqual(curr, buf))
|
||||||
|
} else {
|
||||||
|
require.NoError(t, os.WriteFile(goldenFile, buf, 0666))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -117,12 +117,12 @@ func (p *Processor) Process(ctx context.Context, in *imagor.Blob, params imagorp
|
||||||
for _, filter := range params.Filters {
|
for _, filter := range params.Filters {
|
||||||
switch filter.Name {
|
switch filter.Name {
|
||||||
case "format":
|
case "format":
|
||||||
if s := strings.ToLower(filter.Args); s == "webp" || s == "png" {
|
switch strings.ToLower(filter.Args) {
|
||||||
|
case "webp", "png", "gif":
|
||||||
switch mime.Extension() {
|
switch mime.Extension() {
|
||||||
case ".webm", ".flv", ".mov", ".avi":
|
case ".webm", ".flv", ".mov", ".avi":
|
||||||
bands = 4
|
bands = 4
|
||||||
}
|
}
|
||||||
break
|
|
||||||
}
|
}
|
||||||
case "process_frames":
|
case "process_frames":
|
||||||
if err = av.ProcessFrames(); err != nil {
|
if err = av.ProcessFrames(); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,8 @@ func TestProcessor(t *testing.T) {
|
||||||
})
|
})
|
||||||
doGoldenTests(t, filepath.Join(testDataDir, "golden/result"), []test{
|
doGoldenTests(t, filepath.Join(testDataDir, "golden/result"), []test{
|
||||||
{name: "mkv", path: "fit-in/100x100/everybody-betray-me.mkv"},
|
{name: "mkv", path: "fit-in/100x100/everybody-betray-me.mkv"},
|
||||||
|
{name: "mkv specific frame", path: "fit-in/100x100/filters:frame(3)/everybody-betray-me.mkv"},
|
||||||
|
{name: "mkv specific frame exceeded", path: "fit-in/100x100/filters:frame(99999)/everybody-betray-me.mkv"},
|
||||||
{name: "mkv meta process_frames", path: "meta/filters:process_frames()/everybody-betray-me.mkv"},
|
{name: "mkv meta process_frames", path: "meta/filters:process_frames()/everybody-betray-me.mkv"},
|
||||||
{name: "mkv meta", path: "meta/everybody-betray-me.mkv"},
|
{name: "mkv meta", path: "meta/everybody-betray-me.mkv"},
|
||||||
{name: "mp4", path: "200x100/schizo_0.mp4"},
|
{name: "mp4", path: "200x100/schizo_0.mp4"},
|
||||||
|
|
|
||||||
BIN
testdata/golden/export/alpha-webm.webm-5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
testdata/golden/export/alpha-webm.webm-9999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
testdata/golden/export/alpha-webm.webm-99999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
testdata/golden/export/everybody-betray-me.mkv-5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
testdata/golden/export/everybody-betray-me.mkv-9999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
testdata/golden/export/everybody-betray-me.mkv-99999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
testdata/golden/export/macabre.mp4-5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
testdata/golden/export/macabre.mp4-9999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
testdata/golden/export/macabre.mp4-99999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
testdata/golden/export/schizo.flv-5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo.flv-9999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo.flv-99999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_0.mp4-5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
testdata/golden/export/schizo_0.mp4-9999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_0.mp4-99999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_180.mp4-5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_180.mp4-9999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_180.mp4-99999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_270.mp4-5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_270.mp4-9999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_270.mp4-99999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_90.mp4-5.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_90.mp4-9999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
testdata/golden/export/schizo_90.mp4-99999.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
1
testdata/golden/meta/alpha-webm.webm-5.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"selected_frame":5,"has_video":true,"has_audio":false}
|
||||||
1
testdata/golden/meta/alpha-webm.webm-9999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"selected_frame":99,"has_video":true,"has_audio":false}
|
||||||
1
testdata/golden/meta/alpha-webm.webm-99999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"selected_frame":99,"has_video":true,"has_audio":false}
|
||||||
1
testdata/golden/meta/everybody-betray-me.mkv-5.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/everybody-betray-me.mkv-9999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"selected_frame":99,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/everybody-betray-me.mkv-99999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"selected_frame":99,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/macabre.mp4-5.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/macabre.mp4-9999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"selected_frame":29,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/macabre.mp4-99999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"selected_frame":29,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo.flv-5.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":26,"selected_frame":5,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo.flv-9999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":30,"selected_frame":75,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo.flv-99999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":2560,"width":480,"height":360,"fps":30,"selected_frame":75,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_0.mp4-5.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_0.mp4-9999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_0.mp4-99999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_180.mp4-5.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_180.mp4-9999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_180.mp4-99999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_270.mp4-5.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_270.mp4-9999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_270.mp4-99999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_90.mp4-5.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_90.mp4-9999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true}
|
||||||
1
testdata/golden/meta/schizo_90.mp4-99999.meta.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true}
|
||||||
BIN
testdata/golden/result/fit-in/100x100/filters%3Aframe%283%29/everybody-betray-me.mkv
vendored
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
testdata/golden/result/fit-in/100x100/filters%3Aframe%2899999%29/everybody-betray-me.mkv
vendored
Normal file
|
After Width: | Height: | Size: 2.5 KiB |