github.com/bluenviron/mediacommon@v1.9.3/pkg/formats/mpegts/buffered_reader.go (about) 1 package mpegts 2 3 import ( 4 "fmt" 5 "io" 6 ) 7 8 // BufferedReader is a buffered reader optimized for MPEG-TS. 9 type BufferedReader struct { 10 r io.Reader 11 midbuf []byte 12 midbufpos int 13 } 14 15 // NewBufferedReader allocates a BufferedReader. 16 func NewBufferedReader(r io.Reader) *BufferedReader { 17 return &BufferedReader{ 18 r: r, 19 midbuf: make([]byte, 0, 1500), 20 } 21 } 22 23 // Read implements io.Reader. 24 func (r *BufferedReader) Read(p []byte) (int, error) { 25 if r.midbufpos < len(r.midbuf) { 26 n := copy(p, r.midbuf[r.midbufpos:]) 27 r.midbufpos += n 28 return n, nil 29 } 30 31 mn, err := r.r.Read(r.midbuf[:cap(r.midbuf)]) 32 if err != nil { 33 return 0, err 34 } 35 36 if (mn % 188) != 0 { 37 return 0, fmt.Errorf("received packet with size %d not multiple of 188", mn) 38 } 39 40 r.midbuf = r.midbuf[:mn] 41 n := copy(p, r.midbuf) 42 r.midbufpos = n 43 return n, nil 44 }