Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1510)

Unified Diff: webrtc/modules/rtp_rtcp/source/rtcp_packet.cc

Issue 1175263002: Add packetization and coding/decoding of feedback message format. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Make size constants unsigned Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtcp_packet.h ('k') | webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698