2024-06-05 20:10:03 +00:00
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT
2022-03-10 09:44:48 +00:00
package rtcp
import (
"encoding/binary"
"fmt"
)
// The RapidResynchronizationRequest packet informs the encoder about the loss of an undefined amount of coded video data belonging to one or more pictures
type RapidResynchronizationRequest struct {
// SSRC of sender
SenderSSRC uint32
// SSRC of the media source
MediaSSRC uint32
}
2024-05-15 23:15:00 +00:00
// RapidResynchronisationRequest is provided as RFC 6051 spells resynchronization with an s.
// We provide both names to be consistent with other RFCs which spell resynchronization with a z.
type RapidResynchronisationRequest = RapidResynchronizationRequest
2022-03-10 09:44:48 +00:00
const (
rrrLength = 2
rrrHeaderLength = ssrcLength * 2
rrrMediaOffset = 4
)
// Marshal encodes the RapidResynchronizationRequest in binary
func ( p RapidResynchronizationRequest ) Marshal ( ) ( [ ] byte , error ) {
/ *
* RRR does not require parameters . Therefore , the length field MUST be
* 2 , and there MUST NOT be any Feedback Control Information .
*
* The semantics of this FB message is independent of the payload type .
* /
2024-06-05 20:10:03 +00:00
rawPacket := make ( [ ] byte , p . MarshalSize ( ) )
2022-03-10 09:44:48 +00:00
packetBody := rawPacket [ headerLength : ]
binary . BigEndian . PutUint32 ( packetBody , p . SenderSSRC )
binary . BigEndian . PutUint32 ( packetBody [ rrrMediaOffset : ] , p . MediaSSRC )
hData , err := p . Header ( ) . Marshal ( )
if err != nil {
return nil , err
}
copy ( rawPacket , hData )
return rawPacket , nil
}
// Unmarshal decodes the RapidResynchronizationRequest from binary
func ( p * RapidResynchronizationRequest ) Unmarshal ( rawPacket [ ] byte ) error {
if len ( rawPacket ) < ( headerLength + ( ssrcLength * 2 ) ) {
return errPacketTooShort
}
var h Header
if err := h . Unmarshal ( rawPacket ) ; err != nil {
return err
}
if h . Type != TypeTransportSpecificFeedback || h . Count != FormatRRR {
return errWrongType
}
p . SenderSSRC = binary . BigEndian . Uint32 ( rawPacket [ headerLength : ] )
p . MediaSSRC = binary . BigEndian . Uint32 ( rawPacket [ headerLength + ssrcLength : ] )
return nil
}
2024-06-05 20:10:03 +00:00
// MarshalSize returns the size of the packet once marshaled
func ( p * RapidResynchronizationRequest ) MarshalSize ( ) int {
2022-03-10 09:44:48 +00:00
return headerLength + rrrHeaderLength
}
// Header returns the Header associated with this packet.
func ( p * RapidResynchronizationRequest ) Header ( ) Header {
return Header {
Count : FormatRRR ,
Type : TypeTransportSpecificFeedback ,
Length : rrrLength ,
}
}
// DestinationSSRC returns an array of SSRC values that this packet refers to.
func ( p * RapidResynchronizationRequest ) DestinationSSRC ( ) [ ] uint32 {
return [ ] uint32 { p . MediaSSRC }
}
func ( p * RapidResynchronizationRequest ) String ( ) string {
return fmt . Sprintf ( "RapidResynchronizationRequest %x %x" , p . SenderSSRC , p . MediaSSRC )
}