Source File
receiver_report.go
Belonging Package
github.com/pion/rtcp
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>// SPDX-License-Identifier: MITpackage rtcpimport ()// A ReceiverReport (RR) packet provides reception quality feedback for an RTP streamtype ReceiverReport struct {// The synchronization source identifier for the originator of this RR packet.SSRC uint32// Zero or more reception report blocks depending on the number of other// sources heard by this sender since the last report. Each reception report// block conveys statistics on the reception of RTP packets from a// single synchronization source.Reports []ReceptionReport// Extension contains additional, payload-specific information that needs to// be reported regularly about the receiver.ProfileExtensions []byte}const (ssrcLength = 4rrSSRCOffset = headerLengthrrReportOffset = rrSSRCOffset + ssrcLength)// Marshal encodes the ReceiverReport in binaryfunc ( ReceiverReport) () ([]byte, error) {/** 0 1 2 3* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* header |V=2|P| RC | PT=RR=201 | length |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | SSRC of packet sender |* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+* report | SSRC_1 (SSRC of first source) |* block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* 1 | fraction lost | cumulative number of packets lost |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | extended highest sequence number received |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | interarrival jitter |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | last SR (LSR) |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | delay since last SR (DLSR) |* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+* report | SSRC_2 (SSRC of second source) |* block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* 2 : ... :* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+* | profile-specific extensions |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/:= make([]byte, .MarshalSize()):= [headerLength:]binary.BigEndian.PutUint32(, .SSRC)for , := range .Reports {, := .Marshal()if != nil {return nil,}:= ssrcLength + receptionReportLength*copy([:], )}if len(.Reports) > countMax {return nil, errTooManyReports}:= make([]byte, len(.ProfileExtensions))copy(, .ProfileExtensions)// if the length of the profile extensions isn't devisible// by 4, we need to pad the end.for (len() & 0x3) != 0 {= append(, 0)}= append(, ...), := .Header().Marshal()if != nil {return nil,}copy(, )return , nil}// Unmarshal decodes the ReceiverReport from binaryfunc ( *ReceiverReport) ( []byte) error {/** 0 1 2 3* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* header |V=2|P| RC | PT=RR=201 | length |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | SSRC of packet sender |* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+* report | SSRC_1 (SSRC of first source) |* block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* 1 | fraction lost | cumulative number of packets lost |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | extended highest sequence number received |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | interarrival jitter |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | last SR (LSR) |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | delay since last SR (DLSR) |* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+* report | SSRC_2 (SSRC of second source) |* block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* 2 : ... :* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+* | profile-specific extensions |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/if len() < (headerLength + ssrcLength) {return errPacketTooShort}var Headerif := .Unmarshal(); != nil {return}if .Type != TypeReceiverReport {return errWrongType}.SSRC = binary.BigEndian.Uint32([rrSSRCOffset:])for := rrReportOffset; < len() && len(.Reports) < int(.Count); += receptionReportLength {var ReceptionReportif := .Unmarshal([:]); != nil {return}.Reports = append(.Reports, )}.ProfileExtensions = [rrReportOffset+(len(.Reports)*receptionReportLength):]if uint8(len(.Reports)) != .Count {return errInvalidHeader}return nil}// MarshalSize returns the size of the packet once marshaledfunc ( *ReceiverReport) () int {:= 0for , := range .Reports {+= .len()}return headerLength + ssrcLength +}// Header returns the Header associated with this packet.func ( *ReceiverReport) () Header {return Header{Count: uint8(len(.Reports)),Type: TypeReceiverReport,Length: uint16((.MarshalSize()/4)-1) + uint16(getPadding(len(.ProfileExtensions))),}}// DestinationSSRC returns an array of SSRC values that this packet refers to.func ( *ReceiverReport) () []uint32 {:= make([]uint32, len(.Reports))for , := range .Reports {[] = .SSRC}return}func ( ReceiverReport) () string {:= fmt.Sprintf("ReceiverReport from %x\n", .SSRC)+= "\tSSRC \tLost\tLastSequence\n"for , := range .Reports {+= fmt.Sprintf("\t%x\t%d/%d\t%d\n", .SSRC, .FractionLost, .TotalLost, .LastSequenceNumber)}+= fmt.Sprintf("\tProfile Extension Data: %v\n", .ProfileExtensions)return}
![]() |
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. |