INET Framework for OMNeT++/OMNEST
inet::rtp::RtcpPacketSerializer Class Reference

Converts between RtcpPacket and binary (network byte order) RTCP packet. More...

#include <RtcpPacketSerializer.h>

Inheritance diagram for inet::rtp::RtcpPacketSerializer:
inet::FieldsChunkSerializer inet::ChunkSerializer

Public Member Functions

 RtcpPacketSerializer ()
 
- Public Member Functions inherited from inet::FieldsChunkSerializer
virtual void serialize (MemoryOutputStream &stream, const Ptr< const Chunk > &chunk, b offset, b length) const override
 Serializes a chunk into a stream by writing the bytes representing the chunk at the end of the stream. More...
 
virtual const Ptr< Chunkdeserialize (MemoryInputStream &stream, const std::type_info &typeInfo) const override
 Deserializes a chunk from a stream by reading the bytes at the current position of the stream. More...
 

Protected Member Functions

virtual void serialize (MemoryOutputStream &stream, const Ptr< const Chunk > &chunk) const override
 Serializes a chunk into a stream by writing all bytes representing the chunk at the end of the stream. More...
 
virtual const Ptr< Chunkdeserialize (MemoryInputStream &stream) const override
 Deserializes a chunk from a stream by reading the bytes at the current position of the stream. More...
 

Additional Inherited Members

- Static Public Attributes inherited from inet::ChunkSerializer
static b totalSerializedLength = b(0)
 
static b totalDeserializedLength = b(0)
 

Detailed Description

Converts between RtcpPacket and binary (network byte order) RTCP packet.

Constructor & Destructor Documentation

◆ RtcpPacketSerializer()

inet::rtp::RtcpPacketSerializer::RtcpPacketSerializer ( )
inline
24 : FieldsChunkSerializer() {}

Member Function Documentation

◆ deserialize()

const Ptr< Chunk > inet::rtp::RtcpPacketSerializer::deserialize ( MemoryInputStream stream) const
overrideprotectedvirtual

Deserializes a chunk from a stream by reading the bytes at the current position of the stream.

The current stream position is updated according to the length of the returned chunk.

Implements inet::FieldsChunkSerializer.

146 {
147  auto rtcpPacket = makeShared<RtcpPacket>();
148  rtcpPacket->setVersion(stream.readNBitsToUint64Be(2));
149  rtcpPacket->setPadding(stream.readBit());
150  short count = stream.readNBitsToUint64Be(5);
151  rtcpPacket->setCount(count);
152  rtcpPacket->setPacketType((RtcpPacketType)stream.readByte());
153  rtcpPacket->setRtcpLength(stream.readUint16Be());
154  switch (rtcpPacket->getPacketType()) {
155  case RTCP_PT_SR: {
156  auto rtcpSenderReportPacket = makeShared<RtcpSenderReportPacket>();
157  rtcpSenderReportPacket->setVersion(rtcpPacket->getVersion());
158  rtcpSenderReportPacket->setPadding(rtcpPacket->getPadding());
159  rtcpSenderReportPacket->setCount(0);
160  rtcpSenderReportPacket->setPacketType(rtcpPacket->getPacketType());
161  rtcpSenderReportPacket->setRtcpLength(rtcpPacket->getRtcpLength());
162  rtcpSenderReportPacket->setSsrc(stream.readUint32Be());
163  auto& senderReport = rtcpSenderReportPacket->getSenderReportForUpdate();
164  senderReport.setNTPTimeStamp(stream.readUint64Be());
165  senderReport.setRTPTimeStamp(stream.readUint32Be());
166  senderReport.setPacketCount(stream.readUint32Be());
167  senderReport.setByteCount(stream.readUint32Be());
168  for (short i = 0; i < count; ++i) {
169  ReceptionReport *receptionReport = new ReceptionReport();
170  deserializeReceptionReport(stream, *receptionReport);
171  rtcpSenderReportPacket->addReceptionReport(receptionReport);
172  }
173  return rtcpSenderReportPacket;
174  }
175  case RTCP_PT_RR: {
176  auto rtcpReceiverReportPacket = makeShared<RtcpReceiverReportPacket>();
177  rtcpReceiverReportPacket->setVersion(rtcpPacket->getVersion());
178  rtcpReceiverReportPacket->setPadding(rtcpPacket->getPadding());
179  rtcpReceiverReportPacket->setCount(0);
180  rtcpReceiverReportPacket->setPacketType(rtcpPacket->getPacketType());
181  rtcpReceiverReportPacket->setRtcpLength(rtcpPacket->getRtcpLength());
182  rtcpReceiverReportPacket->setSsrc(stream.readUint32Be());
183  for (short i = 0; i < count; ++i) {
184  ReceptionReport *receptionReport = new ReceptionReport();
185  deserializeReceptionReport(stream, *receptionReport);
186  rtcpReceiverReportPacket->addReceptionReport(receptionReport);
187  }
188  return rtcpReceiverReportPacket;
189  }
190  case RTCP_PT_SDES: {
191  auto rtcpSdesPacket = makeShared<RtcpSdesPacket>();
192  rtcpSdesPacket->setVersion(rtcpPacket->getVersion());
193  rtcpSdesPacket->setPadding(rtcpPacket->getPadding());
194  rtcpSdesPacket->setCount(0);
195  rtcpSdesPacket->setPacketType(rtcpPacket->getPacketType());
196  rtcpSdesPacket->setRtcpLength(rtcpPacket->getRtcpLength());
197  for (short i = 0; i < count; ++i) {
198  SdesChunk *sdesChunk = new SdesChunk();
199  deserializeSdesChunk(stream, rtcpSdesPacket, *sdesChunk);
200  rtcpSdesPacket->addSDESChunk(sdesChunk);
201  }
202  return rtcpSdesPacket;
203  }
204  case RTCP_PT_BYE: {
205  auto rtcpByePacket = makeShared<RtcpByePacket>();
206  rtcpByePacket->setVersion(rtcpPacket->getVersion());
207  rtcpByePacket->setPadding(rtcpPacket->getPadding());
208  rtcpByePacket->setCount(1);
209  rtcpByePacket->setPacketType(rtcpPacket->getPacketType());
210  rtcpByePacket->setRtcpLength(rtcpPacket->getRtcpLength());
211  rtcpByePacket->setSsrc(stream.readUint32Be());
212  // more SSRC and optional data may be included
213  while (B(stream.getRemainingLength()) != B(0)) {
214  stream.readByte();
215  }
216  return rtcpByePacket;
217  }
218  default: {
219  rtcpPacket->markIncorrect();
220  return rtcpPacket;
221  }
222  }
223 }

◆ serialize()

void inet::rtp::RtcpPacketSerializer::serialize ( MemoryOutputStream stream,
const Ptr< const Chunk > &  chunk 
) const
overrideprotectedvirtual

Serializes a chunk into a stream by writing all bytes representing the chunk at the end of the stream.

Implements inet::FieldsChunkSerializer.

90 {
91  const auto& rtcpPacket = staticPtrCast<const RtcpPacket>(chunk);
92  B start_position = B(stream.getLength());
93  stream.writeNBitsOfUint64Be(rtcpPacket->getVersion(), 2);
94  stream.writeBit(rtcpPacket->getPadding());
95  short count = rtcpPacket->getCount();
96  stream.writeNBitsOfUint64Be(count, 5);
97  stream.writeByte(rtcpPacket->getPacketType());
98  stream.writeUint16Be(rtcpPacket->getRtcpLength());
99  switch (rtcpPacket->getPacketType()) {
100  case RTCP_PT_SR: {
101  const auto& rtcpSenderReportPacket = staticPtrCast<const RtcpSenderReportPacket>(chunk);
102  stream.writeUint32Be(rtcpSenderReportPacket->getSsrc());
103  auto& senderReport = rtcpSenderReportPacket->getSenderReport();
104  stream.writeUint64Be(senderReport.getNTPTimeStamp());
105  stream.writeUint32Be(senderReport.getRTPTimeStamp());
106  stream.writeUint32Be(senderReport.getPacketCount());
107  stream.writeUint32Be(senderReport.getByteCount());
108  ASSERT(count == rtcpSenderReportPacket->getReceptionReports().size());
109  for (short i = 0; i < count; ++i) {
110  serializeReceptionReport(stream, static_cast<const ReceptionReport *>(rtcpSenderReportPacket->getReceptionReports()[i]));
111  }
112  ASSERT(rtcpSenderReportPacket->getChunkLength() == B(4) + B(24) + B(count * 24));
113  break;
114  }
115  case RTCP_PT_RR: {
116  const auto& rtcpReceiverReportPacket = staticPtrCast<const RtcpReceiverReportPacket>(chunk);
117  stream.writeUint32Be(rtcpReceiverReportPacket->getSsrc());
118  for (short i = 0; i < count; ++i) {
119  serializeReceptionReport(stream, static_cast<const ReceptionReport *>(rtcpReceiverReportPacket->getReceptionReports()[i]));
120  }
121  ASSERT(rtcpReceiverReportPacket->getChunkLength() == B(4) + B(4) + B(count * 24));
122  break;
123  }
124  case RTCP_PT_SDES: {
125  const auto& rtcpSdesPacket = staticPtrCast<const RtcpSdesPacket>(chunk);
126  for (short i = 0; i < count; ++i) {
127  serializeSdesChunk(stream, static_cast<const SdesChunk *>(rtcpSdesPacket->getSdesChunks()[i]));
128  }
129  ASSERT(rtcpSdesPacket->getChunkLength() == (stream.getLength() - start_position));
130  break;
131  }
132  case RTCP_PT_BYE: {
133  const auto& rtcpByePacket = staticPtrCast<const RtcpByePacket>(chunk);
134  stream.writeUint32Be(rtcpByePacket->getSsrc());
135  ASSERT(rtcpByePacket->getChunkLength() == (stream.getLength() - start_position));
136  break;
137  }
138  default: {
139  throw cRuntimeError("Can not serialize RTCP packet: type %d not supported.", rtcpPacket->getPacketType());
140  break;
141  }
142  }
143 }

The documentation for this class was generated from the following files:
inet::rtp::RTCP_PT_RR
@ RTCP_PT_RR
Definition: RtcpPacket_m.h:85
inet::count
int count(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:54
inet::rtp::RTCP_PT_BYE
@ RTCP_PT_BYE
Definition: RtcpPacket_m.h:87
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::rtp::RTCP_PT_SR
@ RTCP_PT_SR
Definition: RtcpPacket_m.h:84
inet::rtp::RtcpPacketType
RtcpPacketType
Enum generated from inet/transportlayer/rtp/RtcpPacket.msg:18 by opp_msgtool.
Definition: RtcpPacket_m.h:82
inet::rtp::RTCP_PT_SDES
@ RTCP_PT_SDES
Definition: RtcpPacket_m.h:86