diff --git a/ffmpeg/ffmpeg_test.go b/ffmpeg/ffmpeg_test.go index 640d65f..00d1335 100644 --- a/ffmpeg/ffmpeg_test.go +++ b/ffmpeg/ffmpeg_test.go @@ -3,6 +3,7 @@ package ffmpeg import ( "context" "encoding/json" + "fmt" "github.com/cshum/imagor/vips" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -47,41 +48,53 @@ func TestAVContext(t *testing.T) { require.NoError(t, os.MkdirAll(baseDir+"golden/export", 0755)) t.Parallel() for _, filename := range files { - t.Run(filename, func(t *testing.T) { - ctx := context.Background() - path := baseDir + filename - reader, err := os.Open(path) - 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)) + for _, frame := range []int{-1, 5, 9999, 99999} { + name := filename + if frame > -1 { + name = fmt.Sprintf("%s-%d", filename, frame) } - 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/" + filename + ".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)) - } - - }) + t.Run(name, func(t *testing.T) { + ctx := context.Background() + path := baseDir + filename + reader, err := os.Open(path) + 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() + if frame == 9999 { + 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)) + } + }) + } } } diff --git a/processor.go b/processor.go index 8b0ce60..61e4c53 100644 --- a/processor.go +++ b/processor.go @@ -117,12 +117,12 @@ func (p *Processor) Process(ctx context.Context, in *imagor.Blob, params imagorp for _, filter := range params.Filters { switch filter.Name { case "format": - if s := strings.ToLower(filter.Args); s == "webp" || s == "png" { + switch strings.ToLower(filter.Args) { + case "webp", "png", "gif": switch mime.Extension() { case ".webm", ".flv", ".mov", ".avi": bands = 4 } - break } case "process_frames": if err = av.ProcessFrames(); err != nil { diff --git a/processor_test.go b/processor_test.go index 33625d7..7ebee6d 100644 --- a/processor_test.go +++ b/processor_test.go @@ -42,6 +42,8 @@ func TestProcessor(t *testing.T) { }) doGoldenTests(t, filepath.Join(testDataDir, "golden/result"), []test{ {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", path: "meta/everybody-betray-me.mkv"}, {name: "mp4", path: "200x100/schizo_0.mp4"}, diff --git a/testdata/golden/export/alpha-webm.webm-5.jpg b/testdata/golden/export/alpha-webm.webm-5.jpg new file mode 100644 index 0000000..ea8f589 Binary files /dev/null and b/testdata/golden/export/alpha-webm.webm-5.jpg differ diff --git a/testdata/golden/export/alpha-webm.webm-9999.jpg b/testdata/golden/export/alpha-webm.webm-9999.jpg new file mode 100644 index 0000000..2e0017e Binary files /dev/null and b/testdata/golden/export/alpha-webm.webm-9999.jpg differ diff --git a/testdata/golden/export/alpha-webm.webm-99999.jpg b/testdata/golden/export/alpha-webm.webm-99999.jpg new file mode 100644 index 0000000..2e0017e Binary files /dev/null and b/testdata/golden/export/alpha-webm.webm-99999.jpg differ diff --git a/testdata/golden/export/everybody-betray-me.mkv-5.jpg b/testdata/golden/export/everybody-betray-me.mkv-5.jpg new file mode 100644 index 0000000..62127fd Binary files /dev/null and b/testdata/golden/export/everybody-betray-me.mkv-5.jpg differ diff --git a/testdata/golden/export/everybody-betray-me.mkv-9999.jpg b/testdata/golden/export/everybody-betray-me.mkv-9999.jpg new file mode 100644 index 0000000..2f6fb58 Binary files /dev/null and b/testdata/golden/export/everybody-betray-me.mkv-9999.jpg differ diff --git a/testdata/golden/export/everybody-betray-me.mkv-99999.jpg b/testdata/golden/export/everybody-betray-me.mkv-99999.jpg new file mode 100644 index 0000000..2f6fb58 Binary files /dev/null and b/testdata/golden/export/everybody-betray-me.mkv-99999.jpg differ diff --git a/testdata/golden/export/macabre.mp4-5.jpg b/testdata/golden/export/macabre.mp4-5.jpg new file mode 100644 index 0000000..e64c401 Binary files /dev/null and b/testdata/golden/export/macabre.mp4-5.jpg differ diff --git a/testdata/golden/export/macabre.mp4-9999.jpg b/testdata/golden/export/macabre.mp4-9999.jpg new file mode 100644 index 0000000..59f5451 Binary files /dev/null and b/testdata/golden/export/macabre.mp4-9999.jpg differ diff --git a/testdata/golden/export/macabre.mp4-99999.jpg b/testdata/golden/export/macabre.mp4-99999.jpg new file mode 100644 index 0000000..59f5451 Binary files /dev/null and b/testdata/golden/export/macabre.mp4-99999.jpg differ diff --git a/testdata/golden/export/schizo.flv-5.jpg b/testdata/golden/export/schizo.flv-5.jpg new file mode 100644 index 0000000..fb1d4da Binary files /dev/null and b/testdata/golden/export/schizo.flv-5.jpg differ diff --git a/testdata/golden/export/schizo.flv-9999.jpg b/testdata/golden/export/schizo.flv-9999.jpg new file mode 100644 index 0000000..84f7b40 Binary files /dev/null and b/testdata/golden/export/schizo.flv-9999.jpg differ diff --git a/testdata/golden/export/schizo.flv-99999.jpg b/testdata/golden/export/schizo.flv-99999.jpg new file mode 100644 index 0000000..84f7b40 Binary files /dev/null and b/testdata/golden/export/schizo.flv-99999.jpg differ diff --git a/testdata/golden/export/schizo_0.mp4-5.jpg b/testdata/golden/export/schizo_0.mp4-5.jpg new file mode 100644 index 0000000..fcccf00 Binary files /dev/null and b/testdata/golden/export/schizo_0.mp4-5.jpg differ diff --git a/testdata/golden/export/schizo_0.mp4-9999.jpg b/testdata/golden/export/schizo_0.mp4-9999.jpg new file mode 100644 index 0000000..935ab8e Binary files /dev/null and b/testdata/golden/export/schizo_0.mp4-9999.jpg differ diff --git a/testdata/golden/export/schizo_0.mp4-99999.jpg b/testdata/golden/export/schizo_0.mp4-99999.jpg new file mode 100644 index 0000000..935ab8e Binary files /dev/null and b/testdata/golden/export/schizo_0.mp4-99999.jpg differ diff --git a/testdata/golden/export/schizo_180.mp4-5.jpg b/testdata/golden/export/schizo_180.mp4-5.jpg new file mode 100644 index 0000000..6d6cbfc Binary files /dev/null and b/testdata/golden/export/schizo_180.mp4-5.jpg differ diff --git a/testdata/golden/export/schizo_180.mp4-9999.jpg b/testdata/golden/export/schizo_180.mp4-9999.jpg new file mode 100644 index 0000000..15f6245 Binary files /dev/null and b/testdata/golden/export/schizo_180.mp4-9999.jpg differ diff --git a/testdata/golden/export/schizo_180.mp4-99999.jpg b/testdata/golden/export/schizo_180.mp4-99999.jpg new file mode 100644 index 0000000..15f6245 Binary files /dev/null and b/testdata/golden/export/schizo_180.mp4-99999.jpg differ diff --git a/testdata/golden/export/schizo_270.mp4-5.jpg b/testdata/golden/export/schizo_270.mp4-5.jpg new file mode 100644 index 0000000..df3bd24 Binary files /dev/null and b/testdata/golden/export/schizo_270.mp4-5.jpg differ diff --git a/testdata/golden/export/schizo_270.mp4-9999.jpg b/testdata/golden/export/schizo_270.mp4-9999.jpg new file mode 100644 index 0000000..b367d33 Binary files /dev/null and b/testdata/golden/export/schizo_270.mp4-9999.jpg differ diff --git a/testdata/golden/export/schizo_270.mp4-99999.jpg b/testdata/golden/export/schizo_270.mp4-99999.jpg new file mode 100644 index 0000000..b367d33 Binary files /dev/null and b/testdata/golden/export/schizo_270.mp4-99999.jpg differ diff --git a/testdata/golden/export/schizo_90.mp4-5.jpg b/testdata/golden/export/schizo_90.mp4-5.jpg new file mode 100644 index 0000000..1f89843 Binary files /dev/null and b/testdata/golden/export/schizo_90.mp4-5.jpg differ diff --git a/testdata/golden/export/schizo_90.mp4-9999.jpg b/testdata/golden/export/schizo_90.mp4-9999.jpg new file mode 100644 index 0000000..e57f442 Binary files /dev/null and b/testdata/golden/export/schizo_90.mp4-9999.jpg differ diff --git a/testdata/golden/export/schizo_90.mp4-99999.jpg b/testdata/golden/export/schizo_90.mp4-99999.jpg new file mode 100644 index 0000000..e57f442 Binary files /dev/null and b/testdata/golden/export/schizo_90.mp4-99999.jpg differ diff --git a/testdata/golden/meta/alpha-webm.webm-5.meta.json b/testdata/golden/meta/alpha-webm.webm-5.meta.json new file mode 100644 index 0000000..73935a9 --- /dev/null +++ b/testdata/golden/meta/alpha-webm.webm-5.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"selected_frame":5,"has_video":true,"has_audio":false} \ No newline at end of file diff --git a/testdata/golden/meta/alpha-webm.webm-9999.meta.json b/testdata/golden/meta/alpha-webm.webm-9999.meta.json new file mode 100644 index 0000000..2852559 --- /dev/null +++ b/testdata/golden/meta/alpha-webm.webm-9999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"selected_frame":99,"has_video":true,"has_audio":false} \ No newline at end of file diff --git a/testdata/golden/meta/alpha-webm.webm-99999.meta.json b/testdata/golden/meta/alpha-webm.webm-99999.meta.json new file mode 100644 index 0000000..2852559 --- /dev/null +++ b/testdata/golden/meta/alpha-webm.webm-99999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"selected_frame":99,"has_video":true,"has_audio":false} \ No newline at end of file diff --git a/testdata/golden/meta/everybody-betray-me.mkv-5.meta.json b/testdata/golden/meta/everybody-betray-me.mkv-5.meta.json new file mode 100644 index 0000000..675574e --- /dev/null +++ b/testdata/golden/meta/everybody-betray-me.mkv-5.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/everybody-betray-me.mkv-9999.meta.json b/testdata/golden/meta/everybody-betray-me.mkv-9999.meta.json new file mode 100644 index 0000000..5695089 --- /dev/null +++ b/testdata/golden/meta/everybody-betray-me.mkv-9999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"selected_frame":99,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/everybody-betray-me.mkv-99999.meta.json b/testdata/golden/meta/everybody-betray-me.mkv-99999.meta.json new file mode 100644 index 0000000..5695089 --- /dev/null +++ b/testdata/golden/meta/everybody-betray-me.mkv-99999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"selected_frame":99,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/macabre.mp4-5.meta.json b/testdata/golden/meta/macabre.mp4-5.meta.json new file mode 100644 index 0000000..ceede88 --- /dev/null +++ b/testdata/golden/meta/macabre.mp4-5.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/macabre.mp4-9999.meta.json b/testdata/golden/meta/macabre.mp4-9999.meta.json new file mode 100644 index 0000000..4928db6 --- /dev/null +++ b/testdata/golden/meta/macabre.mp4-9999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"selected_frame":29,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/macabre.mp4-99999.meta.json b/testdata/golden/meta/macabre.mp4-99999.meta.json new file mode 100644 index 0000000..4928db6 --- /dev/null +++ b/testdata/golden/meta/macabre.mp4-99999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"selected_frame":29,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo.flv-5.meta.json b/testdata/golden/meta/schizo.flv-5.meta.json new file mode 100644 index 0000000..f8bd1cb --- /dev/null +++ b/testdata/golden/meta/schizo.flv-5.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":2560,"width":480,"height":360,"fps":26,"selected_frame":5,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo.flv-9999.meta.json b/testdata/golden/meta/schizo.flv-9999.meta.json new file mode 100644 index 0000000..4e6eb17 --- /dev/null +++ b/testdata/golden/meta/schizo.flv-9999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":2560,"width":480,"height":360,"fps":30,"selected_frame":75,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo.flv-99999.meta.json b/testdata/golden/meta/schizo.flv-99999.meta.json new file mode 100644 index 0000000..4e6eb17 --- /dev/null +++ b/testdata/golden/meta/schizo.flv-99999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":2560,"width":480,"height":360,"fps":30,"selected_frame":75,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_0.mp4-5.meta.json b/testdata/golden/meta/schizo_0.mp4-5.meta.json new file mode 100644 index 0000000..ddadd37 --- /dev/null +++ b/testdata/golden/meta/schizo_0.mp4-5.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_0.mp4-9999.meta.json b/testdata/golden/meta/schizo_0.mp4-9999.meta.json new file mode 100644 index 0000000..3395de4 --- /dev/null +++ b/testdata/golden/meta/schizo_0.mp4-9999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_0.mp4-99999.meta.json b/testdata/golden/meta/schizo_0.mp4-99999.meta.json new file mode 100644 index 0000000..3395de4 --- /dev/null +++ b/testdata/golden/meta/schizo_0.mp4-99999.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_180.mp4-5.meta.json b/testdata/golden/meta/schizo_180.mp4-5.meta.json new file mode 100644 index 0000000..af41320 --- /dev/null +++ b/testdata/golden/meta/schizo_180.mp4-5.meta.json @@ -0,0 +1 @@ +{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_180.mp4-9999.meta.json b/testdata/golden/meta/schizo_180.mp4-9999.meta.json new file mode 100644 index 0000000..894950c --- /dev/null +++ b/testdata/golden/meta/schizo_180.mp4-9999.meta.json @@ -0,0 +1 @@ +{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_180.mp4-99999.meta.json b/testdata/golden/meta/schizo_180.mp4-99999.meta.json new file mode 100644 index 0000000..894950c --- /dev/null +++ b/testdata/golden/meta/schizo_180.mp4-99999.meta.json @@ -0,0 +1 @@ +{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_270.mp4-5.meta.json b/testdata/golden/meta/schizo_270.mp4-5.meta.json new file mode 100644 index 0000000..6e0ff6a --- /dev/null +++ b/testdata/golden/meta/schizo_270.mp4-5.meta.json @@ -0,0 +1 @@ +{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_270.mp4-9999.meta.json b/testdata/golden/meta/schizo_270.mp4-9999.meta.json new file mode 100644 index 0000000..d37673a --- /dev/null +++ b/testdata/golden/meta/schizo_270.mp4-9999.meta.json @@ -0,0 +1 @@ +{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_270.mp4-99999.meta.json b/testdata/golden/meta/schizo_270.mp4-99999.meta.json new file mode 100644 index 0000000..d37673a --- /dev/null +++ b/testdata/golden/meta/schizo_270.mp4-99999.meta.json @@ -0,0 +1 @@ +{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_90.mp4-5.meta.json b/testdata/golden/meta/schizo_90.mp4-5.meta.json new file mode 100644 index 0000000..e36f985 --- /dev/null +++ b/testdata/golden/meta/schizo_90.mp4-5.meta.json @@ -0,0 +1 @@ +{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":5,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_90.mp4-9999.meta.json b/testdata/golden/meta/schizo_90.mp4-9999.meta.json new file mode 100644 index 0000000..a2aff40 --- /dev/null +++ b/testdata/golden/meta/schizo_90.mp4-9999.meta.json @@ -0,0 +1 @@ +{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_90.mp4-99999.meta.json b/testdata/golden/meta/schizo_90.mp4-99999.meta.json new file mode 100644 index 0000000..a2aff40 --- /dev/null +++ b/testdata/golden/meta/schizo_90.mp4-99999.meta.json @@ -0,0 +1 @@ +{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":19,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/result/fit-in/100x100/filters%3Aframe%283%29/everybody-betray-me.mkv b/testdata/golden/result/fit-in/100x100/filters%3Aframe%283%29/everybody-betray-me.mkv new file mode 100644 index 0000000..1f2130d Binary files /dev/null and b/testdata/golden/result/fit-in/100x100/filters%3Aframe%283%29/everybody-betray-me.mkv differ diff --git a/testdata/golden/result/fit-in/100x100/filters%3Aframe%2899999%29/everybody-betray-me.mkv b/testdata/golden/result/fit-in/100x100/filters%3Aframe%2899999%29/everybody-betray-me.mkv new file mode 100644 index 0000000..17aa710 Binary files /dev/null and b/testdata/golden/result/fit-in/100x100/filters%3Aframe%2899999%29/everybody-betray-me.mkv differ