package rtcp
type Packet interface {
DestinationSSRC () []uint32
Marshal () ([]byte , error )
Unmarshal (rawPacket []byte ) error
MarshalSize () int
}
func Unmarshal (rawData []byte ) ([]Packet , error ) {
var packets []Packet
for len (rawData ) != 0 {
p , processed , err := unmarshal (rawData )
if err != nil {
return nil , err
}
packets = append (packets , p )
rawData = rawData [processed :]
}
switch len (packets ) {
case 0 :
return nil , errInvalidHeader
default :
return packets , nil
}
}
func Marshal (packets []Packet ) ([]byte , error ) {
out := make ([]byte , 0 )
for _ , p := range packets {
data , err := p .Marshal ()
if err != nil {
return nil , err
}
out = append (out , data ...)
}
return out , nil
}
func unmarshal(rawData []byte ) (packet Packet , bytesprocessed int , err error ) {
var h Header
err = h .Unmarshal (rawData )
if err != nil {
return nil , 0 , err
}
bytesprocessed = int (h .Length +1 ) * 4
if bytesprocessed > len (rawData ) {
return nil , 0 , errPacketTooShort
}
inPacket := rawData [:bytesprocessed ]
switch h .Type {
case TypeSenderReport :
packet = new (SenderReport )
case TypeReceiverReport :
packet = new (ReceiverReport )
case TypeSourceDescription :
packet = new (SourceDescription )
case TypeGoodbye :
packet = new (Goodbye )
case TypeTransportSpecificFeedback :
switch h .Count {
case FormatTLN :
packet = new (TransportLayerNack )
case FormatRRR :
packet = new (RapidResynchronizationRequest )
case FormatTCC :
packet = new (TransportLayerCC )
case FormatCCFB :
packet = new (CCFeedbackReport )
default :
packet = new (RawPacket )
}
case TypePayloadSpecificFeedback :
switch h .Count {
case FormatPLI :
packet = new (PictureLossIndication )
case FormatSLI :
packet = new (SliceLossIndication )
case FormatREMB :
packet = new (ReceiverEstimatedMaximumBitrate )
case FormatFIR :
packet = new (FullIntraRequest )
default :
packet = new (RawPacket )
}
case TypeExtendedReport :
packet = new (ExtendedReport )
case TypeApplicationDefined :
packet = new (ApplicationDefined )
default :
packet = new (RawPacket )
}
err = packet .Unmarshal (inPacket )
return packet , bytesprocessed , err
}
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 .