Chromium Code Reviews| 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_ |