Skip to content

Commit 6c0dd4c

Browse files
committed
video seek buffer
1 parent f5a2658 commit 6c0dd4c

File tree

1 file changed

+49
-10
lines changed

1 file changed

+49
-10
lines changed

video_slice.go

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
package pic2ascii
44

55
import (
6-
"bytes"
6+
"errors"
77
"image"
88
"io"
9-
"io/ioutil"
109
"time"
1110

1211
"github.com/nareix/joy4/av/avutil"
@@ -18,26 +17,67 @@ var rc io.Reader
1817
var iotoken = "mem://video"
1918

2019
// 兼容 github.com/nareix/joy4 一个强制断言的 bug
20+
2121
type noper struct {
22-
io.ReadSeeker
22+
r io.Reader
23+
s []byte
24+
i int64
25+
}
26+
27+
func (r *noper) sycn(i int) (int64, error) {
28+
return io.CopyN(r, r.r, int64(i))
29+
}
30+
31+
func (r *noper) Write(p []byte) (n int, err error) {
32+
r.s = append(r.s, p...)
33+
return len(p), nil
34+
}
35+
36+
func (r *noper) Read(b []byte) (n int, err error) {
37+
if r.i >= int64(len(r.s)) {
38+
if i, _ := r.sycn(1024 * 10); i != 0 {
39+
return r.Read(b)
40+
}
41+
return 0, io.EOF
42+
}
43+
n = copy(b, r.s[r.i:])
44+
r.i += int64(n)
45+
return
46+
}
47+
48+
func (r *noper) Seek(offset int64, whence int) (int64, error) {
49+
var abs int64
50+
switch whence {
51+
case io.SeekStart:
52+
abs = offset
53+
case io.SeekCurrent:
54+
abs = r.i + offset
55+
// case io.SeekEnd:
56+
// abs = int64(len(r.s)) + offset
57+
default:
58+
return 0, errors.New("pic2ascii.noper.Seek: invalid whence")
59+
}
60+
if abs < 0 {
61+
return 0, errors.New("pic2ascii.noper.Seek: negative position")
62+
}
63+
r.i = abs
64+
return abs, nil
2365
}
2466

25-
func (noper) Close() error { return nil }
67+
func (r *noper) Close() error { return nil }
68+
69+
func newNoper(r io.Reader) *noper { return &noper{r, nil, 0} }
2670

2771
func init() {
2872
avutil.DefaultHandlers.Add(func(r *avutil.RegisterHandler) {
2973
r.UrlReader = func(f string) (bool, io.ReadCloser, error) {
3074
if f != iotoken {
3175
return false, nil, nil
3276
}
33-
data, err := ioutil.ReadAll(rc)
34-
if err != nil {
35-
return false, nil, err
36-
}
3777

3878
if rc0 := rc; rc0 != nil {
3979
rc = nil
40-
return true, noper{bytes.NewReader(data)}, nil
80+
return true, newNoper(rc0), nil
4181
}
4282
return false, nil, nil
4383
}
@@ -72,7 +112,6 @@ func VideoSlice(read io.Reader, f func(time.Duration, image.Image)) error {
72112
}
73113
}
74114

75-
// buf := bytes.NewBuffer(nil)
76115
for {
77116
pkt, err := file.ReadPacket()
78117
if err != nil {

0 commit comments

Comments
 (0)