| 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..a85576db2dac20b2c190e8ae3dc3859b1951477d 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 kXrBaseLength = 4;
|
| +
|
| + size_t BlockLength() const override {
|
| + return kHeaderLength + kXrBaseLength + 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_length);
|
| + void ParseDlrrBlock(const uint8_t* block, uint16_t block_length);
|
| + void ParseVoipMetricBlock(const uint8_t* block, uint16_t block_length);
|
| +
|
| + 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_
|
|
|