34 #ifndef OPAL_RTP_RTP_H
35 #define OPAL_RTP_RTP_H
43 #include <ptlib/sockets.h>
44 #include <ptlib/safecoll.h>
52 class RTCP_XR_Metrics;
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 void FlushData();
594 virtual PBoolean WriteData(
601 virtual PBoolean WriteOOBData(
603 bool rewriteTimeStamp =
true
608 virtual PBoolean WriteControl(
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(
725 const ExtendedReportArray & reports
728 RTCP_XR_Metrics * GetExtendedMetrics()
const {
return m_metrics; }
729 #endif // OPAL_RTCP_XR
754 PString GetCanonicalName()
const;
758 void SetCanonicalName(
const PString & name);
762 PString GetToolName()
const;
766 void SetToolName(
const PString & name);
776 PBoolean autoDeleteUserData =
true
789 void SetAnySyncSource(
791 ) { allowAnySyncSource = allow; }
795 void SetIgnorePayloadTypeChanges(
797 ) { ignorePayloadTypeChanges = ignore; }
805 void SetReportTimeInterval(
806 const PTimeInterval & interval
807 ) { m_reportTimer.RunContinuous(interval); }
815 void SetTxStatisticsInterval(
825 void SetRxStatisticsInterval(
831 void ClearStatistics();
864 DWORD GetPacketsTooLate()
const;
868 DWORD GetPacketOverruns()
const;
918 enum { JitterRoundingGuardBits = 4 };
923 DWORD
GetAvgJitterTime()
const {
return (jitterLevel>>JitterRoundingGuardBits)/GetJitterTimeUnits(); }
928 DWORD
GetMaxJitterTime()
const {
return (maximumJitterLevel>>JitterRoundingGuardBits)/GetJitterTimeUnits(); }
943 virtual void SendIntraFrameRequest(
bool rfc2032,
bool pictureLoss);
949 virtual void SendTemporalSpatialTradeOff(
unsigned tradeOff);
954 virtual void SetEncoding(
const PString & newEncoding);
973 void SetFailed(
bool v)
976 bool HasFailed()
const
980 #define PDECLARE_RTPFilterNotifier(cls, fn) PDECLARE_NOTIFIER2(RTP_DataFrame, cls, fn, RTP_Session::SendReceiveStatus &)
981 #define PCREATE_RTPFilterNotifier(fn) PCREATE_NOTIFIER2(fn, RTP_Session::SendReceiveStatus &)
983 void AddFilter(
const FilterNotifier & filter);
985 virtual void SendBYE();
988 RTP_Session::ReceiverReportArray BuildReceiverReportArray(
const RTP_ControlFrame & frame, PINDEX offset);
1069 RTCP_XR_Metrics * m_metrics;
1070 friend class RTCP_XR_Metrics;
1087 PDECLARE_NOTIFIER(PTimer,
RTP_Session, SendReport);
1127 virtual void FlushData();
1137 virtual PBoolean WriteOOBData(
RTP_DataFrame & frame,
bool setTimeStamp =
true);
1151 virtual PString GetLocalHostName();
1156 virtual PBoolean ModifyQOS(
RTP_QOS * rtpqos);
1162 virtual PBoolean Open(
1163 PIPSocket::Address localAddress,
1166 BYTE ipTypeOfService,
1167 PNatMethod * natMethod = NULL,
1174 virtual void Reopen(PBoolean isReading);
1185 virtual void SetLocalAddress(
1186 const PIPSocket::Address & addr
1187 ) { localAddress = addr; }
1219 virtual PBoolean SetRemoteSocketInfo(
1220 PIPSocket::Address address,
1227 virtual void ApplyQOS(
1228 const PIPSocket::Address & addr
1232 virtual int GetDataSocketHandle()
const
1233 {
return dataSocket != NULL ? dataSocket->GetHandle() : -1; }
1235 virtual int GetControlSocketHandle()
const
1236 {
return controlSocket != NULL ? controlSocket->GetHandle() : -1; }
1240 virtual int WaitForPDU(PUDPSocket & dataSocket, PUDPSocket & controlSocket,
const PTimeInterval & timer);
1241 virtual int Internal_WaitForPDU(PUDPSocket & dataSocket, PUDPSocket & controlSocket,
const PTimeInterval & timer);
1253 PBoolean fromDataChannel
1257 virtual bool WriteDataOrControlPDU(
1258 const BYTE * framePtr,
1263 virtual void SetEncoding(
const PString & newEncoding);
1304 virtual void OnFinish();
1306 virtual PBoolean WriteData(
RTP_DataFrame & frame,
bool oob);
1315 virtual int WaitForPDU(PUDPSocket & dataSocket, PUDPSocket & controlSocket,
const PTimeInterval &);
1352 #endif // OPAL_RTP_RTP_H