MythTV  master
rtpdatapacket.h
Go to the documentation of this file.
1 /* -*- Mode: c++ -*-
2  * Copyright (c) 2012 Digital Nirvana, Inc.
3  * Distributed as part of MythTV under GPL v2 and later.
4  */
5 
6 #ifndef RTP_DATA_PACKET_H
7 #define RTP_DATA_PACKET_H
8 
9 #include <limits> // workaround QTBUG-90395
10 
11 #include <QtEndian>
12 
14 #include "udppacket.h"
15 
16 #ifdef _MSC_VER
17 # include <WinSock2.h>
18 #endif
19 
32 class RTPDataPacket : public UDPPacket
33 {
34  public:
35  RTPDataPacket(const RTPDataPacket&) = default;
36  explicit RTPDataPacket(const UDPPacket &o) : UDPPacket(o), m_off(0) { }
37  explicit RTPDataPacket(uint64_t key) : UDPPacket(key), m_off(0) { }
38  RTPDataPacket(void) : UDPPacket(0ULL) { }
39 
40  RTPDataPacket& operator=(const RTPDataPacket&) = default;
41 
42  bool IsValid(void) const override // UDPPacket
43  {
44  if (m_data.size() < 12)
45  {
46  return false;
47  }
48  if (2 != GetVersion())
49  {
50  LOG(VB_GENERAL, LOG_INFO, QString("Version incorrect %1")
51  .arg(GetVersion()));
52  return false;
53  }
54 
55  int off = 12 + 4 * GetCSRCCount();
56  if (off > m_data.size())
57  {
58  LOG(VB_GENERAL, LOG_INFO, QString("off %1 > sz %2")
59  .arg(off).arg(m_data.size()));
60  return false;
61  }
62  if (HasExtension())
63  {
64  uint ext_size = m_data[off+2] << 8 | m_data[off+3];
65  off += 4 * (1 + ext_size);
66  }
67  if (off > m_data.size())
68  {
69  LOG(VB_GENERAL, LOG_INFO, QString("off + ext %1 > sz %2")
70  .arg(off).arg(m_data.size()));
71  return false;
72  }
73  m_off = off;
74 
75  return true;
76  }
77 
78  uint GetVersion(void) const { return (m_data[0] >> 6) & 0x3; }
79  bool HasPadding(void) const { return (m_data[0] >> 5) & 0x1; }
80  bool HasExtension(void) const { return (m_data[0] >> 4) & 0x1; }
81  uint GetCSRCCount(void) const { return m_data[0] & 0xf; }
82 
83  enum {
90  };
91 
92  uint GetPayloadType(void) const
93  {
94  return m_data[1] & 0x7f;
95  }
96 
97  uint GetSequenceNumber(void) const
98  {
99  return qFromBigEndian(*reinterpret_cast<const uint16_t*>(m_data.data()+2));
100  }
101 
102  uint GetTimeStamp(void) const
103  {
104  return qFromBigEndian(*reinterpret_cast<const uint32_t*>(m_data.data()+4));
105  }
106 
108  {
109  return qFromBigEndian(*reinterpret_cast<const uint32_t*>(m_data.data()+8));
110  }
111 
113  {
114  const uint32_t tmp =
115  *reinterpret_cast<const uint32_t*>(m_data.data() + 12 + 4 * i);
116  return qFromBigEndian(tmp);
117  }
118 
119  uint GetPayloadOffset(void) const { return m_off; }
120 
121  uint GetPaddingSize(void) const
122  {
123  if (!HasPadding())
124  return 0;
125  return m_data[m_data.size()-1];
126  }
127 
128  protected:
129  mutable uint m_off { 0 };
130 };
131 
132 #endif // RTP_DATA_PACKET_H
RTPDataPacket::GetTimeStamp
uint GetTimeStamp(void) const
Definition: rtpdatapacket.h:102
RTPDataPacket::kPayLoadTypeH261Video
@ kPayLoadTypeH261Video
Definition: rtpdatapacket.h:86
RTPDataPacket::operator=
RTPDataPacket & operator=(const RTPDataPacket &)=default
RTPDataPacket::kPayLoadTypeMPEG2Video
@ kPayLoadTypeMPEG2Video
Definition: rtpdatapacket.h:87
RTPDataPacket::GetVersion
uint GetVersion(void) const
Definition: rtpdatapacket.h:78
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
RTPDataPacket::kPayLoadTypeH263Video
@ kPayLoadTypeH263Video
Definition: rtpdatapacket.h:89
tmp
static guint32 * tmp
Definition: goom_core.cpp:26
UDPPacket::m_data
QByteArray m_data
Definition: udppacket.h:42
RTPDataPacket::GetContributingSource
uint GetContributingSource(uint i) const
Definition: rtpdatapacket.h:112
RTPDataPacket::RTPDataPacket
RTPDataPacket(void)
Definition: rtpdatapacket.h:38
RTPDataPacket::GetPayloadOffset
uint GetPayloadOffset(void) const
Definition: rtpdatapacket.h:119
RTPDataPacket::RTPDataPacket
RTPDataPacket(const UDPPacket &o)
Definition: rtpdatapacket.h:36
mythlogging.h
RTPDataPacket::GetSynchronizationSource
uint GetSynchronizationSource(void) const
Definition: rtpdatapacket.h:107
RTPDataPacket::GetCSRCCount
uint GetCSRCCount(void) const
Definition: rtpdatapacket.h:81
RTPDataPacket::HasPadding
bool HasPadding(void) const
Definition: rtpdatapacket.h:79
uint
unsigned int uint
Definition: compat.h:81
RTPDataPacket::GetPaddingSize
uint GetPaddingSize(void) const
Definition: rtpdatapacket.h:121
RTPDataPacket::GetSequenceNumber
uint GetSequenceNumber(void) const
Definition: rtpdatapacket.h:97
udppacket.h
RTPDataPacket::GetPayloadType
uint GetPayloadType(void) const
Definition: rtpdatapacket.h:92
RTPDataPacket::m_off
uint m_off
Definition: rtpdatapacket.h:129
RTPDataPacket::kPayLoadTypePCMAudio
@ kPayLoadTypePCMAudio
Definition: rtpdatapacket.h:84
RTPDataPacket::HasExtension
bool HasExtension(void) const
Definition: rtpdatapacket.h:80
RTPDataPacket
RTP Data Packet.
Definition: rtpdatapacket.h:32
uint16_t
unsigned short uint16_t
Definition: iso6937tables.h:3
RTPDataPacket::kPayLoadTypeTS
@ kPayLoadTypeTS
Definition: rtpdatapacket.h:88
RTPDataPacket::kPayLoadTypeMPEGAudio
@ kPayLoadTypeMPEGAudio
Definition: rtpdatapacket.h:85
RTPDataPacket::RTPDataPacket
RTPDataPacket(uint64_t key)
Definition: rtpdatapacket.h:37
UDPPacket
UDP Packet.
Definition: udppacket.h:20
RTPDataPacket::IsValid
bool IsValid(void) const override
IsValid() must return true before any data access methods are called, other than GetDataReference() a...
Definition: rtpdatapacket.h:42