williamr@2: // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef RTP_H williamr@2: #define RTP_H williamr@2: williamr@2: #include williamr@2: williamr@2: class TRtpEvent; williamr@2: class RRtpSession; williamr@2: class RRtpSendPacket; williamr@2: class RRtpReceivePacket; williamr@2: class RRtpReceiveSource; williamr@2: class RRtpSendSource; williamr@2: class RRtpHeaderExtension; williamr@2: class RRtpCSRCs; williamr@2: class CRtpSession; williamr@2: class CRtpReceiveSource; williamr@2: class CRtpSendSource; williamr@2: class TRtpPacket; williamr@2: williamr@2: class RRtcpRRPart; williamr@2: class RRtcpSRPart; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A set of values that defines the event types that may be handled. williamr@2: williamr@2: See all variants of the RegisterEventCallbackL() function. williamr@2: williamr@2: @see TRtpEvent williamr@2: */ williamr@2: enum TRtpEventType williamr@2: { williamr@2: /** williamr@2: A special event type that is interpreted by all of williamr@2: the RegisterEventCallbackL() set of functions to mean that the registered williamr@2: callback function is to be called for any event except failure events. williamr@2: */ williamr@2: ERtpAnyEvent = 0, williamr@2: williamr@2: williamr@2: /** williamr@2: Defines a base value for session events. williamr@2: williamr@2: All session event types have values that are greater than this. williamr@2: */ williamr@2: ERtpSessionEventBase = 0x100, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a session-level error has occurred. williamr@2: williamr@2: The event status is a standard Symbian OS error code. williamr@2: The callback parameter is used to register interest in only one williamr@2: type of error. williamr@2: */ williamr@2: ERtpSessionFail = 0x101, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a new stream has been received. williamr@2: williamr@2: The event status is the SSRC of the stream. williamr@2: */ williamr@2: ERtpNewSource = 0x102, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that an RTCP RR (Receiver Report) has been williamr@2: received. williamr@2: williamr@2: The event status is the SSRC of the sender. williamr@2: williamr@2: Note - This event type has not been implemented yet. williamr@2: */ williamr@2: ERtpNewRR = 0x103, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a packet bigger than the expected maximum williamr@2: has been received. williamr@2: williamr@2: When this event occurs, the packet is deleted. williamr@2: */ williamr@2: ERtpBufferOverflow = 0x104, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a packet has been recived that williamr@2: is smaller than its header. williamr@2: williamr@2: When this event occurs, the packet is deleted. williamr@2: */ williamr@2: ERtpUndersizedPacket = 0x105, williamr@2: williamr@2: williamr@2: /** williamr@2: Not an event type, but defines the upper limit for session event williamr@2: type values. williamr@2: */ williamr@2: ERtpSessionEventEnd = 0x1ff, williamr@2: williamr@2: williamr@2: /** williamr@2: Not an event type but defines a base value for send stream events. williamr@2: williamr@2: All send stream event types have values that are greater than this. williamr@2: */ williamr@2: ERtpSendEventBase = 0x200, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that an error has occurred while sending williamr@2: a packet. williamr@2: williamr@2: The event status is a standard Symbian OS error code. The callback parameter williamr@2: is used only to register interest in one type of error. williamr@2: */ williamr@2: ERtpSendFail = 0x201, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a send packet operation has succeeded. williamr@2: */ williamr@2: ERtpSendSucceeded = 0x202, williamr@2: williamr@2: williamr@2: /** williamr@2: Not an event type, but defines the upper limit for send stream event williamr@2: type values. williamr@2: */ williamr@2: ERtpSendEventEnd = 0x2ff, williamr@2: williamr@2: williamr@2: /** williamr@2: Not an event type but defines a base value for receive stream events. williamr@2: williamr@2: All receive stream event types have values that are greater than this. williamr@2: */ williamr@2: ERtpSourceEventBase = 0x300, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that an error has occurred. williamr@2: williamr@2: The event status is a standard Symbian OS error code. The callback parameter williamr@2: is used only to register interest in one type of error. williamr@2: */ williamr@2: ERtpSourceFail = 0x301, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that an in-sequence packet has been received. williamr@2: */ williamr@2: ERtpPacketReceived = 0x302, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that the codec has changed. williamr@2: williamr@2: The event status is the new payload type. williamr@2: */ williamr@2: ERtpCodecChange = 0x303, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a marker packet has arrived. williamr@2: */ williamr@2: ERtpMarker = 0x304, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a misordered packet has arrived. williamr@2: */ williamr@2: ERtpMisorder = 0x305, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a dropout has been detected. williamr@2: */ williamr@2: ERtpDropout = 0x306, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a SDES (Source Description) RTCP packet williamr@2: has been received. williamr@2: williamr@2: For SDES events, the callback parameter is used to specify the type of williamr@2: SDES. Use a value from TRtpSendPacketType williamr@2: williamr@2: The event status is the SSRC of the sender. williamr@2: williamr@2: @see RRtpSession::TRtpSendPacketType williamr@2: */ williamr@2: ERtpSDES = 0x307, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a APP (Application Defined) RTCP packet williamr@2: has been received. williamr@2: williamr@2: The event status is the SSRC of the sender. williamr@2: williamr@2: */ williamr@2: ERtpAPP = 0x308, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a SR (Sender Report) RTCP packet williamr@2: has been received. williamr@2: williamr@2: The event status is the SSRC of the sender. williamr@2: williamr@2: */ williamr@2: ERtpSR = 0x309, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a RR (Receiver Report) RTCP packet williamr@2: has been received. williamr@2: williamr@2: The event status is the SSRC of the sender. williamr@2: */ williamr@2: ERtpRR = 0x30a, williamr@2: williamr@2: williamr@2: /** williamr@2: An event type that indicates that a BYE (Goodbye) RTCP packet williamr@2: has been received. williamr@2: williamr@2: The event status is the SSRC of the sender. williamr@2: */ williamr@2: ERtpBYE = 0x30b, williamr@2: williamr@2: williamr@2: /** williamr@2: Not an event type, but defines the upper limit for receive stream event williamr@2: type values. williamr@2: */ williamr@2: ERtpSourceEventEnd = 0x3ff williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Indicates whether a callback function can be called once, or more than once. williamr@2: williamr@2: The appropriate enum value is passed as an argument to the williamr@2: RegisterEventCallbackL() functions of RRtpSession, RRtpSendSource, williamr@2: and RRtpReceiveSource, or to the equivalent static functions. williamr@2: williamr@2: @see RRtpSession williamr@2: @see RRtpSendSource williamr@2: @see RRtpReceiveSource williamr@2: */ williamr@2: enum TRtpOneShotness williamr@2: { williamr@2: /** williamr@2: Indicates that the call back function can be called more than once. williamr@2: */ williamr@2: ERtpNotOneShot = 0, williamr@2: williamr@2: williamr@2: /** williamr@2: Indicates that the call back function is only called once. williamr@2: */ williamr@2: ERtpOneShot = 0x40000000 williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: */ williamr@2: typedef void (*TRtpCallbackFunction)(TAny* aPtr, const TRtpEvent& aEvent); williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: const TInt KRtpNoParameter = KRequestPending; williamr@2: williamr@2: williamr@2: //Needed for recv-only option for RTP or RTCP williamr@2: //This must map to TRtpType williamr@2: enum TPacketType williamr@2: { williamr@2: EPacketRtp, williamr@2: EPacketRtcp williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A value that can be passed as the second parameter in a call to either williamr@2: RRtpSendSource::NewSendPacketL() or RRtpSendSource::NewSendPacketLC() williamr@2: to indicate that no exension is required for the RTP send packet. williamr@2: */ williamr@2: const TInt KRtpNoExtension = -1; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A handle to an RTP session. williamr@2: williamr@2: This is the interface to the socket-level RTP service, and provides additional williamr@2: facilities such as header parsing, re-ordering out-of-order packets, williamr@2: demultiplexing multiple sources etc. williamr@2: williamr@2: The class abstracts all RTP information going to/from a RTP socket, and its williamr@2: corresponding RTCP data. williamr@2: williamr@2: Each RTP endpoint on a device needs its own RTP session. williamr@2: williamr@2: Multiple hosts streaming to a port on this device correspond williamr@2: to different RRtpReceiveSource objects associated with the session. williamr@2: williamr@2: The class behaviour assumes that an active scheduler has already been created williamr@2: and started; the class does not function correctly if not. williamr@2: */ williamr@2: class RRtpSession williamr@2: { williamr@2: public: williamr@2: /** williamr@2: A set of bit values passed as a parameter to RRtpSession::SendRTCPPacketL() williamr@2: to specify the SDES (Source Description) items that are to be sent with williamr@2: the packet. One or more of these may be set. williamr@2: williamr@2: @see RRtpSession::SendRTCPPacketL() williamr@2: */ williamr@2: enum TRtpSendPacketType williamr@2: { williamr@2: /** williamr@2: Canonical End-Point Identifier SDES Item. williamr@2: */ williamr@2: ERtcpPacketCNAME = 1, williamr@2: williamr@2: /** williamr@2: User Name SDES Item. williamr@2: */ williamr@2: ERtcpPacketNAME = 2, williamr@2: williamr@2: /** williamr@2: Electronic Mail Address SDES Item. williamr@2: */ williamr@2: ERtcpPacketEMAIL = 4, williamr@2: williamr@2: /** williamr@2: Phone Number SDES Item. williamr@2: */ williamr@2: ERtcpPacketPHONE = 8, williamr@2: williamr@2: /** williamr@2: Geographic User Location SDES Item. williamr@2: */ williamr@2: ERtcpPacketLOC = 16, williamr@2: williamr@2: /** williamr@2: Application or Tool Name SDES Item williamr@2: */ williamr@2: ERtcpPacketTOOL = 32, williamr@2: williamr@2: /** williamr@2: Notice/Status SDES Item williamr@2: */ williamr@2: ERtcpPacketNOTE = 64, williamr@2: williamr@2: /** williamr@2: Private Extensions SDES Item williamr@2: */ williamr@2: ERtcpPacketPRIV = 128 williamr@2: }; williamr@2: williamr@2: inline RRtpSession(); williamr@2: inline TBool IsOpen() const; williamr@2: williamr@2: IMPORT_C void OpenL(RSocketServ& aServer, TSockAddr& aLocalAddr, williamr@2: TSockAddr& aRemoteAddr, williamr@2: TInt aMaxRXSize, RConnection& aConnection, TInt aPriority = EPriorityNormal, williamr@2: const TDesC8& aCNAME = KNullDesC8); williamr@2: williamr@2: williamr@2: IMPORT_C void OpenL(RSocketServ& aServer, TSockAddr& aLocalAddr, williamr@2: TSockAddr& aRemoteAddr, williamr@2: TInt aMaxRXSize, TInt aPriority = EPriorityNormal, williamr@2: const TDesC8& aCNAME = KNullDesC8); williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Opens the session and initialises it. williamr@2: williamr@2: No events will be generated until after control returns to the williamr@2: active scheduler. The client has this time to initialise the williamr@2: object by adding event callbacks. williamr@2: williamr@2: @param aSocket The connected socket. williamr@2: @param aMaxRXSize The maximum size of a received packet. williamr@2: @param aRtcpSocket The RTCP socket. williamr@2: @param aPriority The priority to be used for internal active objects williamr@2: @param aCNAME The CNAME. A sensible default is supplied if none is williamr@2: provided. williamr@2: */ williamr@2: IMPORT_C void OpenL(RSocket& aSocket, TInt aMaxRXSize, williamr@2: RSocket& aRtcpSocket, williamr@2: TInt aPriority = EPriorityNormal, williamr@2: const TDesC8& aCNAME = KNullDesC8); williamr@2: williamr@2: IMPORT_C void OpenL(RSocket& aSocket, TInt aMaxRXSize, williamr@2: TInt aPriority = EPriorityNormal); williamr@2: williamr@2: IMPORT_C void Close(); williamr@2: williamr@2: IMPORT_C void SetMaxRXSize(TInt aMaxRXSize); williamr@2: williamr@2: IMPORT_C TInt MaxRXSize(); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Sets the estimated bandwidth used by the session. williamr@2: williamr@2: This is used to decide when to send RTCP status packets. williamr@2: The default value is read from a resource file and should be a reasonably williamr@2: sensible default based on the maximum bandwidth of the handset. williamr@2: williamr@2: @param aBandwidth The bandwidth in bps. williamr@2: */ williamr@2: IMPORT_C void SetBandwidth(TUint aBandwidth); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Supplies information about the profile-specific RTP williamr@2: timestamps. williamr@2: williamr@2: This is used to generate the RTP timestamps in RTCP packets. williamr@2: It is not used to generate timestamps in RTP packets as they must williamr@2: accurately relate to the time of the sample. williamr@2: williamr@2: @param aNow The time now in RTP format williamr@2: @param aConversion The number of nanoseconds per RTP timer tick. williamr@2: */ williamr@2: IMPORT_C void SetRTPTimeConversion(TUint aNow, TUint aConversion); williamr@2: IMPORT_C RRtpReceiveSource NewReceiveSourceL(); williamr@2: IMPORT_C RRtpReceiveSource NewReceiveSourceLC(); williamr@2: williamr@2: /** williamr@2: Registers a callback for the specified event. williamr@2: williamr@2: Some compilers may not support templated member functions. A static version williamr@2: of this function is available that offers the same behaviour: williamr@2: RegisterEventCallbackL(RRtpSession,TRtpEventType,void (*aCallback)(T*, const TRtpEvent&),T*,TRtpOneShotness,TInt) williamr@2: williamr@2: @param aType The type of event. williamr@2: @param aCallback The callback function. The function is templated, and is williamr@2: prototyped to take a pointer to an object of the template williamr@2: type and a const reference to a TRtpEvent. The function williamr@2: returns void. williamr@2: @param aPtr A pointer that is passed to the callback function when williamr@2: that function is called. williamr@2: @param aOneShot Indicates whether the callback function is only williamr@2: called once, or can be called more than once. williamr@2: @param aParameter A parameter to be passed to the registration function. williamr@2: The meaning of this depends entirely on the event type. williamr@2: The parameter is optional - the other overload of this williamr@2: function is available for registrations that don't need williamr@2: to pass a parameter. williamr@2: */ williamr@2: template inline void williamr@2: RegisterEventCallbackL(TRtpEventType aType, williamr@2: void (*aCallback)(T*, const TRtpEvent&), williamr@2: T* aPtr, williamr@2: TRtpOneShotness aOneShot, williamr@2: TInt aParameter) williamr@2: { williamr@2: PrivRegisterEventCallbackL( williamr@2: aType|aOneShot, williamr@2: reinterpret_cast(aCallback), williamr@2: static_cast(aPtr), aParameter); williamr@2: } williamr@2: williamr@2: /** williamr@2: Registers a callback for the specified event. williamr@2: williamr@2: Some compilers may not support templated member functions. A static version williamr@2: of this function is available that offers the same behaviour: williamr@2: RegisterEventCallbackL(RRtpSession,TRtpEventType,void (*aCallback)(T*, const TRtpEvent&),T*,TRtpOneShotness) williamr@2: williamr@2: @param aType The type of event. williamr@2: @param aCallback The callback function. The function is templated, and is williamr@2: prototyped to take a pointer to an object of the template williamr@2: type and a const reference to a TRtpEvent. The function williamr@2: returns void. williamr@2: @param aPtr A pointer that is passed to the callback function when williamr@2: that function is called. williamr@2: @param aOneShot Indicates whether the callback function is only williamr@2: called once, or can be called more than once. If not williamr@2: specified, the default is to allow the callback function williamr@2: to be called more than once. williamr@2: */ williamr@2: template inline void williamr@2: RegisterEventCallbackL(TRtpEventType aType, williamr@2: void (*aCallback)(T*, const TRtpEvent&), williamr@2: T* aPtr, williamr@2: TRtpOneShotness aOneShot = ERtpNotOneShot) williamr@2: { williamr@2: PrivRegisterEventCallbackL( williamr@2: aType|aOneShot, williamr@2: reinterpret_cast(aCallback), williamr@2: static_cast(aPtr)); williamr@2: } williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Gets an array contining the most recent RR (Receiver Report) from williamr@2: all hosts who are reporting on our send stream. williamr@2: williamr@2: @return The array of RRs. williamr@2: */ williamr@2: IMPORT_C RRtcpRRPart GetRRs(); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Gets the data associated with the specified RTCP SDES (Source Description) williamr@2: item. williamr@2: williamr@2: Note a that the PRIV (Private Extensions) SDES item is not supported williamr@2: by this mechanism. williamr@2: williamr@2: @param aType The value identifying the RTCP SDES item. williamr@2: williamr@2: @param aValue A descriptor reference to the SDES item data. williamr@2: williamr@2: @return KErrNotFound if the item type was not found in the most recent RTCP packet williamr@2: KErrNone if the operation is successful williamr@2: */ williamr@2: IMPORT_C TInt GetSDES(const TInt aType, TDes8& aValue); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Sets the data associated with the specified RTCP SDES (Source Description) williamr@2: item for sending in the next SDES packet only. williamr@2: williamr@2: The function Leaves if duplicate values are set for the same CNAME. williamr@2: williamr@2: Note a that the PRIV (Private Extensions) SDES item is not supported williamr@2: by this mechanism. williamr@2: williamr@2: NOTE - This call cannot be used to set a different CNAME for this session. williamr@2: The default CNAME is send with every SDES packets. williamr@2: williamr@2: @param aType The value identfying the RTCP SDES item. williamr@2: @param aValue The SDES item data. williamr@2: williamr@2: @return KErrTooBig if the length of the aValue is more than KMaxSdesItemLength(=255) williamr@2: KErrNone if the operation is successful williamr@2: */ williamr@2: IMPORT_C TInt SetSDESL(TInt aType, const TDesC8& aValue); williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Sets the data associated with the PRIV (Private Extensions) SDES item. williamr@2: williamr@2: @param aPrefix The value identfying the RTCP SDES item. williamr@2: @param aValue The SDES item data. williamr@2: williamr@2: @return KErrTooBig if the length of the aValue and aPrefix combined is more williamr@2: than KMaxSdesItemLength(=255) williamr@2: KErrNone if the operation is successful williamr@2: */ williamr@2: IMPORT_C TInt SetPRIVL(const TDesC8& aPrefix, const TDesC8& aValue); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: Sends an APP (Application Defined) RTCP Packet. williamr@2: williamr@2: The packet is sent immediately. williamr@2: williamr@2: If used with RTCP auto-send, the function disrupts the auto-send williamr@2: intervals. Note however that Symbian reserves the right to fix this. williamr@2: williamr@2: @param aApp A handle to a RTCP APP (Application Defined) packet, williamr@2: for experimental extensions to RTCP. williamr@2: */ williamr@2: IMPORT_C void SendAPPL(const TDesC8& aName, const TDesC8& aAppData = KNullDesC8, TUint8 aSubType = 0); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Enables or disables the automatic sending of RTCP SR (Sender Report), williamr@2: RR (Receiver Report), and SDES (Source Description) packets. williamr@2: williamr@2: Note that if automatic sending is not enabled and RTCP sending is required, williamr@2: then explicit calls to SendRTCPPacketL() will be required. williamr@2: williamr@2: @param aAutoSend ETrue, if RTCP packets need to be send automatically williamr@2: EFalse otherwise. williamr@2: williamr@2: @see RRtpSession::SendRTCPPacketL() williamr@2: */ williamr@2: IMPORT_C void SetRTCPAutoSend(TBool aAutoSend); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Gets the RTCP Auto Send status. williamr@2: williamr@2: @return True, if RTCP SR, RR and SDES packets are automatically sent, williamr@2: false otherwise williamr@2: williamr@2: @see RRtpSession::SetRTCPAutoSend() williamr@2: */ williamr@2: IMPORT_C TBool RTCPAutoSend() const; williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Sets the RTCP Auto Send interval. williamr@2: This disables the RFC based calculation of RTCP intervals. williamr@2: To re-enable auto calculation, set the interval to zero. williamr@2: williamr@2: @param aInterval Time interval after which an RTCP auto-send will take place williamr@2: */ williamr@2: IMPORT_C void SetRtcpInterval(TTimeIntervalMicroSeconds32& aInterval); williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: Enables Receive only option for rtp or rtcp williamr@2: williamr@2: @param aRtpOrRtcp Takes the values from the enum TPacketType williamr@2: williamr@2: @see RRtpSession::DontReceive() williamr@2: */ williamr@2: IMPORT_C void DontReceive(TInt aRtpOrRtcp); williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: Sends an RTCP packet now. williamr@2: williamr@2: Calling this function doesn't make much sense if auto-send is williamr@2: on, as it will result in packets being sent at rather williamr@2: incoherent intervals. williamr@2: williamr@2: @param aPacketType Zero or more of the bit values defined by williamr@2: the TRtpSendPacketType enum. The packet sent will williamr@2: contain a SR (Sender Report) or RR (Receiver Report), williamr@2: depending on whether any packets have actually been williamr@2: sent, together with all SDES (Source Description) items williamr@2: specified by this parameter. williamr@2: williamr@2: @see TRtpSendPacketType williamr@2: */ williamr@2: IMPORT_C void SendRTCPPacketL(TDesC8& aPacket); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: Creates a new send stream, and returns the send stream handle. williamr@2: williamr@2: Only one send stream per session is permitted, which means that you must not williamr@2: call this function if the send stream has already been created. williamr@2: williamr@2: As the send stream is an active object, it cannot handle request williamr@2: completion events until control returns to the active scheduler. williamr@2: Typically, clients will want to add event registrations before that. williamr@2: williamr@2: The Code panics if the SendSource has alredy been opened. williamr@2: williamr@2: @return The send stream handle. williamr@2: williamr@2: This function may leave if memory is not enough. williamr@2: */ williamr@2: IMPORT_C RRtpSendSource NewSendSourceL(); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Gets the handle to the send stream object associated with this session. williamr@2: williamr@2: The send stream object is the one created in a previous call williamr@2: to NewSendSourceL(). If the send stream object has not been created, then williamr@2: the returned handle will refer to a closed send stream. williamr@2: williamr@2: @return The handle to the send stream object. williamr@2: williamr@2: @see RRtpSendSource NewSendSourceL() williamr@2: */ williamr@2: IMPORT_C RRtpSendSource SendSource(); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Sets the number of sequential packets that must be received williamr@2: before a stream is considered good. williamr@2: williamr@2: Sets the maximum number of dropped packets to be considered a williamr@2: dropout, as opposed to an ended and restarted stream. williamr@2: williamr@2: Sets the maximum number of packets by which a packet can be delayed williamr@2: before it is considered dropped. williamr@2: williamr@2: @param aMaxMisorder The maximum number of packets. williamr@2: williamr@2: @param aMaxDropout The number of sequential packets. williamr@2: williamr@2: @param aMinSequential The number of sequential packets. williamr@2: @post The session will be 'restarted', williamr@2: i.e. it resets the sequence number sequence and resets all RTCP statistics. williamr@2: */ williamr@2: IMPORT_C void SetRtpStreamParameters(TInt aMinSequential, TInt aMaxMisorder, TInt aMaxDropout); williamr@2: williamr@2: inline TBool operator == (RRtpSession aThat) const; williamr@2: inline TBool operator != (RRtpSession aThat) const; williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: The event manager contains a number of callback registrations, each of which williamr@2: binds a function and pointer (normally an object) to a particular kind of williamr@2: event. Registrations can be bound to all events on a stream. williamr@2: williamr@2: If a function is registered for a particular event, it will be called when williamr@2: that event occurs. One callback function can be associated with more than 1 williamr@2: callback registration. Callback functions take a pointer argument williamr@2: which was supplied as part of the registration williamr@2: williamr@2: @param aType Event type williamr@2: williamr@2: @param aCallback Callback object williamr@2: williamr@2: @param aPtr Pointer to data that needs to be passed to the callback function williamr@2: williamr@2: @param aParameter Parameter to be passed to internal callback subsystem williamr@2: */ williamr@2: IMPORT_C void PrivRegisterEventCallbackL(TUint aType, williamr@2: TRtpCallbackFunction aCallback, williamr@2: TAny* aPtr, williamr@2: TInt aParameter); williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: The event manager contains a number of callback registrations, each of which williamr@2: binds a function and pointer (normally an object) to a particular kind of williamr@2: event. Registrations can be bound to all events on a stream. williamr@2: williamr@2: If a function is registered for a particular event, it will be called when williamr@2: that event occurs. One callback function can be associated with more than 1 williamr@2: callback registration. Callback functions take a pointer argument williamr@2: which was supplied as part of the registration williamr@2: williamr@2: @param aType Event type williamr@2: williamr@2: @param aCallback Callback object williamr@2: williamr@2: @param aPtr Pointer to data that needs to be passed to the callback function williamr@2: */ williamr@2: IMPORT_C void PrivRegisterEventCallbackL(TUint aType, williamr@2: TRtpCallbackFunction aCallback, williamr@2: TAny* aPtr); williamr@2: williamr@2: private: williamr@2: friend class TRtpEvent; williamr@2: CRtpSession* iPtr; williamr@2: // Note: Comments that start with //\ are pseudo-variables used to get williamr@2: // Doxygen collaboration diagrams to look right. Ignore them. williamr@2: //\ RRtpSendSource sndSource_1_01; williamr@2: //\ RRtpReceiveSource rcvSource_1_n; williamr@2: //\ TRtpCallback callbacks_1_n; williamr@2: //\ TRtpEvent events_1_n; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A handle to a send stream. williamr@2: williamr@2: Use this class to manage the creation and sending of packets. williamr@2: A session can have only one send stream. williamr@2: williamr@2: Only one packet can be sent at any one time. williamr@2: Once a packet has been sent, the packet cannot be closed and no further packets williamr@2: can be sent until an event signalling the completion of the send operation has williamr@2: occurred. This will be one of the events defined by the enum values: williamr@2: ERtpSendSucceeded and ERtpSendFail. williamr@2: williamr@2: A client must monitor these events so that it can schedule the sending of williamr@2: subsequent packets. williamr@2: It does this by implementing and registering callback functions that williamr@2: handle these events. williamr@2: williamr@2: @see TRtpEventType williamr@2: */ williamr@2: class RRtpSendSource williamr@2: { williamr@2: public: williamr@2: inline RRtpSendSource(); williamr@2: inline TBool IsOpen() const; williamr@2: IMPORT_C void Close(); williamr@2: williamr@2: IMPORT_C void Cancel(); williamr@2: williamr@2: template inline void williamr@2: RegisterEventCallbackL(TRtpEventType aType, williamr@2: void (*aCallback)(T*, const TRtpEvent&), williamr@2: T* aPtr, williamr@2: TRtpOneShotness aOneShot, williamr@2: TInt aParameter) williamr@2: { williamr@2: PrivRegisterEventCallbackL(aType|aOneShot, williamr@2: reinterpret_cast(aCallback), williamr@2: static_cast(aPtr), aParameter); williamr@2: } williamr@2: williamr@2: williamr@2: template inline void williamr@2: RegisterEventCallbackL(TRtpEventType aType, williamr@2: void (*aCallback)(T*, const TRtpEvent&), williamr@2: T* aPtr, williamr@2: TRtpOneShotness aOneShot = ERtpNotOneShot) williamr@2: { williamr@2: PrivRegisterEventCallbackL(aType|aOneShot, williamr@2: reinterpret_cast(aCallback), williamr@2: static_cast(aPtr)); williamr@2: } williamr@2: williamr@2: williamr@2: williamr@2: IMPORT_C RRtpSendPacket NewSendPacketL(TInt aPayloadSize = 0, williamr@2: TInt aHeaderExtensionSize = williamr@2: KRtpNoExtension); williamr@2: williamr@2: IMPORT_C RRtpSendPacket NewSendPacketLC(TInt aPayloadSize = 0, williamr@2: TInt aHeaderExtensionSize = williamr@2: KRtpNoExtension); williamr@2: williamr@2: IMPORT_C TBool IsSending(); williamr@2: IMPORT_C void SetPayloadType(TUint aPayloadType); williamr@2: IMPORT_C void SetDefaultPayloadSize(TInt aPayloadSize); williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Sends a Bye RTCP packet. williamr@2: williamr@2: @param aReason The reason for sending the Bye RTCP packet. williamr@2: */ williamr@2: IMPORT_C void ByeL(TDesC8& aReason); williamr@2: IMPORT_C TUint32 GetLocalSSRC(); williamr@2: williamr@2: IMPORT_C void SetAlignment(TInt aAlignment); williamr@2: IMPORT_C TInt Alignment() const; williamr@2: williamr@2: inline TBool operator == (RRtpSendSource aThat) const; williamr@2: inline TBool operator != (RRtpSendSource aThat) const; williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: The event manager contains a number of callback registrations, each of which williamr@2: binds a function and pointer (normally an object) to a particular kind of williamr@2: event. Registrations can be bound to all events on a stream. williamr@2: williamr@2: If a function is registered for a particular event, it will be called when williamr@2: that event occurs. One callback function can be associated with more than 1 williamr@2: callback registration. Callback functions take a pointer argument williamr@2: which was supplied as part of the registration williamr@2: williamr@2: @param aType Event type williamr@2: williamr@2: @param aCallback Callback object williamr@2: williamr@2: @param aPtr Pointer to data that needs to be passed to the callback function williamr@2: williamr@2: @param aParameter Parameter to be passed to internal callback subsystem williamr@2: */ williamr@2: IMPORT_C void PrivRegisterEventCallbackL(TUint aType, williamr@2: TRtpCallbackFunction aCallback, williamr@2: TAny* aPtr, williamr@2: TInt aParameter); williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: The event manager contains a number of callback registrations, each of which williamr@2: binds a function and pointer (normally an object) to a particular kind of williamr@2: event. Registrations can be bound to all events on a stream. williamr@2: williamr@2: If a function is registered for a particular event, it will be called when williamr@2: that event occurs. One callback function can be associated with more than 1 williamr@2: callback registration. Callback functions take a pointer argument williamr@2: which was supplied as part of the registration williamr@2: williamr@2: @param aType Event type williamr@2: williamr@2: @param aCallback Callback object williamr@2: williamr@2: @param aPtr Pointer to data that needs to be passed to the callback function williamr@2: */ williamr@2: IMPORT_C void PrivRegisterEventCallbackL(TUint aType, williamr@2: TRtpCallbackFunction aCallback, williamr@2: TAny* aPtr); williamr@2: private: williamr@2: friend class RRtpSession; williamr@2: friend class TRtpEvent; williamr@2: CRtpSendSource* iPtr; williamr@2: // Note: Comments that start with //\ are pseudo-variables used to get williamr@2: // Doxygen collaboration diagrams to look right. Ignore them. williamr@2: //\ TRtpCallback callbacks_1_n; williamr@2: //\ TRtpEvent events_1_n; williamr@2: //\ TRtpSendPacket packets_1_n; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A handle to a receive stream. williamr@2: williamr@2: An object of this type represents the stream of data on a single SSRC and williamr@2: delivers the RTP packets and RTCP information in the order they williamr@2: arrive. williamr@2: williamr@2: Note that RTP does not guarantee the order of delivery, which means that the williamr@2: client may want to buffer the data. williamr@2: */ williamr@2: class RRtpReceiveSource williamr@2: { williamr@2: public: williamr@2: RRtpReceiveSource(); williamr@2: inline TBool IsOpen() const; williamr@2: williamr@2: IMPORT_C void Close(); williamr@2: williamr@2: williamr@2: template inline void williamr@2: RegisterEventCallbackL(TRtpEventType aType, williamr@2: void (*aCallback)(T*, const TRtpEvent&), williamr@2: T* aPtr, williamr@2: TRtpOneShotness aOneShot, williamr@2: TInt aParameter) williamr@2: { williamr@2: PrivRegisterEventCallbackL(aType|aOneShot, williamr@2: reinterpret_cast(aCallback), williamr@2: static_cast(aPtr), aParameter); williamr@2: } williamr@2: williamr@2: williamr@2: template inline void williamr@2: RegisterEventCallbackL(TRtpEventType aType, williamr@2: void (*aCallback)(T*, const TRtpEvent&), williamr@2: T* aPtr, williamr@2: TRtpOneShotness aOneShot = ERtpNotOneShot) williamr@2: { williamr@2: PrivRegisterEventCallbackL(aType|aOneShot, williamr@2: reinterpret_cast(aCallback), williamr@2: static_cast(aPtr)); williamr@2: } williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Gets the data associated with the specified RTCP SDES (Source Description) williamr@2: item. williamr@2: williamr@2: Note a that the PRIV (Private Extensions) SDES item is not supported williamr@2: by this mechanism. williamr@2: williamr@2: @param aType The value identifying the RTCP SDES item. williamr@2: williamr@2: @return A descriptor reference to the SDES item data. williamr@2: */ williamr@2: IMPORT_C TInt GetSDES(const TInt aType, TDes8& aValue); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Gets the most recent SR ((Sender Report) from this SSRC. williamr@2: williamr@2: @return A handle to the SR. williamr@2: */ williamr@2: IMPORT_C RRtcpSRPart GetSR(); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Gets the reason for a BYE packet. williamr@2: williamr@2: @return A descriptor contaning the BYE message. This is williamr@2: KNullDesC if the source has not sent a BYE packet. williamr@2: */ williamr@2: IMPORT_C TDesC8& GetByeReason(); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Parameters from the last APP (Application Defined) packet. williamr@2: williamr@2: @param aName Four-bytes application name williamr@2: @param aAppData Applciation specific data williamr@2: @param aSubType Application defined sub-type of the APP packet williamr@2: */ williamr@2: IMPORT_C void GetLastApp(TPtrC8& aName, TPtrC8& aAppData, TUint& aSubType); williamr@2: williamr@2: IMPORT_C RRtpReceivePacket Packet(); williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Gets the SSRC of the remote end williamr@2: williamr@2: @return The SSRC of the remote end williamr@2: */ williamr@2: IMPORT_C TUint SSRC() const; williamr@2: williamr@2: inline TBool operator == (RRtpReceiveSource aThat) const; williamr@2: inline TBool operator != (RRtpReceiveSource aThat) const; williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: The event manager contains a number of callback registrations, each of which williamr@2: binds a function and pointer (normally an object) to a particular kind of williamr@2: event. Registrations can be bound to all events on a stream. williamr@2: williamr@2: If a function is registered for a particular event, it will be called when williamr@2: that event occurs. One callback function can be associated with more than 1 williamr@2: callback registration. Callback functions take a pointer argument williamr@2: which was supplied as part of the registration williamr@2: williamr@2: @param aType Event type williamr@2: williamr@2: @param aCallback Callback object williamr@2: williamr@2: @param aPtr Pointer to data that needs to be passed to the callback function williamr@2: williamr@2: @param aParameter Parameter to be passed to internal callback subsystem williamr@2: */ williamr@2: IMPORT_C void PrivRegisterEventCallbackL(TUint aType, williamr@2: TRtpCallbackFunction aCallback, williamr@2: TAny* aPtr, TInt aParameter); williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: The event manager contains a number of callback registrations, each of which williamr@2: binds a function and pointer (normally an object) to a particular kind of williamr@2: event. Registrations can be bound to all events on a stream. williamr@2: williamr@2: If a function is registered for a particular event, it will be called when williamr@2: that event occurs. One callback function can be associated with more than 1 williamr@2: callback registration. Callback functions take a pointer argument williamr@2: which was supplied as part of the registration williamr@2: williamr@2: @param aType Event type williamr@2: williamr@2: @param aCallback Callback object williamr@2: williamr@2: @param aPtr Pointer to data that needs to be passed to the callback function williamr@2: */ williamr@2: williamr@2: IMPORT_C void PrivRegisterEventCallbackL(TUint aType, williamr@2: TRtpCallbackFunction aCallback, williamr@2: TAny* aPtr); williamr@2: private: williamr@2: friend class RRtpSession; williamr@2: friend class TRtpEvent; williamr@2: CRtpReceiveSource* iPtr; williamr@2: // Note: Comments that start with //\ are pseudo-variables used to get williamr@2: // Doxygen collaboration diagrams to look right. Ignore them. williamr@2: //\ TRtpCallback callbacks_1_n; williamr@2: //\ TRtpEvent events_1_n; williamr@2: //\ TRtpReceivePacket packets_1_n; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A handle to an RTP packet. williamr@2: williamr@2: The packet is accessed through the interface provided by this handle. williamr@2: */ williamr@2: class RRtpPacket williamr@2: { williamr@2: public: williamr@2: inline RRtpPacket(); williamr@2: inline TBool IsOpen() const; williamr@2: williamr@2: IMPORT_C void Close(); williamr@2: IMPORT_C TPtrC8 Payload() const; williamr@2: IMPORT_C TUint SequenceNumber() const; williamr@2: IMPORT_C TUint Timestamp() const; williamr@2: IMPORT_C TUint SSRC() const; williamr@2: IMPORT_C RRtpCSRCs CSRCs() const; williamr@2: IMPORT_C TBool ExtensionPresent() const; williamr@2: IMPORT_C RRtpHeaderExtension Extension() const; williamr@2: IMPORT_C TBool Marker() const; williamr@2: IMPORT_C TUint PayloadType() const; williamr@2: IMPORT_C TUint Flags() const; williamr@2: williamr@2: inline TBool operator == (RRtpPacket aThat) const; williamr@2: inline TBool operator != (RRtpPacket aThat) const; williamr@2: williamr@2: protected: williamr@2: TRtpPacket* iPtr; williamr@2: // Note: Comments that start with //\ are pseudo-variables used to get williamr@2: // Doxygen collaboration diagrams to look right. Ignore them. williamr@2: //\ RRtpHeaderExtension extension_1_01; williamr@2: //\ RRtpCSRCs csrcs_1_01; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A handle to an RTP packet to be sent (an RTP send packet). williamr@2: williamr@2: @see RRtpSendSource williamr@2: */ williamr@2: class RRtpSendPacket : public RRtpPacket williamr@2: { williamr@2: public: williamr@2: IMPORT_C void Send(); williamr@2: IMPORT_C TDes8& WritePayload(); williamr@2: IMPORT_C void SetTimestamp(TUint aTimestamp); williamr@2: IMPORT_C void SetMarker(TBool aMark); williamr@2: IMPORT_C void SetPayloadType(TUint aPayloadType); williamr@2: IMPORT_C void SetFlags(TUint aFlags); williamr@2: williamr@2: friend class RRtpSendSource; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A handle to an RTP packet received from another source. williamr@2: */ williamr@2: class RRtpReceivePacket : public RRtpPacket williamr@2: { williamr@2: friend class RRtpReceiveSource; williamr@2: friend class TRtpReceivePacket; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: An RTP event. williamr@2: williamr@2: An event is generated when anything happens that a client might want williamr@2: to know about. The class encapulates two pieces of information: williamr@2: 1. An event type as defined by a TRtpEventType value. williamr@2: 2. Additional information whose meaning is dependent on the event type. williamr@2: williamr@2: Additional information may be implicitly associated with the event, but still williamr@2: needs to be fetched from another object, for example, when processing williamr@2: an ERtpPacketReceived event, the packet (represented by a RRtpReceivePacket williamr@2: handle) must be obtained from the receive stream (represented by a williamr@2: RRtpReceiveStream handle). williamr@2: williamr@2: Events are always associated with either an RTP session, a send stream or williamr@2: a receive stream, and this class has functions for getting the corresponding williamr@2: handle. williamr@2: williamr@2: @see RRtpSession williamr@2: @see RRtpSendSource williamr@2: @see RRtpReceiveSource williamr@2: */ williamr@2: class TRtpEvent williamr@2: { williamr@2: public: williamr@2: IMPORT_C TRtpEvent(TRtpEventType aType, TInt aStatus, TAny* aData); williamr@2: IMPORT_C RRtpSession Session() const; williamr@2: IMPORT_C RRtpSendSource SendSource() const; williamr@2: IMPORT_C RRtpReceiveSource ReceiveSource() const; williamr@2: IMPORT_C TBool IsSessionEvent() const; williamr@2: IMPORT_C TBool IsSendSourceEvent() const; williamr@2: IMPORT_C TBool IsReceiveSourceEvent() const; williamr@2: williamr@2: inline TRtpEventType Type() const; williamr@2: inline TInt Status() const; williamr@2: private: williamr@2: TRtpEventType iType; williamr@2: TInt iStatus; williamr@2: TAny* iData; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Reresents an RTP packet's header extension. williamr@2: williamr@2: The format of a header extension is profile-defined. williamr@2: */ williamr@2: class RRtpHeaderExtension williamr@2: { williamr@2: public: williamr@2: IMPORT_C TUint16 Type() const; williamr@2: IMPORT_C void SetType(TUint16 aType); williamr@2: IMPORT_C TPtrC8 Data(); williamr@2: private: williamr@2: friend class RRtpPacket; williamr@2: TRtpPacket* iPtr; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A handle representing the list of CSRCs in an RTP packet. williamr@2: */ williamr@2: class RRtpCSRCs williamr@2: { williamr@2: public: williamr@2: IMPORT_C TInt Count() const; williamr@2: IMPORT_C TUint operator [](TUint aIndex) const; williamr@2: private: williamr@2: friend class RRtpPacket; williamr@2: williamr@2: TRtpPacket* iPtr; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: williamr@2: A set of panic codes. williamr@2: williamr@2: in release mode, different panic codes, such as williamr@2: KERN-EXEC 3 may be generated instead. williamr@2: */ williamr@2: enum TRtpPanicCode williamr@2: { williamr@2: ERtpPacketIsClosed = 1, williamr@2: ERtpPayloadTypeOutOfRange = 2, williamr@2: ERtpSessionIsClosed = 3, williamr@2: ERtpSourceIsClosed = 4, williamr@2: ERtpNoExtension = 5, williamr@2: ERtpLeaveInResponseToError = 6, williamr@2: ERtpCantSend2PacketsAtOnce = 7, williamr@2: ERtpWrongEventType = 8, williamr@2: ERtpWrongParameter = 9, williamr@2: ERtpSendSourceAlreadyOpen = 10, williamr@2: ERtpSessionAlreadyOpen = 11, williamr@2: // williamr@2: ERtpCoreController = 100, williamr@2: }; williamr@2: williamr@2: GLREF_C void Panic(TRtpPanicCode aPanicCode); williamr@2: williamr@2: #include "rtp.inl" williamr@2: williamr@2: #endif // RTP_H