Darwin-Streaming-Server/RTCPUtilitiesLib/RTCPAPPQTSSPacket.h
Darren VanBuren 849723c9cf Add even more of the source
This should be about everything needed to build so far?
2017-03-07 17:14:16 -08:00

272 lines
9.6 KiB
C++

/*
*
* @APPLE_LICENSE_HEADER_START@
*
* Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_LICENSE_HEADER_END@
*
*/
/*
File: RTCPAPPQTSSPacket.h
Contains: RTCPAPPQTSSPacket de-packetizing classes
*/
#ifndef _RTCPAPPQTSSPACKET_H_
#define _RTCPAPPQTSSPACKET_H_
#include "RTCPAPPPacket.h"
#include "StrPtrLen.h"
/****** RTCPCompressedQTSSPacket is the packet type that the client actually sends ******/
class RTCPCompressedQTSSPacket : public RTCPAPPPacket
{
public:
RTCPCompressedQTSSPacket(Bool16 debug = false);
virtual ~RTCPCompressedQTSSPacket() {}
//Call this before any accessor method. Returns true if successful, false otherwise
virtual Bool16 ParseAPPData(UInt8* inPacketBuffer, UInt32 inPacketLength);
// Call to parse if you don't know what kind of packet this is
Bool16 ParseCompressedQTSSPacket(UInt8* inPacketBuffer, UInt32 inPacketLength);
inline UInt32 GetQTSSReportSourceID();
inline UInt16 GetQTSSPacketVersion();
inline UInt16 GetQTSSPacketLength(); //In 'UInt32's
inline UInt32 GetReceiverBitRate() {return fReceiverBitRate;}
inline UInt16 GetAverageLateMilliseconds() {return fAverageLateMilliseconds;}
inline UInt16 GetPercentPacketsLost() {return fPercentPacketsLost;}
inline UInt16 GetAverageBufferDelayMilliseconds() {return fAverageBufferDelayMilliseconds;}
inline Bool16 GetIsGettingBetter() {return fIsGettingBetter;}
inline Bool16 GetIsGettingWorse() {return fIsGettingWorse;}
inline UInt32 GetNumEyes() {return fNumEyes;}
inline UInt32 GetNumEyesActive() {return fNumEyesActive;}
inline UInt32 GetNumEyesPaused() {return fNumEyesPaused;}
inline UInt32 GetOverbufferWindowSize() {return fOverbufferWindowSize;}
//Proposed - are these there yet?
inline UInt32 GetTotalPacketReceived() {return fTotalPacketsReceived;}
inline UInt16 GetTotalPacketsDropped() {return fTotalPacketsDropped;}
inline UInt16 GetTotalPacketsLost() {return fTotalPacketsLost;}
inline UInt16 GetClientBufferFill() {return fClientBufferFill;}
inline UInt16 GetFrameRate() {return fFrameRate;}
inline UInt16 GetExpectedFrameRate() {return fExpectedFrameRate;}
inline UInt16 GetAudioDryCount() {return fAudioDryCount;}
virtual void Dump(); //Override
static void GetTestPacket(StrPtrLen* resultPtr) {}
UInt32 fReceiverBitRate;
UInt16 fAverageLateMilliseconds;
UInt16 fPercentPacketsLost;
UInt16 fAverageBufferDelayMilliseconds;
Bool16 fIsGettingBetter;
Bool16 fIsGettingWorse;
UInt32 fNumEyes;
UInt32 fNumEyesActive;
UInt32 fNumEyesPaused;
UInt32 fOverbufferWindowSize;
//Proposed - are these there yet?
UInt32 fTotalPacketsReceived;
UInt16 fTotalPacketsDropped;
UInt16 fTotalPacketsLost;
UInt16 fClientBufferFill;
UInt16 fFrameRate;
UInt16 fExpectedFrameRate;
UInt16 fAudioDryCount;
enum // QTSS App Header offsets
{
kQTSSDataOffset = 20, // in bytes from packet start
kQTSSReportSourceIDOffset = 3, //in 32 bit words SSRC for this report
kQTSSPacketVersionOffset = 4, // in 32bit words
kQTSSPacketVersionMask = 0xFFFF0000UL,
kQTSSPacketVersionShift = 16,
kQTSSPacketLengthOffset = 4, // in 32bit words
kQTSSPacketLengthMask = 0x0000FFFFUL,
};
enum // QTSS App Data Offsets
{
//Individual item offsets/masks
kQTSSItemTypeOffset = 0, //SSRC for this report
kQTSSItemTypeMask = 0xFFFF0000UL,
kQTSSItemTypeShift = 16,
kQTSSItemVersionOffset = 0,
kQTSSItemVersionMask = 0x0000FF00UL,
kQTSSItemVersionShift = 8,
kQTSSItemLengthOffset = 0,
kQTSSItemLengthMask = 0x000000FFUL,
kQTSSItemDataOffset = 4,
//version we support currently
kSupportedCompressedQTSSVersion = 0
};
enum //The 4 character name in the APP packet
{
kCompressedQTSSPacketName = FOUR_CHARS_TO_INT('Q', 'T', 'S', 'S') //QTSS
};
private:
void ParseAndStore();
};
inline UInt32 RTCPCompressedQTSSPacket::GetQTSSReportSourceID()
{
return (UInt32) ntohl( ((UInt32*)this->GetPacketBuffer())[kQTSSReportSourceIDOffset] ) ;
}
inline UInt16 RTCPCompressedQTSSPacket::GetQTSSPacketVersion()
{
UInt32 field = ((UInt32*)this->GetPacketBuffer())[kQTSSPacketVersionOffset];
UInt16 vers = (UInt16) ( ( ntohl(field) & kQTSSPacketVersionMask) >> kQTSSPacketVersionShift );
return vers;
}
inline UInt16 RTCPCompressedQTSSPacket::GetQTSSPacketLength()
{
UInt32 field = ((UInt32*)this->GetPacketBuffer())[kQTSSPacketLengthOffset];
return (UInt16) ( (UInt32) ntohl(field) & kQTSSPacketLengthMask );
}
/*
QTSS APP: QTSS Application-defined RTCP packet
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P| subtype | PT=APP=204 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| name (ASCII) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <---- app data start
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| version | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| field name='ob' other | version=0 | length=4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Over-buffer window size in bytes |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
fieldnames = rr, lt, ls, dl, :), :|, :(, ey, pr, pd, pl, bl, fr, xr, d#, ob
*/
/****** RTCPqtssPacket is apparently no longer sent by the client ******/
class RTCPqtssPacket : public RTCPAPPPacket
{
public:
RTCPqtssPacket() : RTCPAPPPacket() {}
virtual ~RTCPqtssPacket() {}
//Call this before any accessor method. Returns true if successful, false otherwise
virtual Bool16 ParseAPPData(UInt8* inPacketBuffer, UInt32 inPacketLength);
//Call this before any accessor method. Returns true if successful, false otherwise
Bool16 ParseQTSSPacket(UInt8* inPacketBuffer, UInt32 inPacketLength);
inline UInt32 GetReceiverBitRate() {return fReceiverBitRate;}
inline UInt32 GetAverageLateMilliseconds() {return fAverageLateMilliseconds;}
inline UInt32 GetPercentPacketsLost() {return fPercentPacketsLost;}
inline UInt32 GetAverageBufferDelayMilliseconds() {return fAverageBufferDelayMilliseconds;}
inline Bool16 GetIsGettingBetter() {return fIsGettingBetter;}
inline Bool16 GetIsGettingWorse() {return fIsGettingWorse;}
inline UInt32 GetNumEyes() {return fNumEyes;}
inline UInt32 GetNumEyesActive() {return fNumEyesActive;}
inline UInt32 GetNumEyesPaused() {return fNumEyesPaused;}
//Proposed - are these there yet?
inline UInt32 GetTotalPacketReceived() {return fTotalPacketsReceived;}
inline UInt32 GetTotalPacketsDropped() {return fTotalPacketsDropped;}
inline UInt32 GetClientBufferFill() {return fClientBufferFill;}
inline UInt32 GetFrameRate() {return fFrameRate;}
inline UInt32 GetExpectedFrameRate() {return fExpectedFrameRate;}
inline UInt32 GetAudioDryCount() {return fAudioDryCount;}
private:
void ParseAndStore();
UInt32 fReportSourceID;
UInt16 fAppPacketVersion;
UInt16 fAppPacketLength; //In 'UInt32's
UInt32 fReceiverBitRate;
UInt32 fAverageLateMilliseconds;
UInt32 fPercentPacketsLost;
UInt32 fAverageBufferDelayMilliseconds;
Bool16 fIsGettingBetter;
Bool16 fIsGettingWorse;
UInt32 fNumEyes;
UInt32 fNumEyesActive;
UInt32 fNumEyesPaused;
//Proposed - are these there yet?
UInt32 fTotalPacketsReceived;
UInt32 fTotalPacketsDropped;
UInt32 fClientBufferFill;
UInt32 fFrameRate;
UInt32 fExpectedFrameRate;
UInt32 fAudioDryCount;
enum
{
//Individual item offsets/masks
kQTSSItemTypeOffset = 0, //SSRC for this report
kQTSSItemVersionOffset = 4,
kQTSSItemVersionMask = 0xFFFF0000UL,
kQTSSItemVersionShift = 16,
kQTSSItemLengthOffset = 4,
kQTSSItemLengthMask = 0x0000FFFFUL,
kQTSSItemDataOffset = 8,
//version we support currently
kSupportedQTSSVersion = 0
};
};
#endif //_RTCPAPPQTSSPACKET_H_