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  }