diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 9b8e818..6249b58 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -84,9 +84,9 @@ func LoadAVContext(ctx context.Context, reader io.Reader, size int64) (*AVContex return av, nil } -func (av *AVContext) ProcessFrames() (err error) { +func (av *AVContext) ProcessFrames(maxFrames int) (err error) { if av.thumbContext == nil { - return createThumbContext(av) + return createThumbContext(av, C.int(maxFrames)) } return } @@ -101,7 +101,7 @@ func (av *AVContext) SelectFrame(n int) (err error) { } func (av *AVContext) Export(bands int) (buf []byte, err error) { - if err = av.ProcessFrames(); err != nil { + if err = av.ProcessFrames(-1); err != nil { return } if bands < 3 || bands > 4 { @@ -245,7 +245,7 @@ func populateHistogram(av *AVContext, frames <-chan *C.AVFrame) <-chan struct{} return done } -func createThumbContext(av *AVContext) error { +func createThumbContext(av *AVContext, maxFrames C.int) error { pkt := C.create_packet() var frame *C.AVFrame err := C.obtain_next_frame(av.formatContext, av.codecContext, av.stream.index, &pkt, &frame) @@ -266,6 +266,9 @@ func createThumbContext(av *AVContext) error { return avError(err) } n := av.thumbContext.max_frames + if maxFrames > 0 && n > maxFrames { + n = maxFrames + } if av.selectedIndex > -1 && n > av.selectedIndex+1 { n = av.selectedIndex + 1 } diff --git a/ffmpeg/ffmpeg_test.go b/ffmpeg/ffmpeg_test.go index 00d1335..45b0571 100644 --- a/ffmpeg/ffmpeg_test.go +++ b/ffmpeg/ffmpeg_test.go @@ -48,7 +48,7 @@ func TestAVContext(t *testing.T) { require.NoError(t, os.MkdirAll(baseDir+"golden/export", 0755)) t.Parallel() for _, filename := range files { - for _, frame := range []int{-1, 5, 9999, 99999} { + for _, frame := range []int{-1, 5, 10, 9999, 99999} { name := filename if frame > -1 { name = fmt.Sprintf("%s-%d", filename, frame) @@ -63,14 +63,18 @@ func TestAVContext(t *testing.T) { 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()) + if frame == 10 { + require.NoError(t, av.ProcessFrames(frame)) + } else { + if frame == 9999 { + require.NoError(t, av.ProcessFrames(-1)) + } + if frame > -1 { + require.NoError(t, av.SelectFrame(frame)) + } + if frame != 9999 { + require.NoError(t, av.ProcessFrames(-1)) + } } meta := av.Metadata() metaBuf, err := json.Marshal(meta) diff --git a/processor.go b/processor.go index 61e4c53..c37f416 100644 --- a/processor.go +++ b/processor.go @@ -124,8 +124,9 @@ func (p *Processor) Process(ctx context.Context, in *imagor.Blob, params imagorp bands = 4 } } - case "process_frames": - if err = av.ProcessFrames(); err != nil { + case "max_frames": + n, _ := strconv.Atoi(filter.Args) + if err = av.ProcessFrames(n); err != nil { return } case "frame": diff --git a/processor_test.go b/processor_test.go index 7ebee6d..e088d74 100644 --- a/processor_test.go +++ b/processor_test.go @@ -43,15 +43,17 @@ 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 max_frames", path: "fit-in/100x100/filters:max_frames(6)/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 max_frames", path: "meta/filters:max_frames()/everybody-betray-me.mkv"}, + {name: "mkv meta max_frames 6", path: "meta/filters:max_frames(6)/everybody-betray-me.mkv"}, {name: "mkv meta", path: "meta/everybody-betray-me.mkv"}, {name: "mp4", path: "200x100/schizo_0.mp4"}, {name: "mp4 orient 90", path: "220x100/schizo_90.mp4"}, {name: "mp4 orient 180", path: "200x100/schizo_180.mp4"}, {name: "mp4 orient 270", path: "200x100/schizo_270.mp4"}, {name: "image", path: "fit-in/100x100/demo.png"}, - {name: "alpha", path: "fit-in/filters:format(webp)/alpha-webm.webm"}, + {name: "alpha", path: "fit-in/filters:format(png)/alpha-webm.webm"}, {name: "corrupted", path: "fit-in/100x100/corrupt/everybody-betray-me.mkv", expectCode: 406}, }, WithDebug(true), WithLogger(zap.NewExample())) doGoldenTests(t, filepath.Join(testDataDir, "golden/result-fallback-image"), []test{ diff --git a/testdata/golden/export/alpha-webm.webm-10.jpg b/testdata/golden/export/alpha-webm.webm-10.jpg new file mode 100644 index 0000000..620e1b2 Binary files /dev/null and b/testdata/golden/export/alpha-webm.webm-10.jpg differ diff --git a/testdata/golden/export/everybody-betray-me.mkv-10.jpg b/testdata/golden/export/everybody-betray-me.mkv-10.jpg new file mode 100644 index 0000000..62127fd Binary files /dev/null and b/testdata/golden/export/everybody-betray-me.mkv-10.jpg differ diff --git a/testdata/golden/export/macabre.mp4-10.jpg b/testdata/golden/export/macabre.mp4-10.jpg new file mode 100644 index 0000000..dbe27e7 Binary files /dev/null and b/testdata/golden/export/macabre.mp4-10.jpg differ diff --git a/testdata/golden/export/schizo.flv-10.jpg b/testdata/golden/export/schizo.flv-10.jpg new file mode 100644 index 0000000..fb1d4da Binary files /dev/null and b/testdata/golden/export/schizo.flv-10.jpg differ diff --git a/testdata/golden/export/schizo_0.mp4-10.jpg b/testdata/golden/export/schizo_0.mp4-10.jpg new file mode 100644 index 0000000..fcccf00 Binary files /dev/null and b/testdata/golden/export/schizo_0.mp4-10.jpg differ diff --git a/testdata/golden/export/schizo_180.mp4-10.jpg b/testdata/golden/export/schizo_180.mp4-10.jpg new file mode 100644 index 0000000..fe011e5 Binary files /dev/null and b/testdata/golden/export/schizo_180.mp4-10.jpg differ diff --git a/testdata/golden/export/schizo_270.mp4-10.jpg b/testdata/golden/export/schizo_270.mp4-10.jpg new file mode 100644 index 0000000..996cc9e Binary files /dev/null and b/testdata/golden/export/schizo_270.mp4-10.jpg differ diff --git a/testdata/golden/export/schizo_90.mp4-10.jpg b/testdata/golden/export/schizo_90.mp4-10.jpg new file mode 100644 index 0000000..6e8c781 Binary files /dev/null and b/testdata/golden/export/schizo_90.mp4-10.jpg differ diff --git a/testdata/golden/meta/alpha-webm.webm-10.meta.json b/testdata/golden/meta/alpha-webm.webm-10.meta.json new file mode 100644 index 0000000..4beb8d9 --- /dev/null +++ b/testdata/golden/meta/alpha-webm.webm-10.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"selected_frame":4,"has_video":true,"has_audio":false} \ No newline at end of file diff --git a/testdata/golden/meta/everybody-betray-me.mkv-10.meta.json b/testdata/golden/meta/everybody-betray-me.mkv-10.meta.json new file mode 100644 index 0000000..675574e --- /dev/null +++ b/testdata/golden/meta/everybody-betray-me.mkv-10.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/macabre.mp4-10.meta.json b/testdata/golden/meta/macabre.mp4-10.meta.json new file mode 100644 index 0000000..299780e --- /dev/null +++ b/testdata/golden/meta/macabre.mp4-10.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"selected_frame":4,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo.flv-10.meta.json b/testdata/golden/meta/schizo.flv-10.meta.json new file mode 100644 index 0000000..d8f93f3 --- /dev/null +++ b/testdata/golden/meta/schizo.flv-10.meta.json @@ -0,0 +1 @@ +{"orientation":1,"duration":2560,"width":480,"height":360,"fps":28,"selected_frame":5,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_0.mp4-10.meta.json b/testdata/golden/meta/schizo_0.mp4-10.meta.json new file mode 100644 index 0000000..ddadd37 --- /dev/null +++ b/testdata/golden/meta/schizo_0.mp4-10.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_180.mp4-10.meta.json b/testdata/golden/meta/schizo_180.mp4-10.meta.json new file mode 100644 index 0000000..6cc8eba --- /dev/null +++ b/testdata/golden/meta/schizo_180.mp4-10.meta.json @@ -0,0 +1 @@ +{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"selected_frame":4,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_270.mp4-10.meta.json b/testdata/golden/meta/schizo_270.mp4-10.meta.json new file mode 100644 index 0000000..4dc5a35 --- /dev/null +++ b/testdata/golden/meta/schizo_270.mp4-10.meta.json @@ -0,0 +1 @@ +{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":6,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/meta/schizo_90.mp4-10.meta.json b/testdata/golden/meta/schizo_90.mp4-10.meta.json new file mode 100644 index 0000000..bc271cf --- /dev/null +++ b/testdata/golden/meta/schizo_90.mp4-10.meta.json @@ -0,0 +1 @@ +{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"selected_frame":7,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/result/fit-in/100x100/filters%3Amax_frames%286%29/everybody-betray-me.mkv b/testdata/golden/result/fit-in/100x100/filters%3Amax_frames%286%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%3Amax_frames%286%29/everybody-betray-me.mkv differ diff --git a/testdata/golden/result/fit-in/filters%3Aformat%28png%29/alpha-webm.webm b/testdata/golden/result/fit-in/filters%3Aformat%28png%29/alpha-webm.webm new file mode 100644 index 0000000..5fdde77 Binary files /dev/null and b/testdata/golden/result/fit-in/filters%3Aformat%28png%29/alpha-webm.webm differ diff --git a/testdata/golden/result/fit-in/filters%3Aformat%28webp%29/alpha-webm.webm b/testdata/golden/result/fit-in/filters%3Aformat%28webp%29/alpha-webm.webm deleted file mode 100644 index 5809100..0000000 Binary files a/testdata/golden/result/fit-in/filters%3Aformat%28webp%29/alpha-webm.webm and /dev/null differ diff --git a/testdata/golden/result/meta/filters%3Aprocess_frames%28%29/everybody-betray-me.mkv b/testdata/golden/result/meta/filters%3Amax_frames%28%29/everybody-betray-me.mkv similarity index 100% rename from testdata/golden/result/meta/filters%3Aprocess_frames%28%29/everybody-betray-me.mkv rename to testdata/golden/result/meta/filters%3Amax_frames%28%29/everybody-betray-me.mkv diff --git a/testdata/golden/result/meta/filters%3Amax_frames%286%29/everybody-betray-me.mkv b/testdata/golden/result/meta/filters%3Amax_frames%286%29/everybody-betray-me.mkv new file mode 100644 index 0000000..9f69103 --- /dev/null +++ b/testdata/golden/result/meta/filters%3Amax_frames%286%29/everybody-betray-me.mkv @@ -0,0 +1 @@ +{"format":"mkv","content_type":"video/x-matroska","orientation":1,"duration":7407,"width":640,"height":480,"fps":30,"selected_frame":3,"has_video":true,"has_audio":true} \ No newline at end of file