1 // Copyright (C) 2002 Federico Montesino Pouzols <fedemp@altern.org>.
2 //
3 // This program is free software; you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation; either version 2 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 //
17 // As a special exception, you may use this file as part of a free software
18 // library without restriction. Specifically, if other files instantiate
19 // templates or use macros or inline functions from this file, or you compile
20 // this file and link it with other files to produce an executable, this
21 // file does not by itself cause the resulting executable to be covered by
22 // the GNU General Public License. This exception does not however
23 // invalidate any other reasons why the executable file might be covered by
24 // the GNU General Public License.
25 //
26 // This exception applies only to the code released under the name GNU
27 // ccRTP. If you copy code from other releases into a copy of GNU
28 // ccRTP, as the General Public License permits, the exception does
29 // not apply to the code that you add in this way. To avoid misleading
30 // anyone as to the status of such modified files, you must delete
31 // this exception notice from them.
32 //
33 // If you write modifications of your own for GNU ccRTP, it is your choice
34 // whether to permit this exception to apply to your modifications.
35 // If you do not wish that, delete this exception notice.
36 //
37
38 #ifndef CCXX_RTP_RTPPKT_H_
39 #define CCXX_RTP_RTPPKT_H_
40
44
45 #ifdef CCXX_NAMESPACES
46 namespace ost {
47 #endif
48
74
76 {
77 private:
80
81 public:
94 RTPPacket(
const unsigned char*
const block,
size_t len,
95 bool duplicate = false);
96
109
116 inline uint32
118 { return hdrSize; }
119
123 inline const uint8* const
125 { return (uint8*)(buffer + getHeaderSize()); }
126
130 inline uint32
132 { return payloadSize; }
133
139 {
return static_cast<PayloadType >(getHeader()->payload); }
140
144 inline uint16
146 { return cachedSeqNum; }
147
151 inline uint32
153 { return cachedTimestamp; }
154
158 inline uint8
160 { return getHeader()->version; }
161
166 inline bool
168 { return getHeader()->padding; }
169
176 inline uint8
178 { return buffer[total - 1]; }
179
186 inline bool
188 { return getHeader()->marker; }
189
195 inline bool
197 { return getHeader()->extension; }
198
203 inline uint16
205 { return getHeader()->cc; }
206
214 inline const uint32*
216 { return static_cast<const uint32*>(&(getHeader()->sources[1])); }
217
230 inline uint16
232 { return (isExtended()? getHeaderExt()->undefined : 0); }
233
245 inline uint32
247 { return (isExtended()?
248 (static_cast<uint32>(ntohs(getHeaderExt()->length)) << 2) :
249 0); }
250
257 inline const unsigned char*
259 { return (isExtended() ?
260 (reinterpret_cast<const unsigned char*>(getHeaderExt()) +
262 NULL); }
263
270 inline const unsigned char* const
272 { return buffer; }
273
280 inline uint32
282 { return total; }
283
284 inline uint32
286 { return total + srtpLength; }
287
288 inline size_t
291
303 void reComputePayLength(bool padding);
304
305 protected:
310 { endPacket(); }
311
315 void
316 endPacket();
317
323 inline RTPFixedHeader*
326
327 inline void
329 { getHeader()->extension = e; }
330
338 inline const RTPHeaderExt*
340 {
342 return (reinterpret_cast<RTPHeaderExt*>(buffer + fixsize));
343 }
344
350 inline uint32
352 { return ntohl(getHeader()->timestamp); }
353
354 inline void
356 { memcpy(buffer + pos,src,len); }
357
362
370
377
380
383
384 private:
391
392 #ifdef CCXX_PACKED
393 #pragma pack(1)
394 #endif
395
406 {
407 #if __BYTE_ORDER == __BIG_ENDIAN
408 unsigned char version:2;
410 unsigned char padding:1;
411 unsigned char extension:1;
413 unsigned char marker:1;
414 unsigned char payload:7;
415 #else
416 unsigned char cc:4;
418 unsigned char extension:1;
419 unsigned char padding:1;
420 unsigned char version:2;
421 unsigned char payload:7;
422 unsigned char marker:1;
423 #endif
427 };
428
437 public:
439 {
440 #if __BYTE_ORDER == __BIG_ENDIAN
445 uint16 duration : 16;
446 #else
447 uint8 event : 8;
448 uint8 vol : 6;
449 bool rbit : 1;
450 bool ebit : 1;
451 uint16 duration : 16;
452 #endif
453 };
454
455 private:
464 {
467 };
468 #ifdef CCXX_PACKED
469 #pragma pack()
470 #endif
471
472 /* definitions for access to most common 2833 fields... */
473
474 public:
482
489 {return ntohs(getRaw2833Payload()->duration);}
490
497 {getRaw2833Payload()->duration = htons(timestamp);}
498 };
499
511 {
512 public:
540 const unsigned char* const hdrext, uint32 hdrextlen,
541 const unsigned char* const data, size_t datalen,
543
565 const unsigned char* const data, size_t datalen,
567
586
588 { }
589
593 inline void
595 { getHeader()->payload = pt; }
596
602 inline void
604 {
605 cachedSeqNum = seq;
606 getHeader()->sequence = htons(seq);
607 }
608
612 inline void
614 {
615 cachedTimestamp = pts;
616 getHeader()->timestamp = htonl(pts);
617 }
618
625 inline void
627 { getHeader()->sources[0] = htonl(ssrc); }
628
636 inline void
638 { getHeader()->sources[0] = ssrc; }
639
647 inline void
649 { getHeader()->marker = mark; }
650
658
662 inline bool
664 {
return ( this->getSeqNum() == p.
getSeqNum() ); }
665
669 inline bool
671 {
return ( this->getSeqNum() != p.
getSeqNum() ); }
672
673 private:
679
686
691 void setCSRCArray(const uint32* const csrcs, uint16 numcsrc);
692
693 };
694
708 {
709 public:
723
725 { }
726
732 inline bool
734 { return headerValid; }
735
742 inline uint32
744 { return cachedSSRC; }
745
756 int32
758
763 inline bool
765 {
return ( (this->getSeqNum() == p.
getSeqNum()) &&
766 (this->getSSRC() == p.
getSSRC()) ); }
767
772 inline bool
774 { return !( *this == p ); }
775
776 private:
782
789
794 // Masks for RTP header validation: types matching RTCP SR or
795 // RR must be rejected to avoid accepting misaddressed RTCP
796 // packets.
799 };
800 // rtppacket
802
803 #ifdef CCXX_NAMESPACES
804 }
805 #endif
806
807 #endif // ndef CCXX_RTP_RTPPKT_H_
808
uint32 total
total length, including header, payload and padding
bool isPadded() const
Ask whether the packet contains padding bytes at the end.
void setMarker(bool mark)
Specify the value of the marker bit.
size_t getSizeOfFixedHeader() const
A base class for both IncomingRTPPkt and OutgoingRTPPkt.
The implementation for a SRTP cryptographic context.
PayloadType getPayloadType() const
RTP packets received from other participants.
uint32 getRawTimestamp() const
Obtain the absolute timestamp carried in the packet header.
const uint32 * getCSRCs() const
Get the 32-bit identifiers of the contributing sources for the packet as an array, of length getCSRCsCount().
uint32 getSSRC() const
Get synchronization source numeric identifier.
void setSeqNum(uint16 seq)
Sets the sequence number in the header.
unsigned char * buffer
packet in memory
void setSSRCNetwork(uint32 ssrc) const
Set synchronization source numeric identifier.
static const uint16 RTP_INVALID_PT_VALUE
uint32 getTimestamp() const
uint32 getHdrExtSize() const
Get the length (in octets) of the data contained in the header extension.
const RTPHeaderExt * getHeaderExt() const
Get a pointer to RTPHeaderExt pointing after the RTP header (fixed part plus contributing sources)...
bool isHeaderValid()
Get validity of this packet.
const uint8 *const getPayload() const
bool duplicated
whether the object was contructed with duplicated = true
bool operator!=(const OutgoingRTPPkt &p) const
Outgoing packets are not equal if their sequence numbers differ.
const unsigned char * getHdrExtContent() const
Get the content of the header extension.
uint16 getHdrExtUndefined() const
Get the first 16 bits (in network order) of the header of the RTP header extension.
uint32 srtpDataOffset
Offset into packet memory pointing to area for SRTP data.
RTPFixedHeader * getHeader() const
Return low level structure for the header of the packet.
bool operator==(const OutgoingRTPPkt &p) const
Outgoing packets are equal if their sequence numbers match.
uint8 getProtocolVersion() const
void setSSRC(uint32 ssrc) const
Set synchronization source numeric identifier.
uint32 cachedTimestamp
Packet timestamp in host order (includes initial shift).
virtual ~RTPPacket()
Destructor, free the buffer provided in the constructor.
uint32 getRawPacketSize() const
Get the raw packet length, including header, extension, payload and padding.
bool isExtended() const
Ask whether the packet contains header extensions.
bool operator==(const IncomingRTPPkt &p) const
Two incoming packets are equal if they come from sources with the same SSRC and have the same sequenc...
static const uint16 RTP_INVALID_PT_MASK
void set2833Duration(uint16 timestamp)
Set 2833 duration field.
const unsigned char *const getRawPacket() const
Get the raw packet as it will be sent through the network.
uint16 get2833Duration(void)
Fetch 2833 duration field.
uint32 cachedSSRC
SSRC 32-bit identifier in host order.
uint8 getPaddingSize() const
Get the number of octets padding the end of the payload section.
struct RFC2833Payload * getRaw2833Payload(void)
Fetch a raw 2833 packet.
uint32 getPayloadSize() const
bool headerValid
Header validity, checked at construction time.
Base elements for RTP stacks: constants, types and global functions.
uint16 getCSRCsCount() const
Get the number of contributing sources specified in the packet header.
void setTimestamp(uint32 pts)
void setPayloadType(PayloadType pt)
void setbuffer(const void *src, size_t len, size_t pos)
bool isMarked() const
Ask whether the packet is marked (for isntance, is a new talk spurt in some audio profiles)...
bool operator!=(const IncomingRTPPkt &p) const
Two incoming packets are not equal if they come from different sources or have different sequence num...
uint32 getRawPacketSizeSrtp() const
a structure defining RFC2833 Telephony events.
void setExtension(bool e)
uint32 hdrSize
size of the header, including contributing sources and extensions
int32 srtpLength
Lebgth of additional SRTP data.
uint16 cachedSeqNum
Packet sequence number in host order.
uint32 getHeaderSize() const
Get the length of the header, including contributing sources identifiers and header extension...
uint32 payloadSize
note: payload (not full packet) size.
uint8 PayloadType
RTP payload type numeric identifier.