34 #ifndef OPAL_RTP_RTP_H
35 #define OPAL_RTP_RTP_H
43 #include <ptlib/sockets.h>
44 #include <ptlib/safecoll.h>
77 RTP_DataFrame(
const BYTE * data, PINDEX len, PBoolean dynamic =
true);
130 PBoolean
GetMarker()
const {
return (theArray[1]&0x80) != 0; }
134 void SetPadding(
bool v) {
if (v) theArray[0] |= 0x20;
else theArray[0] &= 0xdf; }
169 virtual void PrintOn(ostream & strm)
const;
197 unsigned GetVersion()
const {
return (BYTE)theArray[compoundOffset]>>6; }
199 unsigned GetCount()
const {
return (BYTE)theArray[compoundOffset]&0x1f; }
200 void SetCount(
unsigned count);
203 e_IntraFrameRequest = 192,
204 e_SenderReport = 200,
205 e_ReceiverReport = 201,
206 e_SourceDescription = 202,
209 e_TransportLayerFeedBack = 205,
210 e_PayloadSpecificFeedBack = 206,
211 e_ExtendedReport = 207
217 PINDEX
GetPayloadSize()
const {
return 4*(*(PUInt16b *)&theArray[compoundOffset+2]); }
222 PBoolean ReadNextPacket();
223 PBoolean StartNewPacket();
226 PINDEX GetCompoundSize()
const;
228 void Reset(PINDEX size);
241 void SetLostPackets(
unsigned lost);
311 void StartSourceDescription(
315 void AddSourceDescriptionItem(
321 unsigned GetFbType()
const {
return (BYTE)theArray[compoundOffset]&0x1f; }
322 void SetFbType(
unsigned type, PINDEX fciSize);
325 e_PictureLossIndication = 1,
332 e_ApplicationLayerFbMessage = 15
410 friend ostream &
operator<<(ostream & strm, FaxCompression compression);
455 virtual void OnTxStatistics(
465 virtual void OnRxStatistics(
475 virtual void OnTxIntraFrameRequest(
484 virtual void OnRxIntraFrameRequest(
492 virtual void SessionFailing(
547 void SetJitterBufferSize(
548 unsigned minJitterDelay,
549 unsigned maxJitterDelay,
550 unsigned timeUnits = 0,
551 PINDEX packetSize = 2048
559 unsigned GetJitterBufferSize()
const;
575 virtual PBoolean ReadBufferedData(
584 virtual PBoolean ReadData(
590 virtual PBoolean WriteData(
597 virtual PBoolean WriteOOBData(
599 bool rewriteTimeStamp =
true
604 virtual PBoolean WriteControl(
610 virtual PBoolean SendReport();
626 virtual PString GetLocalHostName() = 0;
641 virtual SendReceiveStatus Internal_OnSendData(
RTP_DataFrame & frame);
643 virtual SendReceiveStatus OnSendControl(
RTP_ControlFrame & frame, PINDEX & len);
644 virtual SendReceiveStatus Internal_OnSendControl(
RTP_ControlFrame & frame, PINDEX & len);
646 virtual SendReceiveStatus OnReceiveData(
RTP_DataFrame & frame);
647 virtual SendReceiveStatus Internal_OnReceiveData(
RTP_DataFrame & frame);
678 virtual void OnRxSenderReport(
const SenderReport & sender,
679 const ReceiverReportArray & reports);
680 virtual void OnRxReceiverReport(DWORD src,
681 const ReceiverReportArray & reports);
682 virtual void OnReceiverReports(
const ReceiverReportArray & reports);
694 virtual void OnRxSourceDescription(
const SourceDescriptionArray & descriptions);
696 virtual void OnRxGoodbye(
const PDWORDArray & sources,
697 const PString & reason);
699 virtual void OnRxApplDefined(
const PString & type,
unsigned subtype, DWORD src,
700 const BYTE * data, PINDEX size);
703 class ExtendedReport :
public PObject {
704 PCLASSINFO(ExtendedReport, PObject);
708 DWORD sourceIdentifier;
713 DWORD roundTripDelay;
721 PARRAY(ExtendedReportArray, ExtendedReport);
723 virtual void OnRxExtendedReport(DWORD src,
724 const ExtendedReportArray & reports);
750 PString GetCanonicalName()
const;
754 void SetCanonicalName(
const PString & name);
758 PString GetToolName()
const;
762 void SetToolName(
const PString & name);
772 PBoolean autoDeleteUserData =
true
785 void SetAnySyncSource(
787 ) { allowAnySyncSource = allow; }
791 void SetIgnorePayloadTypeChanges(
793 ) { ignorePayloadTypeChanges = ignore; }
801 void SetReportTimeInterval(
802 const PTimeInterval & interval
803 ) { reportTimeInterval = interval; }
807 PTimeInterval GetReportTimer()
808 {
return reportTimer; }
816 void SetTxStatisticsInterval(
826 void SetRxStatisticsInterval(
832 void ClearStatistics();
865 DWORD GetPacketsTooLate()
const;
869 DWORD GetPacketOverruns()
const;
919 enum { JitterRoundingGuardBits = 4 };
924 DWORD
GetAvgJitterTime()
const {
return (jitterLevel>>JitterRoundingGuardBits)/GetJitterTimeUnits(); }
929 DWORD
GetMaxJitterTime()
const {
return (maximumJitterLevel>>JitterRoundingGuardBits)/GetJitterTimeUnits(); }
944 virtual void SendIntraFrameRequest(
bool rfc2032,
bool pictureLoss);
950 virtual void SendTemporalSpatialTradeOff(
unsigned tradeOff);
955 virtual void SetEncoding(
const PString & newEncoding);
974 void SetFailed(
bool v)
977 bool HasFailed()
const
981 #define PDECLARE_RTPFilterNotifier(cls, fn) PDECLARE_NOTIFIER2(RTP_DataFrame, cls, fn, RTP_Session::SendReceiveStatus &)
982 #define PCREATE_RTPFilterNotifier(fn) PCREATE_NOTIFIER2(fn, RTP_Session::SendReceiveStatus &)
984 void AddFilter(
const FilterNotifier & filter);
987 const RTCP_XR_Metrics & GetMetrics()
const {
return m_metrics; }
990 virtual void SendBYE();
999 void OnRxSenderReportToMetrics(
const RTP_ControlFrame & frame, PINDEX offset);
1079 RTCP_XR_Metrics m_metrics;
1141 virtual PBoolean WriteOOBData(
RTP_DataFrame & frame,
bool setTimeStamp =
true);
1155 virtual PString GetLocalHostName();
1160 virtual PBoolean ModifyQOS(
RTP_QOS * rtpqos);
1166 virtual PBoolean Open(
1167 PIPSocket::Address localAddress,
1170 BYTE ipTypeOfService,
1171 PNatMethod * natMethod = NULL,
1178 virtual void Reopen(PBoolean isReading);
1189 virtual void SetLocalAddress(
1190 const PIPSocket::Address & addr
1191 ) { localAddress = addr; }
1223 virtual PBoolean SetRemoteSocketInfo(
1224 PIPSocket::Address address,
1231 virtual void ApplyQOS(
1232 const PIPSocket::Address & addr
1236 virtual int GetDataSocketHandle()
const
1237 {
return dataSocket != NULL ? dataSocket->GetHandle() : -1; }
1239 virtual int GetControlSocketHandle()
const
1240 {
return controlSocket != NULL ? controlSocket->GetHandle() : -1; }
1244 virtual int WaitForPDU(PUDPSocket & dataSocket, PUDPSocket & controlSocket,
const PTimeInterval & timer);
1245 virtual int Internal_WaitForPDU(PUDPSocket & dataSocket, PUDPSocket & controlSocket,
const PTimeInterval & timer);
1257 PBoolean fromDataChannel
1261 virtual bool WriteDataOrControlPDU(
1262 const BYTE * framePtr,
1267 virtual void SetEncoding(
const PString & newEncoding);
1309 virtual void OnFinish();
1311 virtual PBoolean WriteData(
RTP_DataFrame & frame,
bool oob);
1320 virtual int WaitForPDU(PUDPSocket & dataSocket, PUDPSocket & controlSocket,
const PTimeInterval &);
1357 #endif // OPAL_RTP_RTP_H