golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
824 B
43 lines
824 B
package core |
|
|
|
import ( |
|
"fmt" |
|
"io" |
|
) |
|
|
|
// mpegtsBufferedReader is a buffered reader optimized for MPEG-TS. |
|
type mpegtsBufferedReader struct { |
|
r io.Reader |
|
midbuf []byte |
|
midbufpos int |
|
} |
|
|
|
func newMPEGTSBufferedReader(r io.Reader) *mpegtsBufferedReader { |
|
return &mpegtsBufferedReader{ |
|
r: r, |
|
midbuf: make([]byte, 0, 1500), |
|
} |
|
} |
|
|
|
// Read implements io.Reader. |
|
func (r *mpegtsBufferedReader) Read(p []byte) (int, error) { |
|
if r.midbufpos < len(r.midbuf) { |
|
n := copy(p, r.midbuf[r.midbufpos:]) |
|
r.midbufpos += n |
|
return n, nil |
|
} |
|
|
|
mn, err := r.r.Read(r.midbuf[:cap(r.midbuf)]) |
|
if err != nil { |
|
return 0, err |
|
} |
|
|
|
if (mn % 188) != 0 { |
|
return 0, fmt.Errorf("received packet with size %d not multiple of 188", mn) |
|
} |
|
|
|
r.midbuf = r.midbuf[:mn] |
|
n := copy(p, r.midbuf) |
|
r.midbufpos = n |
|
return n, nil |
|
}
|
|
|