streaming

Media streaming and broadcast systems in Go
Log | Files | Refs | README | LICENSE

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 }