Files
webrtc/pkg/rtcp/packet.go
Woodrow Douglass de31bb3c60 RTCP Reception mechanism
Add a channel to the RTCTrack object to
recieve incoming RTCP packets with.
Relates to #119
2018-11-29 12:30:34 -08:00

83 lines
1.5 KiB
Go

package rtcp
// Packet represents an RTCP packet, a protocol used for out-of-band statistics and control information for an RTP session
type Packet interface {
Marshal() ([]byte, error)
Unmarshal(rawPacket []byte) error
}
type PacketWithHeader struct {
Header
Packet
RawPacket []byte
}
func (p PacketWithHeader) Marshal() ([]byte, error) {
return p.Packet.Marshal()
}
func (p *PacketWithHeader) Unmarshal(rawPacket []byte) error {
p.RawPacket = rawPacket
if err := p.Header.Unmarshal(rawPacket); err != nil {
return err
}
switch p.Header.Type {
case TypeSenderReport:
sr := new(SenderReport)
err := sr.Unmarshal(rawPacket)
if (err == nil) {
p.Packet = sr
} else {
return err
}
case TypeReceiverReport:
rr := new(ReceiverReport)
err := rr.Unmarshal(rawPacket)
if (err == nil) {
p.Packet = rr
} else {
return err
}
case TypeSourceDescription:
sdes := new(SourceDescription)
err := sdes.Unmarshal(rawPacket)
if (err == nil) {
p.Packet = sdes
} else {
return err
}
case TypeGoodbye:
bye := new(Goodbye)
err := bye.Unmarshal(rawPacket)
if (err == nil) {
p.Packet = bye
} else {
return err
}
case TypeTransportSpecificFeedback:
rrr := new(RapidResynchronizationRequest)
err := rrr.Unmarshal(rawPacket)
if (err == nil) {
p.Packet = rrr
} else {
return err
}
case TypePayloadSpecificFeedback:
psfb := new(PictureLossIndication)
err := psfb.Unmarshal(rawPacket)
if (err == nil) {
p.Packet = psfb
} else {
return err
}
default:
return errWrongType
}
return nil
}