| Index: webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
|
| index 7038532f2e991fa822b364a0e0e2e4327b630c0e..8cb6fb0833644077c3aed6f60475b56e9f23b2cc 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
|
| @@ -92,34 +92,6 @@ void ComputeMantissaAnd6bitBase2Exponent(uint32_t input_base10,
|
| *mantissa = (input_base10 >> exponent);
|
| }
|
|
|
| -size_t BlockToHeaderLength(size_t length_in_bytes) {
|
| - // Length in 32-bit words minus 1.
|
| - assert(length_in_bytes > 0);
|
| - assert(length_in_bytes % 4 == 0);
|
| - return (length_in_bytes / 4) - 1;
|
| -}
|
| -
|
| -// From RFC 3550, RTP: A Transport Protocol for Real-Time Applications.
|
| -//
|
| -// RTP header format.
|
| -// 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
|
| -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| -// |V=2|P| RC/FMT | PT | length |
|
| -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| -
|
| -void CreateHeader(uint8_t count_or_format, // Depends on packet type.
|
| - uint8_t packet_type,
|
| - size_t length,
|
| - uint8_t* buffer,
|
| - size_t* pos) {
|
| - assert(length <= 0xffff);
|
| - const uint8_t kVersion = 2;
|
| - AssignUWord8(buffer, pos, (kVersion << 6) + count_or_format);
|
| - AssignUWord8(buffer, pos, packet_type);
|
| - AssignUWord16(buffer, pos, length);
|
| -}
|
| -
|
| // Sender report (SR) (RFC 3550).
|
| // 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
|
| @@ -140,10 +112,8 @@ void CreateHeader(uint8_t count_or_format, // Depends on packet type.
|
| // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
|
|
| void CreateSenderReport(const RTCPPacketSR& sr,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - CreateHeader(sr.NumberOfReportBlocks, PT_SR, length, buffer, pos);
|
| AssignUWord32(buffer, pos, sr.SenderSSRC);
|
| AssignUWord32(buffer, pos, sr.NTPMostSignificant);
|
| AssignUWord32(buffer, pos, sr.NTPLeastSignificant);
|
| @@ -162,10 +132,8 @@ void CreateSenderReport(const RTCPPacketSR& sr,
|
| // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
|
|
| void CreateReceiverReport(const RTCPPacketRR& rr,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - CreateHeader(rr.NumberOfReportBlocks, PT_RR, length, buffer, pos);
|
| AssignUWord32(buffer, pos, rr.SenderSSRC);
|
| }
|
|
|
| @@ -219,12 +187,8 @@ void CreateReportBlocks(const std::vector<RTCPPacketReportBlockItem>& blocks,
|
| void CreateIj(const std::vector<uint32_t>& ij_items,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - size_t length = ij_items.size();
|
| - CreateHeader(length, PT_IJ, length, buffer, pos);
|
| - for (std::vector<uint32_t>::const_iterator it = ij_items.begin();
|
| - it != ij_items.end(); ++it) {
|
| - AssignUWord32(buffer, pos, *it);
|
| - }
|
| + for (uint32_t item : ij_items)
|
| + AssignUWord32(buffer, pos, item);
|
| }
|
|
|
| // Source Description (SDES) (RFC 3550).
|
| @@ -254,10 +218,8 @@ void CreateIj(const std::vector<uint32_t>& ij_items,
|
| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
| void CreateSdes(const std::vector<Sdes::Chunk>& chunks,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - CreateHeader(chunks.size(), PT_SDES, length, buffer, pos);
|
| const uint8_t kSdesItemType = 1;
|
| for (std::vector<Sdes::Chunk>::const_iterator it = chunks.begin();
|
| it != chunks.end(); ++it) {
|
| @@ -286,10 +248,8 @@ void CreateSdes(const std::vector<Sdes::Chunk>& chunks,
|
|
|
| void CreateBye(const RTCPPacketBYE& bye,
|
| const std::vector<uint32_t>& csrcs,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - CreateHeader(length, PT_BYE, length, buffer, pos);
|
| AssignUWord32(buffer, pos, bye.SenderSSRC);
|
| for (uint32_t csrc : csrcs)
|
| AssignUWord32(buffer, pos, csrc);
|
| @@ -311,10 +271,8 @@ void CreateBye(const RTCPPacketBYE& bye,
|
|
|
| void CreateApp(const RTCPPacketAPP& app,
|
| uint32_t ssrc,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - CreateHeader(app.SubType, PT_APP, length, buffer, pos);
|
| AssignUWord32(buffer, pos, ssrc);
|
| AssignUWord32(buffer, pos, app.Name);
|
| memcpy(buffer + *pos, app.Data, app.Size);
|
| @@ -343,11 +301,8 @@ void CreateApp(const RTCPPacketAPP& app,
|
| // FCI: no feedback control information.
|
|
|
| void CreatePli(const RTCPPacketPSFBPLI& pli,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - const uint8_t kFmt = 1;
|
| - CreateHeader(kFmt, PT_PSFB, length, buffer, pos);
|
| AssignUWord32(buffer, pos, pli.SenderSSRC);
|
| AssignUWord32(buffer, pos, pli.MediaSSRC);
|
| }
|
| @@ -364,11 +319,8 @@ void CreatePli(const RTCPPacketPSFBPLI& pli,
|
|
|
| void CreateSli(const RTCPPacketPSFBSLI& sli,
|
| const RTCPPacketPSFBSLIItem& sli_item,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - const uint8_t kFmt = 2;
|
| - CreateHeader(kFmt, PT_PSFB, length, buffer, pos);
|
| AssignUWord32(buffer, pos, sli.SenderSSRC);
|
| AssignUWord32(buffer, pos, sli.MediaSSRC);
|
|
|
| @@ -393,11 +345,8 @@ void CreateNack(const RTCPPacketRTPFBNACK& nack,
|
| const std::vector<RTCPPacketRTPFBNACKItem>& nack_fields,
|
| size_t start_index,
|
| size_t end_index,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - const uint8_t kFmt = 1;
|
| - CreateHeader(kFmt, PT_RTPFB, length, buffer, pos);
|
| AssignUWord32(buffer, pos, nack.SenderSSRC);
|
| AssignUWord32(buffer, pos, nack.MediaSSRC);
|
| for (size_t i = start_index; i < end_index; ++i) {
|
| @@ -421,13 +370,10 @@ void CreateNack(const RTCPPacketRTPFBNACK& nack,
|
|
|
| void CreateRpsi(const RTCPPacketPSFBRPSI& rpsi,
|
| uint8_t padding_bytes,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| // Native bit string should be a multiple of 8 bits.
|
| assert(rpsi.NumberOfValidBits % 8 == 0);
|
| - const uint8_t kFmt = 3;
|
| - CreateHeader(kFmt, PT_PSFB, length, buffer, pos);
|
| AssignUWord32(buffer, pos, rpsi.SenderSSRC);
|
| AssignUWord32(buffer, pos, rpsi.MediaSSRC);
|
| AssignUWord8(buffer, pos, padding_bytes * 8);
|
| @@ -452,11 +398,8 @@ void CreateRpsi(const RTCPPacketPSFBRPSI& rpsi,
|
|
|
| void CreateFir(const RTCPPacketPSFBFIR& fir,
|
| const RTCPPacketPSFBFIRItem& fir_item,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - const uint8_t kFmt = 4;
|
| - CreateHeader(kFmt, PT_PSFB, length, buffer, pos);
|
| AssignUWord32(buffer, pos, fir.SenderSSRC);
|
| AssignUWord32(buffer, pos, kUnusedMediaSourceSsrc0);
|
| AssignUWord32(buffer, pos, fir_item.SSRC);
|
| @@ -494,11 +437,8 @@ void CreateTmmbrItem(const RTCPPacketRTPFBTMMBRItem& tmmbr_item,
|
|
|
| void CreateTmmbr(const RTCPPacketRTPFBTMMBR& tmmbr,
|
| const RTCPPacketRTPFBTMMBRItem& tmmbr_item,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - const uint8_t kFmt = 3;
|
| - CreateHeader(kFmt, PT_RTPFB, length, buffer, pos);
|
| AssignUWord32(buffer, pos, tmmbr.SenderSSRC);
|
| AssignUWord32(buffer, pos, kUnusedMediaSourceSsrc0);
|
| CreateTmmbrItem(tmmbr_item, buffer, pos);
|
| @@ -518,11 +458,8 @@ void CreateTmmbr(const RTCPPacketRTPFBTMMBR& tmmbr,
|
|
|
| void CreateTmmbn(const RTCPPacketRTPFBTMMBN& tmmbn,
|
| const std::vector<RTCPPacketRTPFBTMMBRItem>& tmmbn_items,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - const uint8_t kFmt = 4;
|
| - CreateHeader(kFmt, PT_RTPFB, length, buffer, pos);
|
| AssignUWord32(buffer, pos, tmmbn.SenderSSRC);
|
| AssignUWord32(buffer, pos, kUnusedMediaSourceSsrc0);
|
| for (uint8_t i = 0; i < tmmbn_items.size(); ++i) {
|
| @@ -551,15 +488,12 @@ void CreateTmmbn(const RTCPPacketRTPFBTMMBN& tmmbn,
|
|
|
| void CreateRemb(const RTCPPacketPSFBAPP& remb,
|
| const RTCPPacketPSFBREMBItem& remb_item,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| uint32_t mantissa = 0;
|
| uint8_t exp = 0;
|
| ComputeMantissaAnd6bitBase2Exponent(remb_item.BitRate, 18, &mantissa, &exp);
|
|
|
| - const uint8_t kFmt = 15;
|
| - CreateHeader(kFmt, PT_PSFB, length, buffer, pos);
|
| AssignUWord32(buffer, pos, remb.SenderSSRC);
|
| AssignUWord32(buffer, pos, kUnusedMediaSourceSsrc0);
|
| AssignUWord8(buffer, pos, 'R');
|
| @@ -590,10 +524,8 @@ void CreateRemb(const RTCPPacketPSFBAPP& remb,
|
| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
| void CreateXrHeader(const RTCPPacketXR& header,
|
| - size_t length,
|
| uint8_t* buffer,
|
| size_t* pos) {
|
| - CreateHeader(0U, PT_XR, length, buffer, pos);
|
| AssignUWord32(buffer, pos, header.OriginatorSSRC);
|
| }
|
|
|
| @@ -790,6 +722,35 @@ bool RtcpPacket::OnBufferFull(uint8_t* packet,
|
| return true;
|
| }
|
|
|
| +size_t RtcpPacket::HeaderLength() const {
|
| + size_t length_in_bytes = BlockLength();
|
| + // Length in 32-bit words minus 1.
|
| + assert(length_in_bytes > 0);
|
| + return ((length_in_bytes + 3) / 4) - 1;
|
| +}
|
| +
|
| +// From RFC 3550, RTP: A Transport Protocol for Real-Time Applications.
|
| +//
|
| +// RTP header format.
|
| +// 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
|
| +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| +// |V=2|P| RC/FMT | PT | length |
|
| +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| +
|
| +void RtcpPacket::CreateHeader(
|
| + uint8_t count_or_format, // Depends on packet type.
|
| + uint8_t packet_type,
|
| + size_t length,
|
| + uint8_t* buffer,
|
| + size_t* pos) const {
|
| + assert(length <= 0xffff);
|
| + const uint8_t kVersion = 2;
|
| + AssignUWord8(buffer, pos, (kVersion << 6) + count_or_format);
|
| + AssignUWord8(buffer, pos, packet_type);
|
| + AssignUWord16(buffer, pos, length);
|
| +}
|
| +
|
| bool Empty::Create(uint8_t* packet,
|
| size_t* index,
|
| size_t max_length,
|
| @@ -797,6 +758,10 @@ bool Empty::Create(uint8_t* packet,
|
| return true;
|
| }
|
|
|
| +size_t Empty::BlockLength() const {
|
| + return 0;
|
| +}
|
| +
|
| bool SenderReport::Create(uint8_t* packet,
|
| size_t* index,
|
| size_t max_length,
|
| @@ -805,7 +770,8 @@ bool SenderReport::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateSenderReport(sr_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + CreateHeader(sr_.NumberOfReportBlocks, PT_SR, HeaderLength(), packet, index);
|
| + CreateSenderReport(sr_, packet, index);
|
| CreateReportBlocks(report_blocks_, packet, index);
|
| return true;
|
| }
|
| @@ -828,7 +794,8 @@ bool ReceiverReport::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateReceiverReport(rr_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + CreateHeader(rr_.NumberOfReportBlocks, PT_RR, HeaderLength(), packet, index);
|
| + CreateReceiverReport(rr_, packet, index);
|
| CreateReportBlocks(report_blocks_, packet, index);
|
| return true;
|
| }
|
| @@ -851,6 +818,8 @@ bool Ij::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| + size_t length = ij_items_.size();
|
| + CreateHeader(length, PT_IJ, length, packet, index);
|
| CreateIj(ij_items_, packet, index);
|
| return true;
|
| }
|
| @@ -873,7 +842,8 @@ bool Sdes::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateSdes(chunks_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + CreateHeader(chunks_.size(), PT_SDES, HeaderLength(), packet, index);
|
| + CreateSdes(chunks_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -914,7 +884,9 @@ bool Bye::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateBye(bye_, csrcs_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + size_t length = HeaderLength();
|
| + CreateHeader(length, PT_BYE, length, packet, index);
|
| + CreateBye(bye_, csrcs_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -935,7 +907,8 @@ bool App::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateApp(app_, ssrc_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + CreateHeader(app_.SubType, PT_APP, HeaderLength(), packet, index);
|
| + CreateApp(app_, ssrc_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -947,7 +920,9 @@ bool Pli::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreatePli(pli_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + const uint8_t kFmt = 1;
|
| + CreateHeader(kFmt, PT_PSFB, HeaderLength(), packet, index);
|
| + CreatePli(pli_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -959,7 +934,9 @@ bool Sli::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateSli(sli_, sli_item_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + const uint8_t kFmt = 2;
|
| + CreateHeader(kFmt, PT_PSFB, HeaderLength(), packet, index);
|
| + CreateSli(sli_, sli_item_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -981,8 +958,11 @@ bool Nack::Create(uint8_t* packet,
|
| std::min((bytes_left_in_buffer - kCommonFbFmtLength) / 4,
|
| nack_fields_.size() - nack_index);
|
|
|
| + const uint8_t kFmt = 1;
|
| + size_t size_bytes = (num_nack_fields * 4) + kCommonFbFmtLength;
|
| + size_t header_length = ((size_bytes + 3) / 4) - 1; // As 32bit words - 1
|
| + CreateHeader(kFmt, PT_RTPFB, header_length, packet, index);
|
| CreateNack(nack_, nack_fields_, nack_index, nack_index + num_nack_fields,
|
| - BlockToHeaderLength((num_nack_fields * 4) + kCommonFbFmtLength),
|
| packet, index);
|
|
|
| nack_index += num_nack_fields;
|
| @@ -991,6 +971,10 @@ bool Nack::Create(uint8_t* packet,
|
| return true;
|
| }
|
|
|
| +size_t Nack::BlockLength() const {
|
| + return (nack_fields_.size() * 4) + kCommonFbFmtLength;
|
| +}
|
| +
|
| void Nack::WithList(const uint16_t* nack_list, int length) {
|
| assert(nack_list);
|
| assert(nack_fields_.empty());
|
| @@ -1024,8 +1008,9 @@ bool Rpsi::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateRpsi(rpsi_, padding_bytes_, BlockToHeaderLength(BlockLength()), packet,
|
| - index);
|
| + const uint8_t kFmt = 3;
|
| + CreateHeader(kFmt, PT_PSFB, HeaderLength(), packet, index);
|
| + CreateRpsi(rpsi_, padding_bytes_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -1064,7 +1049,9 @@ bool Fir::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateFir(fir_, fir_item_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + const uint8_t kFmt = 4;
|
| + CreateHeader(kFmt, PT_PSFB, HeaderLength(), packet, index);
|
| + CreateFir(fir_, fir_item_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -1076,8 +1063,9 @@ bool Remb::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateRemb(remb_, remb_item_, BlockToHeaderLength(BlockLength()), packet,
|
| - index);
|
| + const uint8_t kFmt = 15;
|
| + CreateHeader(kFmt, PT_PSFB, HeaderLength(), packet, index);
|
| + CreateRemb(remb_, remb_item_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -1097,8 +1085,9 @@ bool Tmmbr::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateTmmbr(tmmbr_, tmmbr_item_, BlockToHeaderLength(BlockLength()), packet,
|
| - index);
|
| + const uint8_t kFmt = 3;
|
| + CreateHeader(kFmt, PT_RTPFB, HeaderLength(), packet, index);
|
| + CreateTmmbr(tmmbr_, tmmbr_item_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -1124,8 +1113,9 @@ bool Tmmbn::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateTmmbn(tmmbn_, tmmbn_items_, BlockToHeaderLength(BlockLength()), packet,
|
| - index);
|
| + const uint8_t kFmt = 4;
|
| + CreateHeader(kFmt, PT_RTPFB, HeaderLength(), packet, index);
|
| + CreateTmmbn(tmmbn_, tmmbn_items_, packet, index);
|
| return true;
|
| }
|
|
|
| @@ -1137,7 +1127,8 @@ bool Xr::Create(uint8_t* packet,
|
| if (!OnBufferFull(packet, index, callback))
|
| return false;
|
| }
|
| - CreateXrHeader(xr_header_, BlockToHeaderLength(BlockLength()), packet, index);
|
| + CreateHeader(0U, PT_XR, HeaderLength(), packet, index);
|
| + CreateXrHeader(xr_header_, packet, index);
|
| CreateRrtr(rrtr_blocks_, packet, index);
|
| CreateDlrr(dlrr_blocks_, packet, index);
|
| CreateVoipMetric(voip_metric_blocks_, packet, index);
|
|
|