33package pic2ascii
44
55import (
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
1817var iotoken = "mem://video"
1918
2019// 兼容 github.com/nareix/joy4 一个强制断言的 bug
20+
2121type 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
2771func 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