272 lines
9.6 KiB
C++
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_
|