Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
xr_traverser.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022 Roc Streaming authors
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7  */
8 
9 //! @file roc_rtcp/xr_traverser.h
10 //! @brief XR Traverser.
11 
12 #ifndef ROC_RTCP_XR_TRAVERSER_H_
13 #define ROC_RTCP_XR_TRAVERSER_H_
14 
15 #include "roc_core/slice.h"
16 #include "roc_core/stddefs.h"
17 #include "roc_rtcp/headers.h"
18 
19 namespace roc {
20 namespace rtcp {
21 
22 //! XR packet traverser.
23 class XrTraverser {
24 public:
25  //! Packet iterator.
26  class Iterator {
27  public:
28  //! Iterator state.
29  enum State {
30  BEGIN, //!< Iterator created.
31  RRTR_BLOCK, //!< RRTR block (receiver reference time).
32  DRLL_BLOCK, //!< DLRR block (delay since last receiver report).
33  END //!< Parsed whole packet.
34  };
35 
36  //! Advance iterator.
38 
39  //! Get RRTR block (receiver reference time).
40  //! @pre Can be used if next() returned RRTR_BLOCK.
41  const header::XrRrtrBlock& get_rrtr() const;
42 
43  //! Get DLRR block (delay since last receiver report).
44  //! @pre Can be used if next() returned DLRR_BLOCK.
45  const header::XrDlrrBlock& get_dlrr() const;
46 
47  private:
48  friend class XrTraverser;
49 
50  explicit Iterator(const XrTraverser& traverser);
51 
52  State state_;
54  uint8_t* pcur_;
55  };
56 
57  //! Initialize traverser.
58  //! It will parse and iterate provided buffer.
59  explicit XrTraverser(const core::Slice<uint8_t>& data);
60 
61  //! Parse packet from buffer.
62  bool parse();
63 
64  //! Construct iterator.
65  //! @pre Can be used if parse() returned true.
66  Iterator iter() const;
67 
68  //! Get number of XR blocks in packet.
69  size_t blocks_count() const;
70 
71  //! Get XR packet.
72  const header::XrPacket& packet() const;
73 
74 private:
75  const core::Slice<uint8_t> data_;
76  bool parsed_;
77  size_t packet_len_;
78  size_t blocks_count_;
79 };
80 
81 } // namespace rtcp
82 } // namespace roc
83 
84 #endif // ROC_RTCP_XR_TRAVERSER_H_
State next()
Advance iterator.
@ RRTR_BLOCK
RRTR block (receiver reference time).
Definition: xr_traverser.h:31
@ END
Parsed whole packet.
Definition: xr_traverser.h:33
@ DRLL_BLOCK
DLRR block (delay since last receiver report).
Definition: xr_traverser.h:32
const header::XrDlrrBlock & get_dlrr() const
Get DLRR block (delay since last receiver report).
const header::XrRrtrBlock & get_rrtr() const
Get RRTR block (receiver reference time).
XR packet traverser.
Definition: xr_traverser.h:23
const header::XrPacket & packet() const
Get XR packet.
bool parse()
Parse packet from buffer.
size_t blocks_count() const
Get number of XR blocks in packet.
Iterator iter() const
Construct iterator.
XrTraverser(const core::Slice< uint8_t > &data)
Initialize traverser. It will parse and iterate provided buffer.
XR DLRR Report block.
Definition: headers.h:1237
RTCP Extended Report Packet.
Definition: headers.h:983
XR Receiver Reference Time Report block.
Definition: headers.h:1117
Root namespace.
RTCP headers.
Slice.
Commonly used types and functions.