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

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

Issue 1165113002: Add support for fragmentation in RtcpPacket. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixed nit, plus buffer overflow in nack test Created 5 years, 6 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
« no previous file with comments | « no previous file | webrtc/modules/rtp_rtcp/source/rtcp_packet.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/rtp_rtcp/source/rtcp_packet.h
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet.h b/webrtc/modules/rtp_rtcp/source/rtcp_packet.h
index 150b5b4097324d8e2b64ee8dc470ca45d6e219c3..ffa3e0daf2c226bc25ccaa137e388320856b3d89 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_packet.h
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet.h
@@ -16,6 +16,7 @@
#include <string>
#include <vector>
+#include "webrtc/base/scoped_ptr.h"
#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
#include "webrtc/typedefs.h"
@@ -23,8 +24,8 @@
namespace webrtc {
namespace rtcp {
-enum { kCommonFbFmtLength = 12 };
-enum { kReportBlockLength = 24 };
+static const int kCommonFbFmtLength = 12;
+static const int kReportBlockLength = 24;
class Dlrr;
class RawPacket;
@@ -64,21 +65,51 @@ class RtcpPacket {
void Append(RtcpPacket* packet);
- RawPacket Build() const;
+ // Callback used to signal that an RTCP packet is ready. Note that this may
+ // not contain all data in this RtcpPacket; if a packet cannot fit in
+ // max_length bytes, it will be fragmented and multiple calls to this
+ // callback will be made.
+ class PacketReadyCallback {
+ public:
+ PacketReadyCallback() {}
+ virtual ~PacketReadyCallback() {}
- void Build(uint8_t* packet, size_t* length, size_t max_length) const;
+ virtual void OnPacketReady(uint8_t* data, size_t length) = 0;
+ };
+
+ // Convenience method mostly used for test. Max length of IP_PACKET_SIZE is
+ // used, will cause assertion error if fragmentation occurs.
+ rtc::scoped_ptr<RawPacket> Build() const;
+
+ // Returns true if all calls to Create succeeded. A buffer of size
+ // IP_PACKET_SIZE will be allocated and reused between calls to callback.
+ bool Build(PacketReadyCallback* callback) const;
+
+ // Returns true if all calls to Create succeeded. Provided buffer reference
+ // will be used for all calls to callback.
+ bool BuildExternalBuffer(uint8_t* buffer,
+ size_t max_length,
+ PacketReadyCallback* callback) const;
protected:
RtcpPacket() : kHeaderLength(4) {}
- virtual void Create(
- uint8_t* packet, size_t* length, size_t max_length) const = 0;
+ virtual bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ PacketReadyCallback* callback) const = 0;
+
+ bool OnBufferFull(uint8_t* packet,
+ size_t* index,
+ RtcpPacket::PacketReadyCallback* callback) const;
const size_t kHeaderLength;
private:
- void CreateAndAddAppended(
- uint8_t* packet, size_t* length, size_t max_length) const;
+ bool CreateAndAddAppended(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ PacketReadyCallback* callback) const;
std::vector<RtcpPacket*> appended_packets_;
};
@@ -90,9 +121,10 @@ class Empty : public RtcpPacket {
virtual ~Empty() {}
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
DISALLOW_COPY_AND_ASSIGN(Empty);
@@ -202,15 +234,16 @@ class SenderReport : public RtcpPacket {
void WithOctetCount(uint32_t octet_count) {
sr_.SenderOctetCount = octet_count;
}
- void WithReportBlock(ReportBlock* block);
+ bool WithReportBlock(ReportBlock* block);
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- enum { kMaxNumberOfReportBlocks = 0x1f };
+ static const int kMaxNumberOfReportBlocks = 0x1f;
size_t BlockLength() const {
const size_t kSrHeaderLength = 8;
@@ -249,15 +282,16 @@ class ReceiverReport : public RtcpPacket {
void From(uint32_t ssrc) {
rr_.SenderSSRC = ssrc;
}
- void WithReportBlock(ReportBlock* block);
+ bool WithReportBlock(ReportBlock* block);
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- enum { kMaxNumberOfReportBlocks = 0x1f };
+ static const int kMaxNumberOfReportBlocks = 0x1F;
size_t BlockLength() const {
const size_t kRrHeaderLength = 8;
@@ -295,15 +329,16 @@ class Ij : public RtcpPacket {
virtual ~Ij() {}
- void WithJitterItem(uint32_t jitter);
+ bool WithJitterItem(uint32_t jitter);
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- enum { kMaxNumberOfIjItems = 0x1f };
+ static const int kMaxNumberOfIjItems = 0x1f;
size_t BlockLength() const {
return kHeaderLength + 4 * ij_items_.size();
@@ -346,7 +381,7 @@ class Sdes : public RtcpPacket {
virtual ~Sdes() {}
- void WithCName(uint32_t ssrc, std::string cname);
+ bool WithCName(uint32_t ssrc, const std::string& cname);
struct Chunk {
uint32_t ssrc;
@@ -355,12 +390,13 @@ class Sdes : public RtcpPacket {
};
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- enum { kMaxNumberOfChunks = 0x1f };
+ static const int kMaxNumberOfChunks = 0x1f;
size_t BlockLength() const;
@@ -394,15 +430,19 @@ class Bye : public RtcpPacket {
void From(uint32_t ssrc) {
bye_.SenderSSRC = ssrc;
}
- void WithCsrc(uint32_t csrc);
+
+ bool WithCsrc(uint32_t csrc);
+
+ // TODO(sprang): Add support for reason field?
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- enum { kMaxNumberOfCsrcs = 0x1f - 1 };
+ static const int kMaxNumberOfCsrcs = 0x1f - 1; // First item is sender SSRC.
size_t BlockLength() const {
size_t source_count = 1 + csrcs_.size();
@@ -458,9 +498,10 @@ class App : public RtcpPacket {
}
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
size_t BlockLength() const {
@@ -509,9 +550,10 @@ class Pli : public RtcpPacket {
}
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
size_t BlockLength() const {
@@ -561,9 +603,10 @@ class Sli : public RtcpPacket {
}
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
size_t BlockLength() const {
@@ -603,15 +646,12 @@ class Nack : public RtcpPacket {
void WithList(const uint16_t* nack_list, int length);
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- size_t BlockLength() const {
- size_t fci_length = 4 * nack_fields_.size();
- return kCommonFbFmtLength + fci_length;
- }
RTCPUtility::RTCPPacketRTPFBNACK nack_;
std::vector<RTCPUtility::RTCPPacketRTPFBNACKItem> nack_fields_;
@@ -654,9 +694,10 @@ class Rpsi : public RtcpPacket {
void WithPictureId(uint64_t picture_id);
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
size_t BlockLength() const {
@@ -702,9 +743,10 @@ class Fir : public RtcpPacket {
}
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
size_t BlockLength() const {
@@ -752,9 +794,10 @@ class Tmmbr : public RtcpPacket {
}
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
size_t BlockLength() const {
@@ -791,15 +834,17 @@ class Tmmbn : public RtcpPacket {
void From(uint32_t ssrc) {
tmmbn_.SenderSSRC = ssrc;
}
- void WithTmmbr(uint32_t ssrc, uint32_t bitrate_kbps, uint16_t overhead);
+ // Max 50 TMMBR can be added per TMMBN.
+ bool WithTmmbr(uint32_t ssrc, uint32_t bitrate_kbps, uint16_t overhead);
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- enum { kMaxNumberOfTmmbrs = 50 };
+ static const int kMaxNumberOfTmmbrs = 50;
size_t BlockLength() const {
const size_t kFciLen = 8;
@@ -850,12 +895,13 @@ class Remb : public RtcpPacket {
}
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- enum { kMaxNumberOfSsrcs = 0xff };
+ static const int kMaxNumberOfSsrcs = 0xff;
size_t BlockLength() const {
return (remb_item_.NumberOfSSRCs + 5) * 4;
@@ -893,19 +939,22 @@ class Xr : public RtcpPacket {
void From(uint32_t ssrc) {
xr_header_.OriginatorSSRC = ssrc;
}
- void WithRrtr(Rrtr* rrtr);
- void WithDlrr(Dlrr* dlrr);
- void WithVoipMetric(VoipMetric* voip_metric);
+
+ // Max 50 items of each of {Rrtr, Dlrr, VoipMetric} allowed per Xr.
+ bool WithRrtr(Rrtr* rrtr);
+ bool WithDlrr(Dlrr* dlrr);
+ bool WithVoipMetric(VoipMetric* voip_metric);
protected:
- void Create(uint8_t* packet,
- size_t* length,
- size_t max_length) const override;
+ bool Create(uint8_t* packet,
+ size_t* index,
+ size_t max_length,
+ RtcpPacket::PacketReadyCallback* callback) const override;
private:
- enum { kMaxNumberOfRrtrBlocks = 50 };
- enum { kMaxNumberOfDlrrBlocks = 50 };
- enum { kMaxNumberOfVoipMetricBlocks = 50 };
+ static const int kMaxNumberOfRrtrBlocks = 50;
+ static const int kMaxNumberOfDlrrBlocks = 50;
+ static const int kMaxNumberOfVoipMetricBlocks = 50;
size_t BlockLength() const {
const size_t kXrHeaderLength = 8;
@@ -987,11 +1036,12 @@ class Dlrr {
Dlrr() {}
~Dlrr() {}
- void WithDlrrItem(uint32_t ssrc, uint32_t last_rr, uint32_t delay_last_rr);
+ // Max 100 DLRR Items can be added per DLRR report block.
+ bool WithDlrrItem(uint32_t ssrc, uint32_t last_rr, uint32_t delay_last_rr);
private:
friend class Xr;
- enum { kMaxNumberOfDlrrItems = 100 };
+ static const int kMaxNumberOfDlrrItems = 100;
std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> dlrr_block_;
@@ -1074,27 +1124,24 @@ class VoipMetric {
// RawPacket raw_packet(buffer, length);
//
// To access the raw packet:
-// raw_packet.buffer(); - pointer to the raw packet
-// raw_packet.buffer_length(); - the length of the raw packet
+// raw_packet.Buffer(); - pointer to the raw packet
+// raw_packet.BufferLength(); - the length of the raw packet
class RawPacket {
public:
- RawPacket(const uint8_t* packet, size_t length) {
- assert(length <= IP_PACKET_SIZE);
- memcpy(buffer_, packet, length);
- buffer_length_ = length;
- }
+ explicit RawPacket(size_t buffer_length);
+ RawPacket(const uint8_t* packet, size_t packet_length);
- const uint8_t* buffer() {
- return buffer_;
- }
- size_t buffer_length() const {
- return buffer_length_;
- }
+ const uint8_t* Buffer() const;
+ uint8_t* MutableBuffer();
+ size_t BufferLength() const;
+ size_t Length() const;
+ void SetLength(size_t length);
private:
- size_t buffer_length_;
- uint8_t buffer_[IP_PACKET_SIZE];
+ const size_t buffer_length_;
+ size_t length_;
+ rtc::scoped_ptr<uint8_t[]> buffer_;
};
} // namespace rtcp
« no previous file with comments | « no previous file | webrtc/modules/rtp_rtcp/source/rtcp_packet.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698