scanner.go (1064B)
1 package mpegts 2 3 import ( 4 "errors" 5 "fmt" 6 "io" 7 ) 8 9 type Scanner struct { 10 buf []byte 11 rd io.Reader 12 packet *Packet 13 err error 14 } 15 16 func NewScanner(rd io.Reader) *Scanner { 17 return &Scanner{ 18 buf: make([]byte, PacketSize, PacketSize), 19 rd: rd, 20 } 21 } 22 23 func (sc *Scanner) Err() error { return sc.err } 24 25 func (sc *Scanner) Packet() *Packet { return sc.packet } 26 27 func (sc *Scanner) Scan() bool { 28 n, err := sc.rd.Read(sc.buf) 29 if n < PacketSize { 30 if errors.Is(err, io.EOF) && n == 0 { 31 return false 32 } else if err != nil { 33 sc.err = fmt.Errorf("short read (%d bytes): %w", n, err) 34 } else { 35 sc.err = fmt.Errorf("short read: read %d bytes", n) 36 } 37 return false 38 } 39 if errors.Is(err, io.EOF) && n == PacketSize { 40 return false 41 } else if errors.Is(err, io.EOF) && n == 0 { 42 return false 43 } else if err != nil { 44 sc.err = err 45 return false 46 } 47 if n == PacketSize { 48 p := new(Packet) 49 if err := Unmarshal(sc.buf, p); err != nil { 50 sc.err = fmt.Errorf("unmarshal: %w", err) 51 return false 52 } 53 sc.packet = p 54 return true 55 } 56 return false 57 }