1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
package packetdump
import (
"github.com/pion/interceptor"
"github.com/pion/rtcp"
"github.com/pion/rtp"
)
// SenderInterceptorFactory is a interceptor.Factory for a SenderInterceptor
type SenderInterceptorFactory struct {
opts []PacketDumperOption
}
// NewSenderInterceptor returns a new SenderInterceptorFactory
func NewSenderInterceptor(opts ...PacketDumperOption) (*SenderInterceptorFactory, error) {
return &SenderInterceptorFactory{
opts: opts,
}, nil
}
// NewInterceptor returns a new SenderInterceptor interceptor
func (s *SenderInterceptorFactory) NewInterceptor(id string) (interceptor.Interceptor, error) {
dumper, err := NewPacketDumper(s.opts...)
if err != nil {
return nil, err
}
i := &SenderInterceptor{
PacketDumper: dumper,
}
return i, nil
}
// SenderInterceptor responds to nack feedback messages
type SenderInterceptor struct {
interceptor.NoOp
*PacketDumper
}
// BindRTCPWriter lets you modify any outgoing RTCP packets. It is called once per PeerConnection. The returned method
// will be called once per packet batch.
func (s *SenderInterceptor) BindRTCPWriter(writer interceptor.RTCPWriter) interceptor.RTCPWriter {
return interceptor.RTCPWriterFunc(func(pkts []rtcp.Packet, attributes interceptor.Attributes) (int, error) {
s.logRTCPPackets(pkts, attributes)
return writer.Write(pkts, attributes)
})
}
// BindLocalStream lets you modify any outgoing RTP packets. It is called once for per LocalStream. The returned method
// will be called once per rtp packet.
func (s *SenderInterceptor) BindLocalStream(info *interceptor.StreamInfo, writer interceptor.RTPWriter) interceptor.RTPWriter {
return interceptor.RTPWriterFunc(func(header *rtp.Header, payload []byte, attributes interceptor.Attributes) (int, error) {
s.logRTPPacket(header, payload, attributes)
return writer.Write(header, payload, attributes)
})
}
// Close closes the interceptor
func (s *SenderInterceptor) Close() error {
return s.PacketDumper.Close()
}
|