rtp/rtpstack/src/rtpstppacket.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rtp/rtpstack/src/rtpstppacket.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,355 @@
+/*
+* Copyright (c) 2002-2003 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   
+*
+*/
+
+
+
+
+// INCLUDES
+
+#include <e32base.h>
+#include <e32std.h>
+
+#include "rtpstppacket.h"
+
+//
+// RTPLite header
+//
+// ****************************************
+// Extract from "PoC Core Network RTP RP01" 
+// ****************************************
+//                       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
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   |F M R C S|  PT | Sequence nbr  |      Checksum (optional)      |
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+//  Full header indication (F)  1 bit
+//                              If this bit is set to zero then header format
+//                              is reduced (otherwise full)
+//
+//  Marker (M)                  1 bit
+//                              Indication of the start of speech item (value 1).
+//                              It is set on the Nth first RTP packets including 
+//                              speech frames within the RTP payload. N is expected
+//                              to have a constant value in the order of 3 to 5. 
+//                              Note: M-bit is zero for all embedded control packets.
+//
+//  Reserved bit (R)            1 bit
+//                              This bit is reserved for future use. Default value is 1. 
+//
+//  Checksum indication (C)     1 bit
+//                              C-bit is an indication if header includes at the end an
+//                              optional checksum field. Value 1 indicates that checksum
+//                              field exist on the header.
+//
+//  Speech Item toggle indication (S)   1 bit
+//                              S-bit is used as an indication (toggled value) that speech
+//                              item has been changed (toggled between two speech items 
+//                              from same source; toggled between two speech items from 
+//                              different users; toggled between two speech items from 
+//                              different groups 1-to-1 call). This bit is on the same
+//                              position for the respective leader, speech and trailing
+//                              packets.
+//
+//  Payload Type (PT)           3 bits
+//                              PT-field indicates what kind of information
+//                              is carried on the paylaod area. Only two codes
+//                              (000 and 001) are reserved at the first phase, 
+//                              other values are reserved for future use.000 is
+//                              used to indicate that embedded control signal
+//                              information is in payload area and 001 indicates
+//                              that payload contains speech packets coded with
+//                              IETF AMR speech coding 8. In case of embedded 
+//                              control signal coding then the first byte on the payload
+//                              area has special coding rules, which are defined on section 5.3.4.
+//                              Note: GSM HR (HalfRate) will be used for 1st integration testing 
+//                              and related PT is 010.
+//                              Note: Standard RTP header uses 7 bits for the same indication.
+//
+// Sequence Nbr (SN)            8 bits
+//                              The sequence nbr increments by one for each
+//                              RTP data packet sent, and may be used by the
+//                              receiver to detect packet loss and restore
+//                              packet sequence. The initial value (when S 
+//                              bit is toggled) of the sequence number is zero. 
+//                              Note one exception: during talkspurt 
+//                              (for 1-to-1 call or group call) if one/few 
+//                              RTP packets are not sent (on N*20ms interval)
+//                              due to DTX usage (silence periods not sent) 
+//                              the sequency number at the originator side 
+//                              is anyhow incremented by one with the N*20ms 
+//                              frequency. The value for N is 3 by default. 
+//                              Very probably RTP packets are always sent in
+//                              GPRS terminals during talkspurt to avoid TBF
+//                              drop. RTP packet payload contains during 
+//                              silence periods three NO_DATA -indication
+//                              bytes to AMR decoder. In the future extented
+//                              TFB timer feature may change this behaviour, 
+//                              i.e. the sending of NO_DATA -indication bytes
+//                              might be dropped (over GPRS).Within standard
+//                              version of RTP header the length of SN is 16
+//                              bits , but within PoC application it is enough
+//                              to have 8 bits; it provides 7.62s (127*3*20ms)
+//                              jitter buffering without any special number wrap
+//                              control tricks (shown values are valid with N=3). 
+//                              Note: On the uplink direction on each speech item,
+//                              the Sequency Nbr is zero for all leading packets
+//                              (the first leading packet is replicated few times,
+//                              but the replicated messages are identical 
+//                              (even concerning the SN field)) and the first RTP
+//                              packet containing speech has SN value one.
+//                              Note: for all embedded control signals the SN
+//                              is set to zero.
+//
+//  CheckSum (CS)               16 bits (optional)
+//                              Checksum field is optional and the existence
+//                              of this field is indicated on the first octet
+//                              by C-bit.  Checksum will be needed with RP01
+//                              interface if RLC/LLC/UDP checksums are not
+//                              available/used. UDP checksum is optional 
+//                              with IPv4. Further more by using RTP level
+//                              CRC in combination of UDP-lite it would be 
+//                              possible to implement more efficient unequal
+//                              error protection on AMR bits than UDP-lite 
+//                              alone would offer.If checksum error is detected
+//                              then whole RTP packet is discarded.
+//                              Note: Checksum information is not available 
+//                              within standard RTP header.
+//                              Note: Taking the other aspects (header compression
+//                              with Degermark) into account it currently means 
+//                              that if checksum is included on RTPLite header
+//                              the whole packet does fit to 8 kbit/s channel
+//                              on the AIR interface only with AMR 4.75 coding.
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+// 
+CRtpStpPacket::CRtpStpPacket() :
+    iSize( 0 ),
+    iData( 0 ),
+    iDataPtr( 0 ),
+    iSessionId( 0 )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CRtpStpPacket::ConstructL( TUint aPacketSize, TRtpId aSessionId )
+    {
+    iBuf = HBufC8::NewL( aPacketSize );
+    iData = ( TUint8* ) iBuf->Des().Ptr();
+    iSize = 0;
+    iDataPtr = iData;
+    iSessionId = aSessionId;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+// 
+CRtpStpPacket::~CRtpStpPacket()
+    {
+    delete iBuf;
+    }
+
+// ---------------------------------------------------------------------------
+// CRtpStpPacket::Close()
+// works as destructor
+// ---------------------------------------------------------------------------
+//
+void CRtpStpPacket::Close()
+    {
+    delete this;
+    }
+
+// ---------------------------------------------------------------------------
+// CRtpStpPacket::RtpPacketReset()
+// 
+// ---------------------------------------------------------------------------
+//
+void CRtpStpPacket::RtpPacketReset()
+    {
+    iSize = 0;
+    iDataPtr = iData;
+    }
+
+// ---------------------------------------------------------------------------
+// CRtpStpPacket::RtpPacketResetPtr()
+// 
+// ---------------------------------------------------------------------------
+//
+void CRtpStpPacket::RtpPacketResetPtr()
+    {
+    iDataPtr = iData;
+    }
+
+// ---------------------------------------------------------------------------
+// TInt CRtpStpPacket::RtpPacketBuild()
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CRtpStpPacket::RtpPacketBuild( const TRtpSendHeader& aHeader, const TDesC8& aPayloadData )
+    {
+    TUint8* dataP;
+
+    dataP = iData;
+
+    // build the packet content
+    Mem::FillZ( dataP, 4 );
+
+    // Full header indication (F)
+    dataP[0] |= ( 0 << 7 );
+
+    // Marker (M) 
+    dataP[0] |= static_cast<TUint8>( aHeader.iMarker << 6 );
+
+    // Padding bit (P) = 1
+    dataP[0] |= static_cast<TUint8>( aHeader.iPadding << 5 );
+
+    // Checksum indecation (C)  if checkSumInd == 1, need checksum in the header
+    dataP[0] |= static_cast<TUint8>( aHeader.iChecksumInd << 4 );
+
+    // Speech Item toggle indication (S)
+    dataP[0] |= static_cast<TUint8>( aHeader.iSpeechItemToggle << 3 );
+
+    // payload type
+    dataP[0] |= ( aHeader.iPayloadType & 0x07 );
+
+    // sequence number
+    dataP[1] = aHeader.iSeqNum;
+    dataP += 2;
+
+    // Optinal checksum
+    if ( aHeader.iChecksumInd == 1 )
+        {
+        write16( dataP, aHeader.iChecksum );
+        dataP += 2;
+        }
+
+    // copy payload data 
+    Mem::Copy( dataP, aPayloadData.Ptr(), aPayloadData.Length() );
+    iSize = aPayloadData.Length() + ( dataP - iData );
+
+    return 0;
+    }
+
+// ---------------------------------------------------------------------------
+// CRtpStpPacket::RtpPacketProcess()
+// Return Value:
+//    KErrNone if STP packet has been processed OK, or
+//    KErrCorrupt if packet is invalid or some other error has occured
+// ---------------------------------------------------------------------------
+//
+TInt CRtpStpPacket::RtpPacketProcess( TUint8* aBuf, TInt* aLength )
+    {
+    TRtpRecvHeader header;
+    TUint8* dataP;
+
+    dataP = iData;
+
+    // Full header indication (F) 
+    if ( ( dataP[0] & 0x80 ) != 0 )
+        return KErrCorrupt;
+
+    // Marker (M)
+    header.iMarker = ( TUint8 ) ( ( dataP[0] & 0x40 ) >> 6 );
+
+    // Padding bit (P)
+    header.iPadding = ( TUint8 ) ( ( dataP[0] & 0x20 ) >> 5 );
+
+    // Checksum indication (C) 
+    header.iChecksumInd = ( TUint8 ) ( ( dataP[0] & 0x10 ) >> 4 );
+
+    // Speech item toggle indication (S) 
+    header.iSpeechItemToggle = ( TUint8 ) ( ( dataP[0] & 0x08 ) >> 3 );
+
+    // Payload type (PT)
+    header.iPayloadType = ( TUint8 ) ( ( dataP[0] & 0x07 ) );
+
+    // Sequence number
+    header.iSeqNum = ( TUint8 ) ( dataP[1] );
+    dataP += 2;
+
+    // Optinal checksum
+    if ( header.iChecksumInd == 1 )
+        {
+        header.iChecksum = ( TUint16 ) read16( dataP ); 
+        dataP += 2;
+        }
+
+    *aLength = iSize - ( dataP - iData );
+    aBuf = ( TUint8 * ) dataP;
+
+    TPtrC8 buf( aBuf, *aLength );
+
+    if ( iObserver )
+        iObserver->RtpPacketReceived( iSessionId /* streamId */, header, buf );
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Write a 16-bit value as 2 consecutive bytes in MSB order
+// Memory (at least 2 bytes) must have been allocated to pointer
+// before the function is called.
+// ---------------------------------------------------------------------------
+//
+void CRtpStpPacket::write16( TUint8* const aPointer, TUint32 aValue )
+    {
+    // check value range (16 bits)
+    aPointer[0] = ( TUint8 ) ( ( aValue & 0xFF00 ) >> 8 );
+    aPointer[1] = ( TUint8 ) ( aValue & 0x00FF );
+    }
+
+// ---------------------------------------------------------------------------
+// Read a 16-bit value given as 2 consecutive bytes in MSB order
+// Memory (at least 2 bytes) must have been allocated to pointer
+// before the function is called.
+// ---------------------------------------------------------------------------
+//
+TUint32 CRtpStpPacket::read16( const TUint8* const aPointer )
+    {
+    return( aPointer[1] + ( ( TUint32 ) aPointer[0] << 8 ) );
+    }
+
+
+#if !defined ( EKA2 ) && !defined ( RTP_UNIT_TEST )
+// The E32Dll() entry point function
+GLDEF_C TInt E32Dll( TDllReason /*aReason*/ )
+    {
+    return( KErrNone );
+    }
+#endif // EKA2
+
+// ---------------------------------------------------------------------------
+// Function to construct a CRtpPacketExt object. Note that this function
+// is exported at ordinal 1 and is not a member of any class.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MRtpPacketExt* NewL()
+    {
+    return new ( ELeave ) CRtpStpPacket;
+    }
+
+
+// End of File