package srtp
import (
"errors"
"io"
"sync"
"time"
"github.com/pion/rtp"
"github.com/pion/transport/v3/packetio"
)
const srtpBufferSize = 1000 * 1000
type ReadStreamSRTP struct {
mu sync .Mutex
isClosed chan bool
session *SessionSRTP
ssrc uint32
isInited bool
buffer io .ReadWriteCloser
}
func newReadStreamSRTP() readStream {
return &ReadStreamSRTP {}
}
func (r *ReadStreamSRTP ) init (child streamSession , ssrc uint32 ) error {
sessionSRTP , ok := child .(*SessionSRTP )
r .mu .Lock ()
defer r .mu .Unlock ()
if !ok {
return errFailedTypeAssertion
} else if r .isInited {
return errStreamAlreadyInited
}
r .session = sessionSRTP
r .ssrc = ssrc
r .isInited = true
r .isClosed = make (chan bool )
if r .session .bufferFactory != nil {
r .buffer = r .session .bufferFactory (packetio .RTPBufferPacket , ssrc )
} else {
buff := packetio .NewBuffer ()
buff .SetLimitSize (srtpBufferSize )
r .buffer = buff
}
return nil
}
func (r *ReadStreamSRTP ) write (buf []byte ) (n int , err error ) {
n , err = r .buffer .Write (buf )
if errors .Is (err , packetio .ErrFull ) {
return len (buf ), nil
}
return n , err
}
func (r *ReadStreamSRTP ) Read (buf []byte ) (int , error ) {
return r .buffer .Read (buf )
}
func (r *ReadStreamSRTP ) ReadRTP (buf []byte ) (int , *rtp .Header , error ) {
n , err := r .Read (buf )
if err != nil {
return 0 , nil , err
}
header := &rtp .Header {}
_, err = header .Unmarshal (buf [:n ])
if err != nil {
return 0 , nil , err
}
return n , header , nil
}
func (r *ReadStreamSRTP ) SetReadDeadline (t time .Time ) error {
if b , ok := r .buffer .(interface {
SetReadDeadline (time .Time ) error
}); ok {
return b .SetReadDeadline (t )
}
return nil
}
func (r *ReadStreamSRTP ) Close () error {
r .mu .Lock ()
defer r .mu .Unlock ()
if !r .isInited {
return errStreamNotInited
}
select {
case <- r .isClosed :
return errStreamAlreadyClosed
default :
err := r .buffer .Close ()
if err != nil {
return err
}
r .session .removeReadStream (r .ssrc )
return nil
}
}
func (r *ReadStreamSRTP ) GetSSRC () uint32 {
return r .ssrc
}
type WriteStreamSRTP struct {
session *SessionSRTP
}
func (w *WriteStreamSRTP ) WriteRTP (header *rtp .Header , payload []byte ) (int , error ) {
return w .session .writeRTP (header , payload )
}
func (w *WriteStreamSRTP ) Write (b []byte ) (int , error ) {
return w .session .write (b )
}
func (w *WriteStreamSRTP ) SetWriteDeadline (t time .Time ) error {
return w .session .setWriteDeadline (t )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .