Index: webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h |
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h b/webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h |
index 6afac360e5f415f5fa8373669923c3682a69082b..92673935ea55003ce5683c4b5b1a4ad2b88be659 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h |
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h |
@@ -25,21 +25,28 @@ namespace rtcp { |
// From RFC 3611: RTP Control Protocol Extended Reports (RTCP XR). |
class ExtendedReports : public RtcpPacket { |
public: |
- typedef std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> DlrrBlock; |
- ExtendedReports() : RtcpPacket() { |
- memset(&xr_header_, 0, sizeof(xr_header_)); |
- } |
+ static const uint8_t kPacketType = 207; |
- virtual ~ExtendedReports() {} |
+ ExtendedReports(); |
+ ~ExtendedReports() override; |
- void From(uint32_t ssrc) { |
- xr_header_.OriginatorSSRC = ssrc; |
- } |
+ // Parse assumes header is already parsed and validated. |
+ bool Parse(const RTCPUtility::RtcpCommonHeader& header, |
+ const uint8_t* payload); // Size of the payload is in the header. |
+ |
+ void From(uint32_t ssrc) { sender_ssrc_ = ssrc; } |
// 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); |
+ bool WithRrtr(const Rrtr& rrtr); |
+ bool WithDlrr(const Dlrr& dlrr); |
+ bool WithVoipMetric(const VoipMetric& voip_metric); |
+ |
+ uint32_t sender_ssrc() const { return sender_ssrc_; } |
+ const std::vector<Rrtr>& rrtrs() const { return rrtr_blocks_; } |
+ const std::vector<Dlrr>& dlrrs() const { return dlrr_blocks_; } |
+ const std::vector<VoipMetric>& voip_metrics() const { |
+ return voip_metric_blocks_; |
+ } |
protected: |
bool Create(uint8_t* packet, |
@@ -48,31 +55,33 @@ class ExtendedReports : public RtcpPacket { |
RtcpPacket::PacketReadyCallback* callback) const override; |
private: |
- static const int kMaxNumberOfRrtrBlocks = 50; |
- static const int kMaxNumberOfDlrrBlocks = 50; |
- static const int kMaxNumberOfVoipMetricBlocks = 50; |
- |
- size_t BlockLength() const { |
- const size_t kXrHeaderLength = 8; |
- return kXrHeaderLength + RrtrLength() + DlrrLength() + VoipMetricLength(); |
+ static const size_t kMaxNumberOfRrtrBlocks = 50; |
+ static const size_t kMaxNumberOfDlrrBlocks = 50; |
+ static const size_t kMaxNumberOfVoipMetricBlocks = 50; |
+ static const size_t kXrHeaderLength = 4; |
åsapersson
2016/01/29 12:46:09
maybe kXrBaseLength (since xr header is 8 bytes).
danilchap
2016/01/29 13:49:30
Done. My understanding where XR header starts didn
|
+ |
+ size_t BlockLength() const override { |
+ return kHeaderLength + kXrHeaderLength + RrtrLength() + DlrrLength() + |
+ VoipMetricLength(); |
} |
size_t RrtrLength() const { return Rrtr::kLength * rrtr_blocks_.size(); } |
- |
size_t DlrrLength() const; |
- |
size_t VoipMetricLength() const { |
return VoipMetric::kLength * voip_metric_blocks_.size(); |
} |
- RTCPUtility::RTCPPacketXR xr_header_; |
+ void ParseRrtrBlock(const uint8_t* block, uint16_t block_size); |
+ void ParseDlrrBlock(const uint8_t* block, uint16_t block_size); |
+ void ParseVoipMetricBlock(const uint8_t* block, uint16_t block_size); |
+ |
+ uint32_t sender_ssrc_; |
std::vector<Rrtr> rrtr_blocks_; |
std::vector<Dlrr> dlrr_blocks_; |
std::vector<VoipMetric> voip_metric_blocks_; |
RTC_DISALLOW_COPY_AND_ASSIGN(ExtendedReports); |
}; |
- |
} // namespace rtcp |
} // namespace webrtc |
#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_EXTENDED_REPORTS_H_ |