Line data Source code
1 : /*
2 : * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 : *
4 : * Use of this source code is governed by a BSD-style license
5 : * that can be found in the LICENSE file in the root of the source
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : *
10 : */
11 :
12 : #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_DLRR_H_
13 : #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_DLRR_H_
14 :
15 : #include <vector>
16 :
17 : #include "webrtc/base/basictypes.h"
18 :
19 : namespace webrtc {
20 : namespace rtcp {
21 : struct ReceiveTimeInfo {
22 : // RFC 3611 4.5
23 0 : ReceiveTimeInfo() : ssrc(0), last_rr(0), delay_since_last_rr(0) {}
24 : ReceiveTimeInfo(uint32_t ssrc, uint32_t last_rr, uint32_t delay)
25 : : ssrc(ssrc), last_rr(last_rr), delay_since_last_rr(delay) {}
26 : uint32_t ssrc;
27 : uint32_t last_rr;
28 : uint32_t delay_since_last_rr;
29 : };
30 :
31 : // DLRR Report Block: Delay since the Last Receiver Report (RFC 3611).
32 : class Dlrr {
33 : public:
34 : static const uint8_t kBlockType = 5;
35 :
36 0 : Dlrr() {}
37 : Dlrr(const Dlrr& other) = default;
38 0 : ~Dlrr() {}
39 :
40 : Dlrr& operator=(const Dlrr& other) = default;
41 :
42 : // Dlrr without items treated same as no dlrr block.
43 0 : explicit operator bool() const { return !sub_blocks_.empty(); }
44 :
45 : // Second parameter is value read from block header,
46 : // i.e. size of block in 32bits excluding block header itself.
47 : bool Parse(const uint8_t* buffer, uint16_t block_length_32bits);
48 :
49 : size_t BlockLength() const;
50 : // Fills buffer with the Dlrr.
51 : // Consumes BlockLength() bytes.
52 : void Create(uint8_t* buffer) const;
53 :
54 0 : void ClearItems() { sub_blocks_.clear(); }
55 0 : void AddDlrrItem(const ReceiveTimeInfo& time_info) {
56 0 : sub_blocks_.push_back(time_info);
57 0 : }
58 :
59 0 : const std::vector<ReceiveTimeInfo>& sub_blocks() const { return sub_blocks_; }
60 :
61 : private:
62 : static const size_t kBlockHeaderLength = 4;
63 : static const size_t kSubBlockLength = 12;
64 :
65 : std::vector<ReceiveTimeInfo> sub_blocks_;
66 : };
67 : } // namespace rtcp
68 : } // namespace webrtc
69 : #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_DLRR_H_
|