/
main.go
84 lines (66 loc) · 1.61 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package main
import (
"fmt"
"github.com/andlabs/ui"
"image"
"image/draw"
"time"
)
var w ui.Window
func initUI() {
button := ui.NewButton("Load")
button.OnClicked(func() {
ui.OpenFile(w, func(filename string) {
go renderPreview(filename)
})
})
stack := ui.NewVerticalStack(button)
w = ui.NewWindow("Video", 800, 600, stack)
w.OnClosing(func() bool {
ui.Stop()
return true
})
w.Show()
}
type imageArea image.RGBA
func (img *imageArea) Paint(rect image.Rectangle) *image.RGBA {
return (*image.RGBA)(img).SubImage(rect).(*image.RGBA)
}
func (*imageArea) Mouse(ui.MouseEvent) { return }
func (*imageArea) Key(ui.KeyEvent) (handled bool) { return }
var w2 ui.Window
func showPreview(img *image.RGBA) {
w2 = ui.NewWindow("Stuff", img.Bounds().Dx(), img.Bounds().Dy(), ui.NewArea(img.Bounds().Dx(), img.Bounds().Dy(), (*imageArea)(img)))
w2.OnClosing(func() bool {
ui.Stop()
return true
})
w2.Show()
}
func renderPreview(filename string) {
data, err := Probe(filename)
if err != nil {
panic(err)
}
d := data.Format.Duration()
const PreviewSize = 128
canvas := image.NewRGBA(image.Rect(0, 0, int(PreviewSize*d/time.Second), PreviewSize))
for x := canvas.Bounds().Min.X; x < canvas.Bounds().Max.X; {
img, err := Frame(filename, time.Duration(x)*time.Second/PreviewSize, "-vf", fmt.Sprintf("scale=-1:%d", PreviewSize))
if err != nil {
break
}
draw.Draw(canvas, img.Bounds().Add(image.Point{x, 0}), img, image.ZP, draw.Src)
x += img.Bounds().Dx()
}
go ui.Do(func() {
showPreview(canvas)
})
}
func main() {
go ui.Do(initUI)
err := ui.Go()
if err != nil {
panic(err)
}
}