diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 18cbea7..ddf9608 100644 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -41,6 +41,7 @@ type AVContext struct { codecContext *C.AVCodecContext thumbContext *C.ThumbContext selectedIndex C.int + selectedDuration time.Duration frame *C.AVFrame durationInFormat bool orientation int @@ -109,15 +110,7 @@ func (av *AVContext) SelectDuration(ts time.Duration) (err error) { return } } - return av.SelectFrame(1) -} - -func (av *AVContext) SeekPosition(f float64) (err error) { - return av.SeekDuration(av.positionToDuration(f)) -} - -func (av *AVContext) SeekDuration(ts time.Duration) (err error) { - return seekDuration(av, ts) + return av.ProcessFrames(-1) } func (av *AVContext) Export(bands int) (buf []byte, err error) { @@ -234,6 +227,7 @@ func createDecoder(av *AVContext) error { } func seekDuration(av *AVContext, ts time.Duration) error { + av.selectedDuration = ts tts := C.int64_t(ts.Milliseconds()) * C.AV_TIME_BASE / 1000 err := C.av_seek_frame(av.formatContext, C.int(-1), tts, C.AVSEEK_FLAG_BACKWARD) C.avcodec_flush_buffers(av.codecContext) @@ -249,6 +243,9 @@ func incrementDuration(av *AVContext, frame *C.AVFrame, i C.int) { ptsToNano := C.int64_t(1000000000 * av.stream.time_base.num / av.stream.time_base.den) newDuration := time.Duration(frame.pts * ptsToNano) av.availableDuration = newDuration + if av.selectedDuration > 0 && i > 0 && newDuration <= av.selectedDuration { + av.selectedIndex = i + } if !av.durationInFormat && newDuration > av.duration { av.duration = newDuration } @@ -304,6 +301,9 @@ func createThumbContext(av *AVContext, maxFrames C.int) error { if av.selectedIndex > -1 && n > av.selectedIndex+1 { n = av.selectedIndex + 1 } + if av.selectedDuration > 0 && av.selectedIndex < 0 { + av.selectedIndex = 0 + } frames := make(chan *C.AVFrame, n) done := populateFrames(av, frames) frames <- frame diff --git a/ffmpeg/ffmpeg_test.go b/ffmpeg/ffmpeg_test.go index 1a23247..49f2f6c 100644 --- a/ffmpeg/ffmpeg_test.go +++ b/ffmpeg/ffmpeg_test.go @@ -13,6 +13,7 @@ import ( "reflect" "strings" "testing" + "time" ) var files = []string{ @@ -71,7 +72,7 @@ func TestAVContext(t *testing.T) { if n == 10 { require.NoError(t, av.ProcessFrames(n)) } else if n == 99999 { - require.NoError(t, av.SeekPosition(0.6)) + require.NoError(t, av.SelectDuration(time.Millisecond*500)) } else if n == 9999 { require.NoError(t, av.SelectPosition(0.7)) } else if n > -1 { diff --git a/processor.go b/processor.go index 8b7cc29..a52831c 100644 --- a/processor.go +++ b/processor.go @@ -125,16 +125,6 @@ func (p *Processor) Process(ctx context.Context, in *imagor.Blob, params imagorp bands = 4 } } - case "seek": - if ts, e := time.ParseDuration(filter.Args); e == nil { - if err = av.SeekDuration(ts); err != nil { - return - } - } else if f, e := strconv.ParseFloat(filter.Args, 64); e == nil { - if err = av.SeekPosition(f); err != nil { - return - } - } case "frame": if ts, e := time.ParseDuration(filter.Args); e == nil { if err = av.SelectDuration(ts); err != nil { diff --git a/processor_test.go b/processor_test.go index 9e91531..0f21c0b 100644 --- a/processor_test.go +++ b/processor_test.go @@ -57,8 +57,6 @@ func TestProcessor(t *testing.T) { {name: "alpha", path: "fit-in/filters:format(png)/alpha-webm.webm"}, {name: "alpha frame duration", path: "500x/filters:frame(5s):format(png)/alpha-webm.webm", sizeOnly: true}, {name: "alpha frame position", path: "500x/filters:frame(0.5):format(png)/alpha-webm.webm", sizeOnly: true}, - {name: "alpha seek duration", path: "500x/filters:seek(5s):format(png)/alpha-webm.webm", sizeOnly: true}, - {name: "alpha seek position", path: "500x/filters:seek(0.5):format(png)/alpha-webm.webm", sizeOnly: true}, {name: "corrupted", path: "fit-in/100x100/corrupt/everybody-betray-me.mkv", expectCode: 406}, {name: "no cover meta", path: "meta/no_cover.mp3"}, {name: "no cover 406", path: "fit-in/100x100/no_cover.mp3", expectCode: 406}, diff --git a/testdata/golden/export/alpha-webm.webm-9999.jpg b/testdata/golden/export/alpha-webm.webm-9999.jpg index 68e790b..c97a86f 100644 Binary files a/testdata/golden/export/alpha-webm.webm-9999.jpg 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 index 3312405..c47ec3d 100644 Binary files a/testdata/golden/export/alpha-webm.webm-99999.jpg and b/testdata/golden/export/alpha-webm.webm-99999.jpg differ diff --git a/testdata/golden/export/everybody-betray-me.mkv-9999.jpg b/testdata/golden/export/everybody-betray-me.mkv-9999.jpg index 76cd84c..45a2a70 100644 Binary files a/testdata/golden/export/everybody-betray-me.mkv-9999.jpg 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 index bb35fbb..c0d4dd1 100644 Binary files a/testdata/golden/export/everybody-betray-me.mkv-99999.jpg and b/testdata/golden/export/everybody-betray-me.mkv-99999.jpg differ diff --git a/testdata/golden/export/macabre.mp4-9999.jpg b/testdata/golden/export/macabre.mp4-9999.jpg index d1ab9d8..59f5451 100644 Binary files a/testdata/golden/export/macabre.mp4-9999.jpg 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 index 4b4a16d..3125a1c 100644 Binary files a/testdata/golden/export/macabre.mp4-99999.jpg and b/testdata/golden/export/macabre.mp4-99999.jpg differ diff --git a/testdata/golden/export/schizo.flv-9999.jpg b/testdata/golden/export/schizo.flv-9999.jpg index a543ab0..5d21aa1 100644 Binary files a/testdata/golden/export/schizo.flv-9999.jpg 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 index 895b026..fc32c8b 100644 Binary files a/testdata/golden/export/schizo.flv-99999.jpg and b/testdata/golden/export/schizo.flv-99999.jpg differ diff --git a/testdata/golden/export/schizo_0.mp4-9999.jpg b/testdata/golden/export/schizo_0.mp4-9999.jpg index 9d49888..935ab8e 100644 Binary files a/testdata/golden/export/schizo_0.mp4-9999.jpg 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 index bde6e23..e3e8a55 100644 Binary files a/testdata/golden/export/schizo_0.mp4-99999.jpg and b/testdata/golden/export/schizo_0.mp4-99999.jpg differ diff --git a/testdata/golden/export/schizo_180.mp4-9999.jpg b/testdata/golden/export/schizo_180.mp4-9999.jpg index df99457..15f6245 100644 Binary files a/testdata/golden/export/schizo_180.mp4-9999.jpg 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 index de2ac07..a3f6b52 100644 Binary files a/testdata/golden/export/schizo_180.mp4-99999.jpg and b/testdata/golden/export/schizo_180.mp4-99999.jpg differ diff --git a/testdata/golden/export/schizo_270.mp4-9999.jpg b/testdata/golden/export/schizo_270.mp4-9999.jpg index 8f2ada3..b367d33 100644 Binary files a/testdata/golden/export/schizo_270.mp4-9999.jpg 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 index 8ac4052..76acd37 100644 Binary files a/testdata/golden/export/schizo_270.mp4-99999.jpg and b/testdata/golden/export/schizo_270.mp4-99999.jpg differ diff --git a/testdata/golden/export/schizo_90.mp4-9999.jpg b/testdata/golden/export/schizo_90.mp4-9999.jpg index 3ef8b0c..e57f442 100644 Binary files a/testdata/golden/export/schizo_90.mp4-9999.jpg 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 index 6a96a5f..2efdfe6 100644 Binary files a/testdata/golden/export/schizo_90.mp4-99999.jpg and b/testdata/golden/export/schizo_90.mp4-99999.jpg differ diff --git a/testdata/golden/meta/alpha-webm.webm-9999.meta.json b/testdata/golden/meta/alpha-webm.webm-9999.meta.json index 357c63c..5e0f7c9 100644 --- a/testdata/golden/meta/alpha-webm.webm-9999.meta.json +++ b/testdata/golden/meta/alpha-webm.webm-9999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":12040,"width":720,"height":576,"has_video":true,"has_audio":false} \ No newline at end of file +{"orientation":1,"duration":12040,"width":720,"height":576,"fps":10.9,"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 index 357c63c..e45c027 100644 --- a/testdata/golden/meta/alpha-webm.webm-99999.meta.json +++ b/testdata/golden/meta/alpha-webm.webm-99999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":12040,"width":720,"height":576,"has_video":true,"has_audio":false} \ No newline at end of file +{"orientation":1,"duration":12040,"width":720,"height":576,"fps":25,"has_video":true,"has_audio":false} \ 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 index 07cc731..1c39096 100644 --- a/testdata/golden/meta/everybody-betray-me.mkv-9999.meta.json +++ b/testdata/golden/meta/everybody-betray-me.mkv-9999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":7407,"width":640,"height":480,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":1,"duration":7407,"width":640,"height":480,"fps":9.3,"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 index 07cc731..0aaf0af 100644 --- a/testdata/golden/meta/everybody-betray-me.mkv-99999.meta.json +++ b/testdata/golden/meta/everybody-betray-me.mkv-99999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":7407,"width":640,"height":480,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":1,"duration":7407,"width":640,"height":480,"fps":26.3,"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 index e247d01..419bf8d 100644 --- a/testdata/golden/meta/macabre.mp4-9999.meta.json +++ b/testdata/golden/meta/macabre.mp4-9999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":3925,"width":492,"height":360,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"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 index e247d01..419bf8d 100644 --- a/testdata/golden/meta/macabre.mp4-99999.meta.json +++ b/testdata/golden/meta/macabre.mp4-99999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":3925,"width":492,"height":360,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":1,"duration":3925,"width":492,"height":360,"fps":30,"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 index 62d3cfb..15bf618 100644 --- a/testdata/golden/meta/schizo.flv-9999.meta.json +++ b/testdata/golden/meta/schizo.flv-9999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":2560,"width":480,"height":360,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.7,"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 index 62d3cfb..15bf618 100644 --- a/testdata/golden/meta/schizo.flv-99999.meta.json +++ b/testdata/golden/meta/schizo.flv-99999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":2560,"width":480,"height":360,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":1,"duration":2560,"width":480,"height":360,"fps":29.7,"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 index 39438cd..3dda84e 100644 --- a/testdata/golden/meta/schizo_0.mp4-9999.meta.json +++ b/testdata/golden/meta/schizo_0.mp4-9999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":2544,"width":480,"height":360,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"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 index 39438cd..3dda84e 100644 --- a/testdata/golden/meta/schizo_0.mp4-99999.meta.json +++ b/testdata/golden/meta/schizo_0.mp4-99999.meta.json @@ -1 +1 @@ -{"orientation":1,"duration":2544,"width":480,"height":360,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":1,"duration":2544,"width":480,"height":360,"fps":30,"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 index 66e5afd..f992f3e 100644 --- a/testdata/golden/meta/schizo_180.mp4-9999.meta.json +++ b/testdata/golden/meta/schizo_180.mp4-9999.meta.json @@ -1 +1 @@ -{"orientation":3,"duration":2544,"width":480,"height":360,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"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 index 66e5afd..f992f3e 100644 --- a/testdata/golden/meta/schizo_180.mp4-99999.meta.json +++ b/testdata/golden/meta/schizo_180.mp4-99999.meta.json @@ -1 +1 @@ -{"orientation":3,"duration":2544,"width":480,"height":360,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":3,"duration":2544,"width":480,"height":360,"fps":30,"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 index 14ea544..10bc562 100644 --- a/testdata/golden/meta/schizo_270.mp4-9999.meta.json +++ b/testdata/golden/meta/schizo_270.mp4-9999.meta.json @@ -1 +1 @@ -{"orientation":6,"duration":2544,"width":360,"height":480,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"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 index 14ea544..10bc562 100644 --- a/testdata/golden/meta/schizo_270.mp4-99999.meta.json +++ b/testdata/golden/meta/schizo_270.mp4-99999.meta.json @@ -1 +1 @@ -{"orientation":6,"duration":2544,"width":360,"height":480,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":6,"duration":2544,"width":360,"height":480,"fps":30,"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 index 7216654..ee3a3aa 100644 --- a/testdata/golden/meta/schizo_90.mp4-9999.meta.json +++ b/testdata/golden/meta/schizo_90.mp4-9999.meta.json @@ -1 +1 @@ -{"orientation":8,"duration":2544,"width":360,"height":480,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"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 index 7216654..ee3a3aa 100644 --- a/testdata/golden/meta/schizo_90.mp4-99999.meta.json +++ b/testdata/golden/meta/schizo_90.mp4-99999.meta.json @@ -1 +1 @@ -{"orientation":8,"duration":2544,"width":360,"height":480,"has_video":true,"has_audio":true} \ No newline at end of file +{"orientation":8,"duration":2544,"width":360,"height":480,"fps":30,"has_video":true,"has_audio":true} \ No newline at end of file diff --git a/testdata/golden/result/500x/filters%3Aseek%280.5%29%3Aformat%28png%29/alpha-webm.webm b/testdata/golden/result/500x/filters%3Aseek%280.5%29%3Aformat%28png%29/alpha-webm.webm deleted file mode 100644 index 94ef2fb..0000000 Binary files a/testdata/golden/result/500x/filters%3Aseek%280.5%29%3Aformat%28png%29/alpha-webm.webm and /dev/null differ diff --git a/testdata/golden/result/500x/filters%3Aseek%285s%29%3Aformat%28png%29/alpha-webm.webm b/testdata/golden/result/500x/filters%3Aseek%285s%29%3Aformat%28png%29/alpha-webm.webm deleted file mode 100644 index 8f039c9..0000000 Binary files a/testdata/golden/result/500x/filters%3Aseek%285s%29%3Aformat%28png%29/alpha-webm.webm and /dev/null differ