Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
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/traverser.h
10 //! @brief RTCP packet traverser.
11 
12 #ifndef ROC_RTCP_TRAVERSER_H_
13 #define ROC_RTCP_TRAVERSER_H_
14 
15 #include "roc_rtcp/bye_traverser.h"
16 #include "roc_rtcp/headers.h"
18 #include "roc_rtcp/xr_traverser.h"
19 
20 namespace roc {
21 namespace rtcp {
22 
23 //! RTCP compound packet traverser.
24 class Traverser {
25 public:
26  //! Packet iterator.
27  class Iterator {
28  public:
29  //! Iterator state.
30  enum State {
31  BEGIN, //!< Iterator created.
32  SR, //!< SR packet.
33  RR, //!< RR packet.
34  XR, //!< XR packet.
35  SDES, //!< SDES packet.
36  BYE, //!< BYE packet.
37  END //!< Parsed whole compound packet.
38  };
39 
40  //! Advance iterator.
42 
43  //! Get SR packet.
44  //! @pre Can be used if next() returned SR.
46 
47  //! Get RR packet.
48  //! @pre Can be used if next() returned RR.
50 
51  //! Get traverser for XR packet.
52  //! @pre Can be used if next() returned XR.
54 
55  //! Get traverser for SDES packet.
56  //! @pre Can be used if next() returned SDES.
58 
59  //! Get traverser for BYE packet.
60  //! @pre Can be used if next() returned BYE.
62 
63  private:
64  friend class Traverser;
65 
66  explicit Iterator(const Traverser& traverser);
67  void next_packet_();
68  void skip_packet_();
69 
70  State state_;
71  const core::Slice<uint8_t> data_;
72  core::Slice<uint8_t> cur_slice_;
73  header::PacketHeader* cur_pkt_header_;
74  size_t cur_pkt_len_;
75  size_t cur_i_;
76  };
77 
78  //! Initialize traverser.
79  //! It will parse and iterate provided buffer.
80  explicit Traverser(const core::Slice<uint8_t>& data);
81 
82  //! Validate packet for strict correctness according to the RFC.
83  bool validate() const;
84 
85  //! Parse packet from buffer.
86  bool parse();
87 
88  //! Construct iterator.
89  //! @pre Can be used if parse() returned true.
90  Iterator iter() const;
91 
92 private:
94  bool parsed_;
95 };
96 
97 } // namespace rtcp
98 } // namespace roc
99 
100 #endif // ROC_RTCP_TRAVERSER_H_
RTCP interface structures.
BYE packet traverer.
Definition: bye_traverser.h:25
SDES packet traverer.
State next()
Advance iterator.
const header::SenderReportPacket & get_sr() const
Get SR packet.
const header::ReceiverReportPacket & get_rr() const
Get RR packet.
SdesTraverser get_sdes()
Get traverser for SDES packet.
ByeTraverser get_bye()
Get traverser for BYE packet.
XrTraverser get_xr() const
Get traverser for XR packet.
@ BEGIN
Iterator created.
Definition: traverser.h:31
@ END
Parsed whole compound packet.
Definition: traverser.h:37
RTCP compound packet traverser.
Definition: traverser.h:24
Iterator iter() const
Construct iterator.
Traverser(const core::Slice< uint8_t > &data)
Initialize traverser. It will parse and iterate provided buffer.
bool validate() const
Validate packet for strict correctness according to the RFC.
bool parse()
Parse packet from buffer.
XR packet traverser.
Definition: xr_traverser.h:23
RTCP packet header, common for all RTCP packet types.
Definition: headers.h:150
Receiver Report RTCP packet (RR).
Definition: headers.h:474
Sender Report RTCP packet (SR).
Definition: headers.h:571
Root namespace.
RTCP headers.
Sdes enums.
XR Traverser.